循环中的rgeos gIntersection需要很长时间才能剪切路径网络

时间:2013-12-03 12:46:47

标签: r gis spatial spatial-query

我正在使用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在数学上是做什么的(它是否检查所有路径以查看它们是否与多边形重叠?)。我简化了路径,因此它们只是一个功能。

感谢您的帮助。

3 个答案:

答案 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个路径,对吗?对于每个多边形,你想要路径的总和,对吗?

解决方案1 ​​

然后,首先将所有行合并为一个要素。然后使用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。

解决方案2

我不确定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以了解哪些步骤占用了大部分时间。