首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用geosphere计算GPS点之间的最小距离会给出不准确的值

使用geosphere计算GPS点之间的最小距离会给出不准确的值
EN

Stack Overflow用户
提问于 2021-08-22 20:05:53
回答 1查看 69关注 0票数 0

我正在尝试计算R中一系列GPS点的最近邻之间的平均距离。我找到了两个代码来获得这些值。但它似乎没有给出以米为单位的正确距离。当我与谷歌地图对比时,我发现它离我们太远了。

我找到了这个答案:R - Finding closest neighboring point and number of neighbors within a given radius, coordinates lat-long

代码语言:javascript
复制
library(geosphere)
sp.groups <- groups
coordinates(sp.groups) <- ~Long+Lat
class(sp.groups)
d<- distm(sp.groups)
min.d<- apply(d, 1, function(x) order(x, decreasing=F)[2])
min.d
mean(min.d)
groupdist<- cbind(groups, groups[min.d,], apply(d, 1, function(x) order(x, decreasing=F)[2]))
colnames(groupdist)<- c(colnames(groups), 'neighbor', 'n.lat', 'n.long','dist')

在这里使用了包rgeos,但它给出了相同的结果:Calculate the distance between two points of two datasets (nearest neighbor)

代码语言:javascript
复制
library(rgeos)
sp.groups <- groups
coordinates(sp.groups) <- ~Long+Lat
proj4string(sp.groups) <-CRS("+proj=utm +datum=WGS84")
class(sp.groups)
d<- gDistance(sp.groups, byid=TRUE)
min.d<- apply(d, 1, function(x) order(x, decreasing=F)[2])
min.d
mean(min.d)
groupdist<- cbind(groups, groups[min.d,], apply(d, 1, function(x) order(x, decreasing=F)[2]))
colnames(groupdist)<- c(colnames(groups), 'neighbor', 'n.lat', 'n.long','dist')

当我去谷歌地球上查看的时候,距离可能会很远。它甚至为最近的邻居提供了160-200m的不同值。此外,一些最近的邻居没有相同的距离值,请参见K11和K3,然后参见K3和K11。以下是我获得的结果,并添加了来自Google Maps的期望值:

代码语言:javascript
复制
Group Lat        Long      neighbor  n.lat      n.long    dist  GMaps
K1    -26.96538  21.80965  K34       -26.96503  21.80940  27    44
K10   -26.96575  21.81132  K1        -26.96538  21.80965  1     172
K11   -26.96249  21.81120  K3        -26.96387  21.81053  22    166
K24   -26.96033  21.81090  K11       -26.96249  21.81120  3     240
K3    -26.96387  21.81053  K11       -26.96249  21.81120  3     166
K34   -26.96503  21.80940  K1        -26.96538  21.80965  1     44

怎么啦?

我的数据

代码语言:javascript
复制
groups<-data.frame(Group = c('K1', 'K10', 'K11', 'K24', 'K3', 'K34'), 
Lat = c(-26.96538, -26.96575, -26.96249, -26.96033, -26.96387, -25.96503), 
Longitude = c(21.80965, 21.81132, 21.81120, 21.80190, 21.81053, 21.80940))
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-08-22 21:16:32

我不确定您在这里试图计算的是什么,但列distance只是指具有最小距离的点的位置/编号。我添加了一个具有实际最小距离的数字,看起来与您预期的结果相似。

代码语言:javascript
复制
library(geodist, include.only = NULL)
library(sp, include.only = NULL)

groups <- data.frame(Group = c('K1', 'K10', 'K11', 'K24', 'K3', 'K34'), 
                     Lat   = c(-26.96538, -26.96575, -26.96249, -26.96033, -26.96387, -25.96503), 
                     Long  = c(21.80965, 21.81132, 21.81120, 21.80190, 21.81053, 21.80940))

sp.groups <- groups
sp::coordinates(sp.groups) <- ~Long+Lat

# mindistance Matrix
d <- geodist::geodist(groups, measure = "cheap")


# position of minimum distance
diag(d) <- Inf
min.d <- max.col(-d)
min.d
#> [1] 2 1 5 5 3 4


groupdist <- cbind(groups, groups[min.d,], min.d)
colnames(groupdist) <- c(colnames(groups), 'neighbor', 'n.lat', 'n.long','closest_to')

# get minimum distance for each pair of coordinates
groupdist$distance <- d[cbind(seq_along(min.d), min.d)]
groupdist
#>     Group       Lat     Long neighbor     n.lat   n.long closest_to    distance
#> 2      K1 -26.96538 21.80965      K10 -26.96575 21.81132          2    171.1554
#> 1     K10 -26.96575 21.81132       K1 -26.96538 21.80965          1    171.1554
#> 5     K11 -26.96249 21.81120       K3 -26.96387 21.81053          5    167.2225
#> 5.1   K24 -26.96033 21.80190       K3 -26.96387 21.81053          5    944.4119
#> 3      K3 -26.96387 21.81053      K11 -26.96249 21.81120          3    167.2225
#> 4     K34 -25.96503 21.80940      K24 -26.96033 21.80190          4 110613.1362

由reprex包创建于2021-08-22 (v2.0.1)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68884778

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档