合并R中的空间多边形对象列表


16

我有一个使用该函数构建的空间缓冲区(30000个缓冲区)列表lapply

buff.pts <- lapply(1:nrow(pts.prj), FUN=function(l){
  buff <- gBuffer(pts.prj[l,], width=1000) ## 1km
  return(buff)
}))

> head(buff.pts)
[[1]]
class       : SpatialPolygons 
features    : 1 
extent      : 307941.8, 311941.8, 4994518, 4998518  (xmin, xmax, ymin, ymax)
coord. ref. : +proj=tmerc +lat_0=0 +lon_0=-73.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs +towgs84=0,0,0 

[[2]]
class       : SpatialPolygons 
features    : 1 
extent      : 307226, 311226, 4991153, 4995153  (xmin, xmax, ymin, ymax)
coord. ref. : +proj=tmerc +lat_0=0 +lon_0=-73.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs +towgs84=0,0,0 

从该列表中,如何合并所有空间缓冲区以获得具有30000个缓冲区(或要素)的shapefile?(然后,此shapefile将在函数中aggregate用于按属性汇总空间多边形。)

我测试了此代码,但获得了以下错误消息:

test <- as.data.frame(do.call("rbind", buff.pts))
Error in as.data.frame(do.call("rbind", buff.pts)) : 
  error in evaluating the argument 'x' in selecting a method for function 'as.data.frame': Error in validObject(res) : 
  invalid class SpatialPolygons object: non-unique Polygons ID slot values

3
您需要使用lapply而不是使用gBufferwith 来构建缓冲区的任何原因byid = TRUE吗?
cengel '16

Answers:


12

给定一个SpatialPolygons对象列表,下面介绍如何构建每个原始SpatialPolygons要素具有一个要素的空间多边形数据框。

样本数据:spl是12个SpatialPolygons对象的列表-确保您的对象给出的结果与此相同,并在运行30,000之前对一个小的样本进行测试:

> length(spl)
[1] 12
> class(spl)
[1] "list"
> class(spl[[1]])
[1] "SpatialPolygons"
attr(,"package")
[1] "sp"

您想要创建一个Spatial Polygons具有所有要素的对象,然后制作一个“空间多边形”数据框:

> joined = SpatialPolygons(lapply(spl, function(x){x@polygons[[1]]}))
> plot(joined)

这会polygons从对象获取第一个插槽(并且应该只有一个,因为每个列表元素当前都是一个要素),然后构造一个Polygons对象的列表,您可以SpatialPolygons通过该列表来生成多要素SpatialPolygons。绘制此图,您将看到所有功能。接下来,如果要另存为shapefile,则需要添加一些数据。在没有其他条件的情况下,我创建一个简单的1到12 ID列:

> jdata = SpatialPolygonsDataFrame(Sr=joined, data=data.frame(i=1:12),FALSE)

FALSE标志只是停止了R,试图重新排列空间和非空间数据以进行匹配。您可能需要将缓冲区大小放入数据帧或其他内容中。

任务完成。


18

要合并空间对象列表,您可以执行以下操作:

library(raster)
m <- do.call(bind, buff.pts) 

2

如果多边形没有唯一的ID,则可以在rbind中使用makeUniqueIDs参数。

 library(purrr)

list(buff.pts, makeUniqueIDs = T) %>% 
  flatten() %>% 
  do.call(rbind, .)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.