我正在使用gIntersection从SpatialPolygonsDataFrame中按多边形一个剪辑全国范围的路径网络。我循环遍历每个多边形,剪切路径网络,计算剪切路径的长度,并将其保存到名为path.lgth的数据框中:
poly<-readShapePoly("C:\\temp\\polygons.shp")
paths<-readShapeLines("C:\\temp\\paths.shp")
#loop through all polygons clipping lines
path.lgth<-data.frame()
for (i in 1:length(poly)){
clip<-gIntersection(paths,poly[i,])
lgth<-gLength(clip)
vid<-poly@data[i,3]
data<-cbind(vid,lgth)
path.lgth<-rbind(path.lgth,data)
print(i)
}
vid行只提取多边形ID以保存在具有路径长度的数据帧中。
我的问题是第一个多边形(大约12分钟!)需要花费太长时间。有没有办法加快速度?我不确定gIntersection在数学上是做什么的(它是否检查所有路径以查看它们是否与多边形重叠?)。我简化了路径,因此它们只是一个功能。
感谢您的帮助。
答案 0 :(得分:2)
因为我遇到了同样的问题,所以我的解决方法是缩短处理时间。
(这是一个4年前的问题!我希望有些人 - 比如我 - 仍然面临着这样的问题吗?)
我建议首先选择每个gIntersection步骤中涉及的行功能,使用关闭功能&#39; gIntersects&#39;,它返回一个逻辑,比gIntersection快得多!
因此,您的代码就是这样:
poly<-readShapePoly("C:\\temp\\polygons.shp")
paths<-readShapeLines("C:\\temp\\paths.shp")
#loop through all polygons clipping lines
path.lgth<-data.frame()
for (i in 1:length(poly)){
# FIRST gIntersects to subset the features you need
LogiSubPaths <- gIntersects(paths, poly[i, )[1,] #The result is a dataframe with one row
clip <- gIntersection(path[LogiSubPaths,],poly[i, ]) #Subset the features that you need to gIntersect the current polygon 'i'
lgth <- gLength(clip)
vid <- poly@data[i,3]
data <- cbind(vid,lgth)
path.lgth <- rbind(path.lgth,data)
print(i)
}`
值得尝试一下真实数据集,以确认输出符合您的需求。
答案 1 :(得分:1)
如果我理解正确,你有N个多边形和M个路径,对吗?对于每个多边形,你想要路径的总和,对吗?
然后,首先将所有行合并为一个要素。然后使用byid = TRUE
立即交叉 。这样你摆脱了循环:
paths2 <- gLineMerge(paths)
path.crop <- gIntersection(poly, paths2, byid = TRUE)
path.lgth <- gLength(path.crop, byid = TRUE)
您应该获得由多边形的id标记的长度。我不确定那些多边形的ID是否正确 - 检查path.crop
中的多边形是否正确。如果没有,则需要将id
gIntersection
参数设置为多边形的ID。
我不确定sp::over
是否可以用来做出聪明的查询?这值得一些检查。
答案 2 :(得分:0)
要做的第一件事是避免在每次通过循环时重新分配内存
而不是path.lgth<-rbind(path.lgth,data)
,在循环之前初始化:
path.lgth<-matrix(nrow=length(poly), ncol=2)
然后在循环中,转储cbind
(粗略矫枉过正)并执行
path.lgth[i,] <- c(vid,lgth)
现在关于总体执行时间 - 您没有说明您可用的CPU(和RAM)。但请查看Rprof
以了解哪些步骤占用了大部分时间。