计算多个经纬度点之间的距离

Calculate distance between multiple latitude and longitude points

我有一个数据集,其中包含参与者家庭和工作地点的经纬度信息,我想在数据集中创建一个新列,其中包含每个参与者家庭和工作地点之间的欧氏距离。我认为这应该是相对简单的,但我看到的所有其他问答似乎都在处理略有不同的问题。

首先,我尝试了 运行 这段代码(使用 geosphere 包):

distm(c(homelong, homelat), c(worklong, worklat), fun=distHaversine)

但出现错误提示“.pointsToMatrix(x) 错误:矢量长度错误,应为 2”,因为(如果我理解正确的话)我正在尝试计算多组两点之间的距离.

我能否调整此代码以获得我要查找的内容,或者是否有其他我应该尝试的内容?谢谢!

您可以将纬度和经度放在数据框中,然后对数据框进行按行操作以获得每一行对应的距离。

library(tidyverse)
library(geosphere)
    
locations <- tibble(
      homelong = c(0, 2),
      homelat = c(2, 5),
      worklong = c(70, 60),
      worklat = c(45, 60)
    )
    


locations %>%
     rowwise() %>% 
     mutate(d = as.numeric(distm(c(homelong, homelat), c(worklong, worklat), fun = distHaversine)))

结果

# A tibble: 2 x 5
# Rowwise: 
  homelong homelat worklong worklat        d
     <dbl>   <dbl>    <dbl>   <dbl>    <dbl>
1        0       2       70      45 8299015.
2        2       5       60      60 7809933.

distm() returns一个距离矩阵,这不是你想要的;你想要成对的距离。所以直接使用距离函数(distHaversine()distGeo()或其他):

library(tidyverse)

locations <- tibble(
    homelong = c(0, 2),
    homelat = c(2, 5),
    worklong = c(70, 60),
    worklat = c(45, 60)
)

locations <- locations %>%
    mutate(
        dist = geosphere::distHaversine(cbind(homelong, homelat), cbind(worklong, worklat))
    )

locations
#> # A tibble: 2 × 5
#>   homelong homelat worklong worklat     dist
#>      <dbl>   <dbl>    <dbl>   <dbl>    <dbl>
#> 1        0       2       70      45 8299015.
#> 2        2       5       60      60 7809933.

请注意,geosphere 函数需要矩阵作为输入,因此您可以 cbind() 您的列放在一起。不要 c() 他们;这正在创建一个单一的无形矢量并失去经度和纬度之间的区别。我怀疑这是错误的原因;向量只有一维,不像矩阵那样是二维的。