4

我有一个 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 中执行此操作的帮助将不胜感激。谢谢!

4

2 回答 2

9

这是一个简单的例子:

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
于 2017-05-11T02:40:27.717 回答
0

您有一个用纬度和经度测量的地理坐标列表。这些坐标以度为单位,1 度的距离(尤其是经度)不等于相同的实际距离(以米为单位),具体取决于您在地球上的位置(赤道比两极大得多)。

@thc 的解决方案确实计算了欧几里德距离,但以度数和 XY 平面为单位。一旦有关测量地点的信息丢失,它们在地理上就变得毫无意义,因此它可能会产生误导,因为很少有您真正想要获得这些值的情况。

您可能需要测地线距离,如此处计算(使用包 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:请注意,对于近似平面的小区域,这些考虑因素无关紧要。对于全局分析,它们确实如此。

于 2021-11-18T01:45:21.570 回答