Fusionner une liste d'objets polygonaux spatiaux dans R

16

J'ai une liste de tampons spatiaux (30000 tampons) que j'ai construits avec la fonction 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 

À partir de cette liste, comment puis-je fusionner tous les tampons spatiaux pour obtenir un fichier de formes avec les 30000 tampons (ou fonctionnalités)? (Ce fichier de formes sera ensuite utilisé dans la fonction aggregatepour agréger les polygones spatiaux par attributs.)

J'ai testé ce code mais j'obtiens ce message d'erreur:

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
Nell
la source
3
Y a-t-il une raison pour laquelle vous devez créer vos tampons avec lapplyau lieu d'utiliser gBufferavec byid = TRUE?
cengel

Réponses:

12

Étant donné une liste d' SpatialPolygonsobjets, voici comment construire un bloc de données de polygones spatiaux avec une entité par SpatialPolygonsentité d' origine .

Exemples de données: splest une liste de 12 SpatialPolygonsobjets - assurez-vous que votre objet donne les mêmes résultats que celui-ci, et testez sur un petit échantillon avant de lancer 30 000:

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

Vous souhaitez créer un seul Spatial Polygonsobjet avec toutes les fonctionnalités qu'il contient afin de créer ensuite un cadre de données de polygones spatiaux:

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

Cela prend le premier polygonsemplacement de l'objet (et il ne devrait y en avoir qu'un, car chaque élément de la liste est actuellement une seule entité), puis construit une liste d'objets Polygones qui est ce que vous alimentez SpatialPolygonspour créer une multifonction SpatialPolygons. Tracez cela, et vous devriez voir toutes vos fonctionnalités. Ensuite, si vous souhaitez enregistrer en tant que shapefile, vous devez ajouter des données. En l'absence d'autre chose, je crée une simple colonne ID de 1 à 12:

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

Le FALSEdrapeau arrête juste R essayant de réorganiser les données spatiales et non spatiales pour correspondre. Vous voudrez peut-être mettre les tailles de tampon dans la trame de données ou quelque chose.

Travail accompli.

Spacedman
la source
18

Pour fusionner une liste d'objets spatiaux, vous pouvez faire:

library(raster)
m <- do.call(bind, buff.pts) 
Robert Hijmans
la source
2

Vous pouvez utiliser l'argument makeUniqueIDs dans rbind si vos polygones n'ont pas d'ID uniques.

 library(purrr)

list(buff.pts, makeUniqueIDs = T) %>% 
  flatten() %>% 
  do.call(rbind, .)
ColinTB
la source