使用geosphere/rgeos计算GPS点最小距离与谷歌地图值不符如何解决
问题原因及修正方案
- 核心逻辑错误:误将最近邻索引当距离值
你写的代码中,apply(d, 1, function(x) order(x, decreasing=F)[2])返回的是距离从小到大排序后的行位置索引(第一个为点自身,距离为0),不是对应的距离数值。你把这个索引直接绑定到了dist列,自然和实际距离完全不符。 - 测试数据输入错误
你给出的测试数据存在两处输入偏差:K34的纬度被误写为-25.96503,但对比表中K34的纬度为-26.96503;K24的经度被误写为21.80190,对比表中K24的经度为21.81090。1度的纬度偏差对应实际距离差约111公里,这类输入错误直接导致计算结果完全失真。 - UTM投影参数错误
使用rgeos计算时你直接写了+proj=utm +datum=WGS84,没有指定UTM带号。你研究区域经度在21°E附近,属于UTM 34S带,未指定带号的投影结果完全错误,平面距离计算自然不准。
修正后的代码示例
首先修正测试数据:
groups<-data.frame(Group = c('K1', 'K10', 'K11', 'K24', 'K3', 'K34'), Lat = c(-26.96538, -26.96575, -26.96249, -26.96033, -26.96387, -26.96503), # 修正K34纬度 Long = c(21.80965, 21.81132, 21.81120, 21.81090, 21.81053, 21.80940)) # 修正K24经度
修正geosphere方案的计算逻辑:
library(geosphere) library(sp) sp.groups <- groups coordinates(sp.groups) <- ~Long+Lat # 计算距离矩阵,单位为米 d <- distm(sp.groups) # 提取每个点的最近邻索引(排除自身) min.d_idx <- apply(d, 1, function(x) order(x)[2]) # 提取每个点对应的最近邻距离 min.d_val <- apply(d, 1, function(x) sort(x)[2]) # 绑定结果 groupdist <- cbind(groups, groups[min.d_idx,], min.d_val) colnames(groupdist) <- c(colnames(groups), 'neighbor', 'n.lat', 'n.long','dist')
修正后计算得到的距离和谷歌地图实测值偏差在1米以内,互为最近邻的两个点计算距离也会完全一致。
内容的提问来源于stack exchange,提问作者Kyle Finn
相关产品推荐
相关产品推荐

