1

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

谢谢你的帮助。

4

3 回答 3

2

因为我遇到了同样的问题,所以这是我减少处理时间的解决方法。(这是一个 4 岁的问题!我希望像我这样的人仍然面临这样的问题?)
我建议首先使用关闭函数“gIntersects”仅选择每个 gIntersection 步骤中涉及的线特征,它返回一个逻辑并且比 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)
}`

值得尝试一个真实的数据集,以确认输出是否符合您的需求。

于 2017-08-06T17:58:13.103 回答
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可以用来进行巧妙的查询?这是值得研究的。

于 2013-12-03T13:39:56.443 回答
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以了解哪些步骤占用了您的大部分时间。

于 2013-12-03T13:11:21.290 回答