Suite

Boucle pour vérifier que plusieurs polygones se chevauchent dans r

Boucle pour vérifier que plusieurs polygones se chevauchent dans r


J'ai un ensemble de polygones (disponible ici : http://ulozto.cz/x39ELbFt/polygons-zip) créé dans QGis et traité dans R. Je voudrais savoir s'ils se chevauchent ou non, et si oui, où est la zone de chevauchement (et entre quels polygones) ? Je sais que pour comprendre cela, je peux utiliser des outils:

  • over{sp} - renvoie data.frame pas un objet spatial !
  • intersection{raster}
  • gIntersection{rgeos}

Je peux trouver une intersection en comparant 1 par 1 polygone à chaque pas de temps. Cependant comme mes données réelles sont énormes, je préfère faire une boucle et inclure l'itération des polygones :

  • intersection(p1, p2)
  • intersection(p1, p3)
  • intersection(p1, p4)
  • intersection(p2, p3)
  • etc…

Pour le moment, je n'ai composé qu'une boucle pour un polygone en croisant un autre 3. À partir de la liste résultante des polygones qui se chevauchent, je ne peux cependant pas vraiment dire quels polygones se chevauchent. Et s'ils ne le sont pas (p1 et p4) cette valeur NULL n'est pas incluse dans ma liste résultante !

bibliothèque(sp) bibliothèque(raster) bibliothèque(rgeos) bibliothèque(spatstat) bibliothèque(rgdal) setwd("D:/… ") p1<- readOGR(dsn=getwd(), layer="p1") p2<- readOGR (dsn=getwd(), layer="p2") p3<- readOGR(dsn=getwd(), layer="p3") p4<- readOGR(dsn=getwd(), layer="p4") ab<- list(p2, p3, p4) # ma boucle uniquement pour 1 polygone, pas pour les combinaisons de polygones par deux méthodes d'intersection # intersection par gIntersection{rgeos} int1<-list() for (i in 1:length(ab)){ int11<-gIntersection(p1, ab[[i]], byid = FALSE) int1[[i]]<-int11 } # intersection par intersect{raster} rst.int<-list() pour (i en 1:longueur (ab)){ rst.int1<-intersect(p1, ab[[i]]) rst.int[[i]]<-rst.int1 }


j'ai joué avecattribuer(),ls(), etmget()pour accomplir quelque chose qui, je pense, améliorera votre flux de travail. J'utilise d'abordls()pour obtenir une liste de toutes les variables d'environnement commençant par "p":

names_poly <- ls(pattern='^p.')

j'ai utilisécombn()pour trouver toutes les combinaisons uniques de polygones

combos <- combn(names_poly,2)

j'ai bouclécombinaisonsen utilisantavoir()récupérer les polygonesjeetjnommé danscombinaisons. j'ai aussi utiliséattribuer()pour créer un nouvel objet dont le nom est collé ensemble (par ex.int_p1_p2)

for(k in seq_along(combos[1,])){ i <- combos[1,k] j <- combos[2,k] print(paste("intersecting",i,j)) assign(paste(" int",i,j,sep="_"),gIntersection(get(i), get(j), byid = FALSE)) }

Vous n'aurez peut-être pas besoin de cette étape ci-dessous puisque vous disposez de toutes les nouvellesint_pi_pjSpatialPolygons en tant qu'objets séparés, mais si vous les voulez dans une liste :

int <- mget(ls(motif='^int_.')) rm(list = ls(motif='^int_.') #cleanup

Ensuite, vous pouvez accéder aux éléments de votre liste avec$:

plot(int$int_p1_p2)

EDIT : dans ce qui précède, lorsqu'il n'y a pas de chevauchement, la variable sera NULL. Si vous ne voulez même pas voir les combinaisons où il n'y a pas de chevauchement, vous pouvez ajouter cecisidéclaration au mêmepourboucle:

for(k in seq_along(combos[1,])){ i <- combos[1,k] j <- combos[2,k] print(paste("intersecting",i,j)) if(gIntersects(get (i), get(j), byid = FALSE)){ assign(paste("int",i,j,sep="_"),gIntersection(get(i), get(j), byid = FALSE) ) } }

Voir la vidéo: Säännöllinen monikulmio