我正试图计算R中两个WGS84点之间的距离。但是结果比实际距离太高。
point1 <- c(34.94821,29.55805)
point2 <- c(34.79130,31.25181)
point_mat <- matrix(c(point1, point2), ncol =2 )
distHaversine(point_mat, r=6378137)
结果是638845.2,但城市之间的实际距离是188,94公里
试着理解geosphere::distHaversine()
函数输入的格式。
原则上,你可以定义点";直接";并且不需要将它们转换成矩阵形式即distHaversine(point1, point2)
。该函数默认为以米为单位的地球半径。因此,您可以避免指定地球半径(或注入与公里相关的或其他等效的距离单位(。
例如
point1 <- c(34.94821,29.55805)
point2 <- c(34.79130,31.25181)
geosphere::distHaversine(point1,point2, r=6378137)
geosphere::distHaversine(point1,point2) # radius defaults to metres
两次通话收益率:
[1] 189149.3
以米为单位。因此,约189,15km,接近您的预期结果。
如果使用矩阵形式,请确保矩阵构造正确。
point1
[1] 34.94821 29.55805
point2
[1] 34.79130 31.25181
matrix(c(point1, point2), ncol =2 )
[,1] [,2]
[1,] 34.94821 34.79130
[2,] 29.55805 31.25181
你看到点的经度/纬度顺序(对你来说(被破坏了,而你获得的值是"0";其他";点(比你预期的要多(。
在这种情况下,您将不得不";负载";与byrow=TRUE
保持经度/纬度同步的矩阵:
matrix(c(point1, point2), byrow = TRUE, ncol = 2)
[,1] [,2]
[1,] 34.94821 29.55805
[2,] 34.79130 31.25181
geosphere::distHaversine(matrix(c(point1, point2), byrow = TRUE, ncol = 2) )
[1] 189149.3
在许多用例中,我们对列出";"开始";以及";结束";经度/纬度。您可以使用cbind()
来定义distHaversine()
所需的输入,如下所示:
# simulate a dataframe of positions given by start and end points
df <- data.frame(
LON1 = c(34.94821, 34.94821)
, LAT1 = c(29.55805, 34.79130)
, LON2 = c(34.79130, 34.79130)
, LAT2 = c(31.25181, 29.55805)
)
library(dplyr) # tabular data handling and pipe
df %>%
mutate(DIST = geosphere::distHaversine(
cbind(LON1, LAT1)
, cbind(LON2, LAT2)
)
)
LON1 LAT1 LON2 LAT2 DIST
1 34.94821 29.55805 34.7913 31.25181 189149.3
2 34.94821 34.79130 34.7913 29.55805 582750.0