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

3
我有一个数据集,其中包含参与者家庭和工作的纬度和经度信息。我想在数据集中创建一个新列,该列包含每个参与者家庭和工作之间的欧几里得距离。我认为这应该相对简单,但是我看到的所有其他Q&A似乎都在处理略微不同的问题。
首先,我尝试运行以下代码(使用geosphere包):
distm(c(homelong, homelat), c(worklong, worklat), fun=distHaversine)

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

我能否调整此代码以获得我想要的结果,还是应该尝试其他方法?谢谢!


2
展示homelonghomelat等值将会有所帮助。 - user51187286016
2个回答

4

distm() 返回一个距离矩阵,这不是你想要的;你需要两两之间的距离。因此直接使用距离函数(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(),因为这会创建一个无形状的单个向量,并且会失去经度和纬度之间的区别。我怀疑这是错误的原因;该向量只有一个维度,而不是像矩阵那样具有两个维度。

实际上,就这个问题的跟进而言,我如何将新的距离计算永久合并到我的现有数据框中? - Shannon
编辑后,只需将其分配给相同(或新的)变量。 - alistaire

0

您可以将纬度和经度存储在数据框中,然后对数据框进行逐行操作,以获取每行对应的距离。

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.

2
与利用矢量化调用函数相比,这种方法的可扩展性不太好。如果数据很小,时间不重要,那就没问题了。 - alistaire

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接