geosphere::distm()搭配distHaversine计算距离结果不准是什么原因?
问题原因
geosphere包的所有距离计算函数,都要求输入坐标的格式为**c(经度, 纬度)**,你当前传入的坐标顺序是c(纬度, 经度),顺序完全颠倒,才会得到和谷歌地图、NOAA计算器不符的结果,和点位间距不足5英里没有关系。
你之前用勾股定理计算的相对比例符合预期,是因为所有坐标都统一用了反序的数值,差值的相对大小不会变化;但球面距离计算中,经度和纬度对应的地表单位长度并不相同:同度数的纬度差对应的地表距离固定约为111km,而同度数的经度差对应的地表距离会随纬度升高缩短,在你所在的北纬42度区域,1度经度对应的地表距离仅约82km。经纬度顺序传反后,两类长度系数被用反,自然会算出完全错误的结果。
修正代码
将所有坐标的两个数值调换位置即可得到正确结果:
library(geosphere) # 调整为 经度在前,纬度在后的标准输入格式 start <- c(-83.71448, 42.23025) a <- c(-83.71255, 42.30022) b <- c(-83.75135, 42.24302) # 计算起点到a的距离,单位为米 distm(start, a, fun = distHaversine) #> [,1] #> [1,] 7790.75 # 换算后约4.84英里,和NOAA结果一致 # 计算起点到b的距离,单位为米 distm(start, b, fun = distHaversine) #> [,1] #> [1,] 3388.96 # 换算后约2.11英里,和实际相对大小匹配
内容的提问来源于stack exchange,提问作者Sam Firke
相关产品推荐
相关产品推荐

