2013-10-11 23 views
8

In R, ho un singolo oggetto SpatialPolygons (cioè multi-poligoni) contenente diverse centinaia di poligoni. Vorrei suddividere questo oggetto SpatialPolygons in un elenco di Polygons (vale a dire che i fori devono rimanere collegati al poligono principale).Parti poligonali divise di un singolo oggetto SpatialPolygons

Qualche idea su come procedere?

MODIFICATI:

Utilizzando il seguente esempio fornito nel pacchetto sp:

# simple example, from vignette("sp"): 
Sr1 = Polygon(cbind(c(2,4,4,1,2),c(2,3,5,4,2))) 
Sr2 = Polygon(cbind(c(5,4,2,5),c(2,3,2,2))) 
Sr3 = Polygon(cbind(c(4,4,5,10,4),c(5,3,2,5,5))) 
Sr4 = Polygon(cbind(c(5,6,6,5,5),c(4,4,3,3,4)), hole = TRUE) 

Srs1 = Polygons(list(Sr1), "s1") 
Srs2 = Polygons(list(Sr2), "s2") 
Srs3 = Polygons(list(Sr3, Sr4), "s3/4") 
SpP = SpatialPolygons(list(Srs1,Srs2,Srs3), 1:3) 

Poi esecuzione out = lapply([email protected], slot, "Polygons"). Ottengo un elenco di tre Polygons (ad esempio Srs1, Srs2, Srs3).

Tuttavia, il caso che sto cercando di risolvere è un po 'diverso da questo esempio. L'oggetto SpatialPolygons che sto cercando di dividere è il risultato di un unione geometrica eseguita con la funzione gUnaryUnion (nel pacchetto RGEOS). Se applico out <- lapply([email protected], slot, "Polygons"), ottengo un elenco univoco di oggetti Polygon (n.b. non un elenco di oggetti Polygons). In altre parole, ogni poligono è separato dalle sue buche.

Esecuzione topol <- sapply(unlist(out), function(x) [email protected])

ottengo:

> length(topol) 
[1] 4996 


> sum(topol, na.rm=TRUE) 
[1] 469 

Secondo il RGEOS v0.3-2 manuale (http://cran.r-project.org/web/packages/rgeos/rgeos.pdf):

Affinché rgeos di funzionare correttamente è necessario che tutti i fori all'interno di una determinata geometria POLIGONO o MULTIPOLIGONO devono appartenere a un poligono speci fi co . L'implementazione della classe SpatialPolygons non include attualmente include queste informazioni. Per ovviare a questa limitazione, rgeos utilizza un attributo di commento aggiuntivo nella classe Poligoni che indica quale foro appartiene a quale poligono. Nell'attuale implementazione questo commento è una stringa di numeri di testo separati da spazi in cui l'ordine dei numeri corrisponde all'ordine degli oggetti Polygon nello slot Poligoni dell'oggetto Poligono. A 0 implica che l'oggetto Poligono è un poligono, un numero diverso da zero implica che l'oggetto Poligono è un foro con il valore che indica l'indice del poligono che "possiede" il foro.

Quindi la funzione createSPComment() in RGEOS è probabile che sia una soluzione per reaggregate poligoni e buchi.

risposta

2

Se l'oggetto è chiamato SpatialPolygonsmysp ...

out <- lapply([email protected] , slot , "Polygons") 
1

Da quanto ho capito, il PO vuole convertire un oggetto SpatialPolygons in un elenco di Polygons, preservando i fori se presente.

L'oggetto SpP creato dall'OP contiene tre poligoni, il terzo dei quali ha un foro associato.

È possibile utilizzare lapply per scorrere ciascun poligono in SpP, restituendo un elenco di SpatialPolygons. La differenza tra un oggetto Polygons e SpatialPolygons è l'aggiunta di informazioni sull'ordine di stampa. Poiché ciascuna risultante SpatialPolygons è di lunghezza = 1, tuttavia, questa informazione è superflua.

n_poly <- length(SpP) 

out <- lapply(1:n_poly, function(i) SpP[i, ]) 

lapply(out, class) 

> lapply(out, class) 
    [[1]] 
    [1] "SpatialPolygons" 
    attr(,"package") 
    [1] "sp" 

    [[2]] 
    [1] "SpatialPolygons" 
    attr(,"package") 
    [1] "sp" 

    [[3]] 
    [1] "SpatialPolygons" 
    attr(,"package") 
    [1] "sp" 

plot(out[[3]]) # Hole preserved 

Se è necessaria una lista di Polygons, basta tirare alloggiamento dall'oggetto SpatialPolygons:

out <- lapply(1:n_poly, function(i) SpP[i, ]@polygons[[1]]) 

lapply(out, class) 

> lapply(out, class) 
[[1]] 
[1] "Polygons" 
attr(,"package") 
[1] "sp" 

[[2]] 
[1] "Polygons" 
attr(,"package") 
[1] "sp" 

[[3]] 
[1] "Polygons" 
attr(,"package") 
[1] "sp" 
11

Per separare multipolygon oggetti in singoli poligoni (con fori se presente) si può fare

d <- disaggregate(p) 

Dove p è un oggetto SpatialPolygons. Successivamente, è possibile utilizzare [email protected].

Per esempio

library(sp) 
library(raster) 
### example data 
p1 <- rbind(c(-180,-20), c(-140,55), c(10, 0), c(-140,-60), c(-180,-20)) 
hole <- rbind(c(-150,-20), c(-100,-10), c(-110,20), c(-150,-20)) 
p1 <- list(p1, hole) 
p2 <- rbind(c(-10,0), c(140,60), c(160,0), c(140,-55), c(-10,0)) 
p3 <- rbind(c(-125,0), c(0,60), c(40,5), c(15,-45), c(-125,0)) 
pols <- spPolygons(p1, p2, p3) 
### 

a <- aggregate(pols, dissolve=FALSE) 
d <- disaggregate(a) 
0

Questo restituirà un elenco di SpatialPolygons invece di poligoni ordinarie (che alcune delle risposte DO).

SpP %>% split(1:length(.))