查找经纬度坐标之间的距离需要很长时间 R

Finding distance between lat-long coordiantes taking a long time R

我目前有一个数据框 (lang.py),其中有成对的纬度和经度坐标。我正在使用 geosphere 包中的 distHaversine() 函数来执行此操作。

这是我的数据样本(有 25200 行):

最初我试过:

lang.py$distance = with(lang.py, distm(cbind(lon_x, lat_x), cbind(lon_y, lat_y), distHaversine))

但这花了很长时间 运行 所以我试图只查看前 4 行的输出,它输出一个 4x4 矩阵的值,而不是仅仅输出一列距离值所以我假设对于整个数据集,我的代码正在输出一个 25200x25200 距离值矩阵。

例如,这是前 4 行输出的内容:

with(lang.py[1:4,], distm(cbind(lon_x, lat_x), cbind(lon_y, lat_y), distHaversine))

为了解决这个问题,我尝试使用矩阵的对角线来获得单列值:

lang.py$distance = diag(with(lang.py, distm(cbind(lon_x, lat_x), cbind(lon_y, lat_y), distHaversine)))

但这也花了很长时间 运行。关于如何提高效率的任何想法?我试图找出 (lat_x、lon_x) 和 (lat_y、lon_y) 之间的距离。谢谢

  1. 运行 diag 在 long-运行 进程上仍然运行 long-[=51] 的 all =] 处理然后过滤掉除对角线元素以外的所有元素。没有什么可以“通知”内部代码只对特定元素进行操作。

  2. 第一行比 diag 更简单,因为每一列中的所有数字(在此示例中)都是相同的。

  3. 如果你查看 geosphere::distm 的源代码,你会发现它正在计算第一个参数的第一行之间的距离(实际上是 cbind(lon_x, lat_x)[1,])第二个参数的所有行;然后是第一个 arg 的第二行和第二个 arg 的所有行。您在列中看到相同值矩阵的原因是在上面的示例中,您的 lon_x/lat_x 都是相同的。这产生了一个距离矩阵,而不是一次两点之间的距离。

好像不需要距离矩阵,只需要距离.

with(lang.py, distHaversine(cbind(lon_x, lat_x), cbind(lon_y, lat_y)))
# [1]  4042785  5417756 13819986

这将为每一行计算一个距离;一行中的 lat/lon 与另一行中的 lat/lon 没有进行比较……并且由于您正在查看 data.frame,这对我来说很有意义。


数据,以便其他人可以尝试使用您的代码(这应该是您提供的,而不是我):

lang.py <- structure(list(lat_x = c(35, 35, 35), lon_x = c(66, 66, 66), lat_y = c(41, 36.5, -13.92), lon_y = c(20, 5, -171.83)), class = "data.frame", row.names = c(NA, -3L))