计算多个经纬度点之间的距离
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()
他们;这正在创建一个单一的无形矢量并失去经度和纬度之间的区别。我怀疑这是错误的原因;向量只有一维,不像矩阵那样是二维的。
我有一个数据集,其中包含参与者家庭和工作地点的经纬度信息,我想在数据集中创建一个新列,其中包含每个参与者家庭和工作地点之间的欧氏距离。我认为这应该是相对简单的,但我看到的所有其他问答似乎都在处理略有不同的问题。
首先,我尝试了 运行 这段代码(使用 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()
他们;这正在创建一个单一的无形矢量并失去经度和纬度之间的区别。我怀疑这是错误的原因;向量只有一维,不像矩阵那样是二维的。