【问题标题】:Finding distance between lat-long coordiantes taking a long time R查找经纬度坐标之间的距离需要很长时间 R
【发布时间】:2020-11-14 11:11:49
【问题描述】:

我目前有一个数据框 (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)之间的距离。谢谢

【问题讨论】:

  • 请不要发布代码/数据/错误的图像:它不能被复制或搜索 (SEO),它会破坏屏幕阅读器,并且它可能不适合某些移动设备。参考:meta.stackoverflow.com/a/285557(和xkcd.com/2116)。请直接包含代码、控制台输出或数据(例如,dput(head(x))data.frame(...))。

标签: r runtime geosphere


【解决方案1】:
  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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-01
    • 1970-01-01
    • 2011-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-05
    相关资源
    最近更新 更多