Объединить список объектов пространственного многоугольника в 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 буферами (или функциями)? (Этот шейп-файл будет затем использоваться в функции 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вместо использования gBufferс byid = TRUE?
Cengel

Ответы:

12

Ниже приведен список SpatialPolygonsобъектов, в котором показано, как построить фрейм данных пространственных полигонов с одним элементом на исходный SpatialPolygonsобъект.

Образцы данных: splэто список из 12 SpatialPolygonsобъектов - убедитесь, что ваш объект дает те же результаты, что и этот, и протестируйте на небольшом образце перед запуском на 30000:

> 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:

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

FALSEФлаг просто останавливается R пытается изменить пространственные и не пространственные данные совпасть. Возможно, вы захотите поместить размеры буфера во фрейм данных или что-то в этом роде.

Работа сделана.

Spacedman
источник
18

Чтобы объединить список пространственных объектов, вы можете сделать:

library(raster)
m <- do.call(bind, buff.pts) 
Роберт Хейманс
источник
2

Вы можете использовать аргумент makeUniqueIDs в rbind, если ваши полигоны не имеют уникальных идентификаторов.

 library(purrr)

list(buff.pts, makeUniqueIDs = T) %>% 
  flatten() %>% 
  do.call(rbind, .)
ColinTB
источник