首页 > 解决方案 > 查找lat-long coordiantes之间的距离需要很长时间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)之间的距离。谢谢

标签: rruntimegeosphere

解决方案


  1. diag在长时间运行的进程上运行仍然会运行所有长时间运行的进程,然后过滤掉除对角线元素之外的所有元素。没有什么可以“通知”内部代码只对特定元素进行操作。

  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

这将为每一行计算一个距离;一行上的纬度/经度与另一行上的纬度/经度没有比较……而且由于您正在查看 a 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))

推荐阅读