r-distHaversine分辨率过高



我正试图计算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

相关内容

  • 没有找到相关文章

最新更新