gDistance的替代品,以及如何计算行驶距离而不是欧氏距离

问题描述 投票:0回答:1

我有两个问题,

第一个;我在网络中有两个不同的点数据框架,比方说商店的位置和犯罪的位置。我想计算距离矩阵,想知道哪个犯罪更靠近哪个商店,反之亦然。我已经编写了一个代码,并使用gDistance()可以正常工作,但是,当有200K点与3K点时,需要一点时间。我想知道gDistance的替代方案。

第二个问题,gDistance使用欧氏距离也可以在示例代码中看到。如果我想使用行驶距离或出租车乘车距离怎么办,任何人都对如何计算这个有意见?

我已使用spatstat程序包创建随机点并将其转换为spatialpointsdataframe。但这只是为了说明。

library(spatstat)

set.seed(123)
randomSp=function(n1){
  Ra1=runiflpp(n1, as.linnet(chicago)) 
  Ra1df=as.data.frame(Ra1)
  Ra1df$xco=coords(Ra1)[,1]
  Ra1df$yco=coords(Ra1)[,2]
  Ra1df2=dplyr::select(Ra1df,x,y,xco,yco)
  coordinates(Ra1df2) = c("x", "y")
  proj4string(Ra1df2)="+proj=utm +zone=17 +datum=NAD83 +units=m +no_defs +ellps=GRS80 +towgs84=0,0,0"
  return(Ra1df2)
}

B=Sys.time()

p1=randomSp(25000)
p2=randomSp(200)
p2@data$id=c(1:dim(p2)[1])

Xroad12=gDistance(p1, p2, byid = TRUE)  ## for each point should be belong to a road, using shordest-distance we will figure it out 
XRid=XRnume=NULL
for(i in 1:dim(p1)[1]){
  XRid[i]=Xroad12[which.min(Xroad12[,i]),i]
  XRnume[i]=which.min(Xroad12[,i])
}  ## computing shortest distance to closest intersection
p1@data$Swid=XRnume



plot(as.linnet(chicago))
plot(p2,col="red",add=T)
plot(p2[p2$id==3,],add=T,col="blue")
plot(p1,add=T)
points(p1[p1$Swid==3,],col="green")



E=Sys.time()

E-B
r distance spatial euclidean-distance
1个回答
0
投票

解决方案在我眼前,p1和p2是spatialpointsdataframe对象

p1ppp=as.ppp(p1)
p2ppp=as.ppp(p2)

XR12=nncross(p1ppp,p2ppp)
p1@data$Swid=XR12$which
p1@data$dist=XR12$dist

我已经为我的常规数据集尝试了200K。通常需要一个小时才能运行,但要花几分钟。我做了一些随机的例子来确保它能正常工作。

© www.soinside.com 2019 - 2024. All rights reserved.