2013-10-11 2 views
8

En R, j'ai un seul objet SpatialPolygons (c'est-à-dire multi-polygones) contenant plusieurs centaines de polygones. Je voudrais diviser cet objet SpatialPolygons en une liste de Polygons (c'est-à-dire que les trous doivent rester attachés au polygone parent).Partage de polygones d'un seul objet SpatialPolygons

Une idée de comment faire cela?

ÉDITÉ:

En utilisant l'exemple suivant fourni dans le package 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) 

ensuite en cours d'exécution out = lapply([email protected], slot, "Polygons"). J'obtiens une liste de trois Polygons (c'est-à-dire Srs1, Srs2, Srs3).

Cependant, le cas que j'essaie de résoudre est un peu différent de cet exemple. L'objet SpatialPolygons que j'essaie de scinder est le résultat d'une union géométrique effectuée avec la fonction gUnaryUnion (dans le package RGEOS). Si j'applique out <- lapply([email protected], slot, "Polygons"), j'obtiens une liste unique d'objets Polygon (ne pas une liste d'objets Polygons). En d'autres termes, chaque polygone est séparé de son ou ses trous.

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

je reçois:

> length(topol) 
[1] 4996 


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

Selon le RGEOS v0.3-2 manuel (http://cran.r-project.org/web/packages/rgeos/rgeos.pdf):

Pour RGeoS fonctionne correctement, il est nécessaire que tous les trous dans une géométrie POLYGON ou MULTIPOLYGON donnée doivent appartenir à un polygone spéci fi que . L'implémentation de la classe SpatialPolygons n'inclut pas actuellement cette information dans . Pour contourner cette limitation rgeos utilise un attribut de commentaire supplémentaire sur la classe Polygons qui indique quel trou appartient à quel polygone. Sous l'actuelle implémentation , ce commentaire est une chaîne de texte de nombres séparés par espaces où l'ordre des nombres correspond à l'ordre des objets Polygon dans l'emplacement Polygones de l'objet Polygones. Un 0 implique que l'objet Polygone est un polygone, un nombre différent de zéro implique que l'objet Polygone est un trou avec la valeur indiquant l'index du polygone qui "possède" le trou.

Ainsi la fonction createSPComment() dans RGEOS est susceptible d'être une solution de contournement à trous et réagréger Polygones.

Répondre

2

Si votre objet SpatialPolygons est appelé mysp ...

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

Si je comprends bien, l'OP veut convertir un objet SpatialPolygons dans une liste de Polygons, en conservant des trous si elle est présente.

L'objet SpP créé par l'OP contient trois polygones dont le troisième a un trou associé.

Vous pouvez utiliser lapply pour parcourir chaque polygone en SpP, en renvoyant une liste de SpatialPolygons. La différence entre un objet Polygons et SpatialPolygons est l'ajout d'informations d'ordre de tracé. Puisque chaque résultat SpatialPolygons est de longueur = 1, cette information est cependant superflue.

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 

Si une liste de Polygons est nécessaire, il suffit de tirer la fente appropriée de l'objet 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

à des objets multipolygone séparés en polygones simples (avec des trous si présents) vous pouvez faire

d <- disaggregate(p) 

p est un objet SpatialPolygons. Après cela, vous pouvez utiliser [email protected].

Par exemple

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

Cela renvoie une liste de SpatialPolygons au lieu de Polygones ordinaires (dont quelques-unes des réponses do).

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