Supprimer l'intersection d'un polygone d'un autre à l'aide de R?

9

J'essaie de supprimer l'intersection de Poly2 sur Poly1. Voici les coordonnées des 2 polygones.

> coords1
          [,1]     [,2]
 [1,] 992.0161 7462.531
 [2,] 950.1962 7413.532
 [3,] 902.3632 7421.207
 [4,] 706.1985 7472.378
 [5,] 654.0139 7711.760
 [6,] 657.5960 7726.950
 [7,] 786.2667 7844.380
 [8,] 789.5935 7842.925
 [9,] 981.7046 7498.659
[10,] 983.4246 7493.271
[11,] 990.6680 7469.888
[12,] 992.0161 7462.531
> coords2
         [,1]     [,2]
[1,] 930.3464 7607.313
[2,] 979.3528 7502.470
[3,] 865.8662 7484.337
[4,] 850.5665 7594.947
[5,] 930.3464 7607.313

Poly1<-Polygon(coords1)
Poly2<-Polygon(coords2)

Les 2 polygones ressemblent à ceci entrez la description de l'image iciCe que j'aimerais obtenir à la fin est le polygone bleu foncé (Poly1) sans la zone bleu clair (Poly2), c'est-à-dire de nouvelles coordonnées orientales.

GodinA
la source

Réponses:

7

Essayez la gDifferencefonction du package rgeos :

coords1 <- as.matrix(read.table(textConnection("
992.0161 7462.531
950.1962 7413.532
902.3632 7421.207
706.1985 7472.378
654.0139 7711.760
657.5960 7726.950
786.2667 7844.380
789.5935 7842.925
981.7046 7498.659
983.4246 7493.271
990.6680 7469.888
992.0161 7462.531
")))

coords2 <- as.matrix(read.table(textConnection("
930.3464 7607.313
979.3528 7502.470
865.8662 7484.337
850.5665 7594.947
930.3464 7607.313
")))

library("sp")
poly1 <- Polygon(coords1)
poly2 <- Polygon(coords2)
# create SpatialPolygons objects
p1 <- SpatialPolygons(list(Polygons(list(poly1), "p1")))
p2 <- SpatialPolygons(list(Polygons(list(poly2), "p2")))

library("rgeos")
res <- gDifference(p1, p2)
plot(res, col="blue")

gDifférence résultat

rcs
la source
5

La solution utilisant rgeos::gDifferenceest beaucoup plus rapide, mais elle renvoie un SpatialPolygonsobjet simple .

Si vous travaillez avec deux SpatialPolygonsDataFrames et que vous souhaitez conserver les informations de la trame de données, vous pouvez simplement le faire, et le résultat sera SpatialPolygonsDataFrame:

library(raster)

res <- p1 - p2
rafa.pereira
la source
En utilisant cette solution, j'obtiens l'erreur: "argument non numérique à l'opérateur binaire"
Ashe
@Ashe, tapez class(my_obj)pour vérifier si vos deux objets sontSpatialPolygonsDataFrame
rafa.pereira
En effet, je reçois SpatialPolygonsDataFramecomme classe.
Ashe
Hmmm étrange. Je ne sais pas pourquoi cela se produirait. Vous devriez peut-être ouvrir une nouvelle question sur la façon de supprimer l'intersection de deux SpatialPolygonsDataFrames tout en conservant les informations sur les données
rafa.pereira
1
J'ai résolu le problème. J'avais besoin d'installer la rasterbibliothèque pour que cette solution fonctionne. Cet ajout à la réponse serait utile. Aussi, crédit à cette réponse: gis.stackexchange.com/a/169597/93643
Ashe