gDistance 的替代方法以及如何计算行进距离而不是欧几里得

Alternative to gDistance and how to compute travel distance instead euclidean

我有两个问题,

第一个;我在网络中有两个不同的点数据框,比方说商店的位置和犯罪的位置。我想计算距离矩阵并想看看哪个犯罪更接近哪个商店,反之亦然。我写了一个代码并使用 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

解决方案就在我眼前,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。 运行 通常需要一个小时,但需要几分钟。我做了几个随机示例来确保它有效。