繁体   English   中英

计算 R dataframe 中两个经纬度地理坐标之间的距离

[英]Calculating the distance between two latitude and longitude Geocordinate in a R dataframe

我想计算 dataframe 中两个经纬度位置之间的距离

df <- tibble("lat1"=c(0,1,2),"lon1"=c(0,1,2),"lat2"=c(90,91,92),"lon2"=c(90,91,92))

df %>% 
dplyr::mutate(distance_trip=mapply(FUN = distHaversine,c(lat1, lon1),c(lat2, lon2)))

我得到的错误是:

错误: mutate()distance_trip有问题。 distance_trip = mapply(FUN = distHaversine, c(lat1, lon1), c(lat2, lon2)) x 向量的长度错误,应为 2 运行rlang::last_error()以查看错误发生的位置。

不知道为什么我无法将 function 应用于数据框。

这里发生了一些事情:

  1. geosphere::distHaversine是矢量化的,(矩阵化?),所以如果我们给它matrix输入,我们不需要使用mapply一次一行地做。 这会快得多。

  2. c()只是把东西粘在一起。 c(lat1, lon1)将是0, 1, 2, 0, 1, 2一个接一个。 我们需要cbind来制作一个矩阵。 (我知道您使用mapply的目的,但是长c(lat1, lon1)向量是您传递给mapply内容,相反,您需要分别传递lat1lon1以及c()各个项目在FUN内部......但matrix方法会更好。)

  3. 尽管“lat, lon”是口语用法,但几乎所有函数都需要“lon, lat”,因为经度更像“x”,纬度更像“y”,并且(x, y)范式成立。

  4. 最大纬度为 90,但您的lat2有值 91 和 92,如果不解决会导致错误。

修复所有这些,我们可以使用:

df <- tibble(
  "lat1"=c(0,1,2),
  "lon1"=c(0,1,2),
  "lat2"=4:6,  ## valid latitudes
  "lon2"=c(90,91,92)
)

library(dplyr)
library(geosphere)

df %>% 
  mutate(distance_trip = geosphere::distHaversine(
    cbind(lon1, lat1), cbind(lon2, lat2)
  ))
# # A tibble: 3 × 5
#    lat1  lon1  lat2  lon2 distance_trip
#   <dbl> <dbl> <int> <dbl>         <dbl>
# 1     0     0     4    90     10018754.
# 2     1     1     5    91     10009053.
# 3     2     2     6    92      9995487.

这是使它与mapply工作的方法——写起来有点尴尬,而且也会更慢:(

df <- tibble(
  "lat1"=c(0,1,2),
  "lon1"=c(0,1,2),
  "lat2"=4:6,  ## valid latitudes
  "lon2"=c(90,91,92)
)
df %>% 
  mutate(distance_trip = mapply(
    FUN = function(x1, y1, x2, y2) {
      distHaversine(c(x1, y1), c(x2, y2))
    },
    x1 = lon1, y1 = lat1, x2 = lon2, y2 = lat2
  ))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM