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

6

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

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


一个可重现的示例数据集会很好。 - kdarras
2个回答

10
这里有一个简单的例子:
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

5

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

@thc的解决方案确实计算了欧几里得距离,但这些距离是以度数和XY平面表示的。一旦失去了它们被测量的位置信息,它们就变得在地理上毫无意义,因此它可能会误导人,因为很少有情况需要获取这些值。

您可能想要使用大地线距离,在此处进行计算(使用geodist包和更现实的经纬度值),并与欧几里得度数距离进行比较:

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:请注意,在大致平坦的小区域内,这些考虑因素并不重要。但对于全球范围的分析,则需要考虑这些因素。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接