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。 运行 通常需要一个小时,但需要几分钟。我做了几个随机示例来确保它有效。
我有两个问题,
第一个;我在网络中有两个不同的点数据框,比方说商店的位置和犯罪的位置。我想计算距离矩阵并想看看哪个犯罪更接近哪个商店,反之亦然。我写了一个代码并使用 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。 运行 通常需要一个小时,但需要几分钟。我做了几个随机示例来确保它有效。