¿Eliminar la intersección de un polígono de otro usando R?

9

Estoy tratando de eliminar la intersección de Poly2 en Poly1. Debajo están los coords de los 2 polígonos.

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

Los 2 polígonos se ven así. ingrese la descripción de la imagen aquíLo que me gustaría obtener al final es el polígono azul oscuro (Poly1) sin el área azul claro (Poly2), es decir, nuevas coordenadas orientales.

GodinA
fuente

Respuestas:

7

Pruebe la gDifferencefunción del paquete 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")

Resultado de diferencia

rcs
fuente
5

El uso de la solución rgeos::gDifferencees mucho más rápido, pero devuelve un SpatialPolygonsobjeto simple .

Si está trabajando con dos SpatialPolygonsDataFramesy desea mantener la información del marco de datos, simplemente puede hacer esto, y el resultado será un SpatialPolygonsDataFrame:

library(raster)

res <- p1 - p2
rafa.pereira
fuente
Al usar esta solución, obtengo el error: "argumento no numérico para el operador binario"
Ashe
@Ashe, escribe class(my_obj)para verificar si ambos objetos sonSpatialPolygonsDataFrame
rafa.pereira
De hecho, me sale SpatialPolygonsDataFramecomo la clase.
Ashe
Hmmm extraño. No estoy seguro de por qué sucedería esto. Tal vez debería abrir una nueva pregunta sobre cómo Eliminar la intersección de dos SpatialPolygonsDataFrames mientras mantiene la información de datos
rafa.pereira
1
He solucionado el problema. Necesitaba instalar la rasterbiblioteca para que esta solución funcionara. Esa adición a la respuesta sería útil. También, crédito a esta respuesta: gis.stackexchange.com/a/169597/93643
Ashe