2013-10-11 10 views
8

In R habe ich einzelne SpatialPolygons Objekt (d. H. Multi-Polygone) mit mehreren hundert Polygonen. Ich möchte dieses SpatialPolygons Objekt in eine Liste von Polygons teilen (d. H. Löcher sollten an dem übergeordneten Polygon haften bleiben).Split-Polygon-Teile eines einzelnen SpatialPolygons-Objekts

Irgendeine Idee, wie man das macht?

EDITED:

das folgende Beispiel im Paket sp bereitgestellt Verwendung:

# 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) 

Dann out = lapply([email protected], slot, "Polygons") läuft. Ich bekomme eine Liste von drei Polygons (d.h. Srs1, Srs2, Srs3).

Allerdings ist der Fall, den ich versuche zu lösen, ein bisschen anders als dieses Beispiel. Das Objekt SpatialPolygons, das ich zu teilen versuche, ist das Ergebnis einer geometrischen Vereinigung, die mit der gUnaryUnion-Funktion (im RGEOS-Paket) durchgeführt wurde. Wenn ich out <- lapply([email protected], slot, "Polygons") anwende, erhalte ich eine eindeutige Liste von Polygon Objekten (n.b. keine Liste von Polygons Objekten). Mit anderen Worten, jedes Polygon ist von seinen Löchern getrennt.

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

ich:

> length(topol) 
[1] 4996 


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

Nach dem RGEOS v0.3-2 Handbuch (http://cran.r-project.org/web/packages/rgeos/rgeos.pdf):

Damit rgeos richtig funktionieren ist es notwendig, dass alle Löcher innerhalb einer gegebenen POLYGON- oder MULTIPOLYGON-Geometrie zu einem spezifischen Polygon gehören müssen. Die SpatialPolygons-Klassenimplementierung enthält diese Informationen derzeit nicht . Um diese Einschränkung zu umgehen rgeos verwendet ein zusätzliches Kommentarattribut für die Polygonklasse, das angibt, welches Loch zu welchem ​​Polygon gehört. In der aktuellen Implementierung ist dieser Kommentar eine Textzeichenfolge aus Zahlen, die durch Leerzeichen getrennt sind, wobei die Reihenfolge der Zahlen der Reihenfolge der Polygon-Objekte im Polygons-Slot des Polygons-Objekts entspricht. A 0 bedeutet, dass das Polygon-Objekt ein Polygon ist, eine Zahl ungleich Null impliziert , dass das Polygon-Objekt ein Loch ist, dessen Wert den Index des Polygons angibt, das das Loch "besitzt".

So ist die createSPComment() Funktion in RGEOS ist wahrscheinlich eine Abhilfe reaggregieren Polygonen und Löcher sein.

Antwort

2

Wenn Ihr SpatialPolygons Objekt mysp genannt wird ...

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

Wie ich es verstehe, will das OP ein SpatialPolygons Objekt in eine Liste von Polygons konvertieren, Konservierungs Löchern, falls vorhanden.

Das SpP Objekt, das vom OP erstellt wird, enthält drei Polygone, von denen das dritte ein zugeordnetes Loch hat.

Sie können lapply verwenden, um durch jedes Polygon in SpP zu wechseln und eine Liste mit SpatialPolygons zurückzuliefern. Der Unterschied zwischen einem Polygons und einem SpatialPolygons Objekt besteht in der Addition von Plotauftragsinformationen. Da jede resultierende SpatialPolygons die Länge = 1 hat, ist diese Information jedoch überflüssig.

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 

Wenn eine Liste von Polygons benötigt wird, ziehen Sie einfach den entsprechenden Steckplatz vom SpatialPolygons Objekt:

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

Zur Trennung Multipolygon-Objekte in einzelne Polygone (mit Löchern falls vorhanden) können Sie tun

d <- disaggregate(p) 

Dabei ist ein SpatialPolygons Objekt. Danach können Sie [email protected] verwenden.

Zum Beispiel

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

Dadurch wird eine Liste von SpatialPolygons statt gewöhnlichen Polygonen zurückkehren (die einige der Antworten tun).

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