r - 查找lat-long coordiantes之间的距离需要很长时间R
问题描述
我目前有一个数据框(lang.py),其中有一对纬度和经度坐标。我正在使用 geosphere 包中的 distHaversine() 函数来执行此操作。
最初我尝试过:
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
在长时间运行的进程上运行仍然会运行所有长时间运行的进程,然后过滤掉除对角线元素之外的所有元素。没有什么可以“通知”内部代码只对特定元素进行操作。比
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
这将为每一行计算一个距离;一行上的纬度/经度与另一行上的纬度/经度没有比较……而且由于您正在查看 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))
推荐阅读
- ios - 为什么 iOS 14 ATT 提示无法在模拟器上运行?
- python - scipy 中的 st.ttest_ind 返回 p 值为 0.0
- c++ - const_cast:仅当原始变量为 const 时,修改以前的 const 值才是未定义的
- python - 如果两个列是相同的 Pandas,则在它们之间添加列
- scrapy - XPath 选择器返回空列表
- visual-studio-2019 - Visual Studio 2019 - Angular 9.1.9 - 没有实时重新加载
- javascript - google fitBounds 无法按预期工作
- google-cloud-dataflow - 状态和输出的原子性
- android - Kotlin 1.4 是否放弃对 Coroutine Actors 的支持
- python - python中隔离林是否必须设置污染值?