从 R 中的坐标列表创建距离矩阵
Creating a distance matrix from a list of coordinates in R
我有一个 csv 文件,其中包含 2000 多个农场的坐标位置列表,结构如下;
FarmID | Latidue | Longitude |
------ |---------|-----------|
1 | y1 | x1 |
2 | y2 | x2 |
3 | y3 | x3 |
....... 我想根据显示所有农场对之间距离的数据创建一个欧几里得距离矩阵,这样我得到的结果矩阵如下:
1 | 2 | 3 |
-----------|---------|-----------|
1 0 | 2.236 | 3.162 |
2 2.236 | 0 | 2.236 |
3 3.162 | 2.236 | 0 |
由于数据框中有更多的农场和坐标,我需要能够以某种方式遍历所有农场对并创建一个像上面那样的距离矩阵。任何有关如何在 R 中执行此操作的帮助将不胜感激。谢谢!
这是一个简单的例子:
farms <- data.frame(lat=runif(3), lng=runif(3))
dist(farms, diag=T, upper=T)
1 2 3
1 0.0000000 0.9275424 0.6092271
2 0.9275424 0.0000000 0.3891079
3 0.6092271 0.3891079 0.0000000
您有一个 地理 坐标列表,其中包含纬度和经度测量值。这些坐标以度为单位测量,1 度距离(尤其是经度)并不等于相同的实际距离(以米为单位),具体取决于您在地球上的位置(赤道比两极大得多)。
@thc 的解决方案确实计算了欧几里德距离,但以度数和 XY 平面为单位。一旦有关测量地点的信息丢失,它们在地理上就变得毫无意义,因此它可能会产生误导,因为很少有情况您真的想获得这些值。
您可能需要 geodesic 距离,如此处计算(使用 geodist 包和更现实的 lon lat 值)并与欧几里德度数距离进行比较:
library(geodist)
farms <- data.frame(latitude=runif(3,min=-90,max=90), longitude=runif(3,min=-180,max=180))
#euclidean distances in degrees:
dist(farms, diag=T, upper=T)
#geodesic distances:
geodist(farms)
PS: 地球上的欧几里德距离,但不遵循地球表面,也是可能的,但又是不同的计算。
PPS:请注意,在近似平面的小区域上,这些注意事项无关紧要。对于全局分析,他们会这样做。
我有一个 csv 文件,其中包含 2000 多个农场的坐标位置列表,结构如下;
FarmID | Latidue | Longitude |
------ |---------|-----------|
1 | y1 | x1 |
2 | y2 | x2 |
3 | y3 | x3 |
....... 我想根据显示所有农场对之间距离的数据创建一个欧几里得距离矩阵,这样我得到的结果矩阵如下:
1 | 2 | 3 |
-----------|---------|-----------|
1 0 | 2.236 | 3.162 |
2 2.236 | 0 | 2.236 |
3 3.162 | 2.236 | 0 |
由于数据框中有更多的农场和坐标,我需要能够以某种方式遍历所有农场对并创建一个像上面那样的距离矩阵。任何有关如何在 R 中执行此操作的帮助将不胜感激。谢谢!
这是一个简单的例子:
farms <- data.frame(lat=runif(3), lng=runif(3))
dist(farms, diag=T, upper=T)
1 2 3
1 0.0000000 0.9275424 0.6092271
2 0.9275424 0.0000000 0.3891079
3 0.6092271 0.3891079 0.0000000
您有一个 地理 坐标列表,其中包含纬度和经度测量值。这些坐标以度为单位测量,1 度距离(尤其是经度)并不等于相同的实际距离(以米为单位),具体取决于您在地球上的位置(赤道比两极大得多)。
@thc 的解决方案确实计算了欧几里德距离,但以度数和 XY 平面为单位。一旦有关测量地点的信息丢失,它们在地理上就变得毫无意义,因此它可能会产生误导,因为很少有情况您真的想获得这些值。
您可能需要 geodesic 距离,如此处计算(使用 geodist 包和更现实的 lon lat 值)并与欧几里德度数距离进行比较:
library(geodist)
farms <- data.frame(latitude=runif(3,min=-90,max=90), longitude=runif(3,min=-180,max=180))
#euclidean distances in degrees:
dist(farms, diag=T, upper=T)
#geodesic distances:
geodist(farms)
PS: 地球上的欧几里德距离,但不遵循地球表面,也是可能的,但又是不同的计算。
PPS:请注意,在近似平面的小区域上,这些注意事项无关紧要。对于全局分析,他们会这样做。