查找经纬度坐标之间的距离需要很长时间 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) 之间的距离。谢谢
运行 diag
在 long-运行 进程上仍然运行 long-[=51] 的 all =] 处理然后过滤掉除对角线元素以外的所有元素。没有什么可以“通知”内部代码只对特定元素进行操作。
第一行比 diag
更简单,因为每一列中的所有数字(在此示例中)都是相同的。
如果你查看 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))
我目前有一个数据框 (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) 之间的距离。谢谢
运行
diag
在 long-运行 进程上仍然运行 long-[=51] 的 all =] 处理然后过滤掉除对角线元素以外的所有元素。没有什么可以“通知”内部代码只对特定元素进行操作。第一行比
diag
更简单,因为每一列中的所有数字(在此示例中)都是相同的。如果你查看
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))