Об’єднайте список об’єктів просторового багатокутника в 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об’єктів - переконайтеся, що ваш об’єкт дає ті самі результати, що і цей, і протестуйте на невеликому зразку, перш ніж працювати на 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. Накресліть це, і ви повинні побачити всі свої функції. Далі, якщо ви хочете зберегти як a shapefile, вам потрібно додати деякі дані. За відсутності нічого іншого, я створюю простий стовпець від 1 до 12:

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

FALSEПрапор просто зупиняється R намагається змінити просторові і не просторові дані збігтися. Ви можете поставити розміри буфера в кадр даних чи щось таке.

Робота виконана.



2

Ви можете використовувати аргумент makeUniqueIDs в rbind, якщо у ваших полігонах немає унікальних ідентифікаторів.

 library(purrr)

list(buff.pts, makeUniqueIDs = T) %>% 
  flatten() %>% 
  do.call(rbind, .)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.