从 R 中的坐标列表创建距离矩阵

sru*_*y52 3 r coordinates euclidean-distance distance-matrix

我有一个 csv 文件,其中包含 2000 多个农场的坐标位置列表,结构如下;

FarmID | Latidue | Longitude |  
------ |---------|-----------|  
   1   |    y1   |     x1    |
   2   |    y2   |     x2    |
   3   |    y3   |     x3    |
Run Code Online (Sandbox Code Playgroud)

....... 我想从这个数据中创建一个欧几里得距离矩阵,显示所有农场对之间的距离,所以我得到一个结果矩阵,如:

     1     |    2    |     3     |
-----------|---------|-----------|
1    0     |  2.236  |   3.162   |
2  2.236   |    0    |   2.236   |
3  3.162   |  2.236  |     0     |
Run Code Online (Sandbox Code Playgroud)

有了更多的农场和数据框中的坐标,我需要能够以某种方式迭代所有农场对并创建一个像上面那样的距离矩阵。任何有关如何在 R 中执行此操作的帮助将不胜感激。谢谢!

thc*_*thc 8

这是一个简单的例子:

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
Run Code Online (Sandbox Code Playgroud)


kda*_*ras 5

您有一个用纬度和经度测量的地理坐标列表。这些坐标以度为单位进行测量,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)
Run Code Online (Sandbox Code Playgroud)

PS:地球上的欧几里得距离,但不遵循地球表面,也是可能的,但又是不同的计算。

PPS:请注意,在近似平面的小区域上,这些考虑因素并不重要。对于全球分析来说,他们确实如此。