Removendo a interseção de um polígono de outro usando R?

9

Estou tentando remover a interseção do Poly2 no Poly1. Abaixo estão as cordas dos 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)

Os 2 polígonos têm esta aparência insira a descrição da imagem aquiO que eu gostaria de obter no final é o polígono azul escuro (Poly1) sem a área azul clara (Poly2), ou seja, novas coordenadas orientais.

GodinA
fonte

Respostas:

7

Experimente a gDifferencefunção do pacote 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")

g Resultado da diferença

rcs
fonte
5

A solução utilizada rgeos::gDifferenceé muito mais rápida, mas retorna um SpatialPolygonsobjeto simples .

Se você estiver trabalhando com dois SpatialPolygonsDataFramese quiser manter as informações do quadro de dados, basta fazer isso, e o resultado será SpatialPolygonsDataFrame:

library(raster)

res <- p1 - p2
rafa.pereira
fonte
Usando esta solução, recebo o erro: "argumento não numérico para operador binário"
Ashe
@Ashe, tipo class(my_obj)para verificar se ambos os objetos sãoSpatialPolygonsDataFrame
rafa.pereira
Na verdade, eu recebo SpatialPolygonsDataFramecomo classe.
Ashe
Hummm estranho. Não sei por que isso aconteceria. Talvez você deve abrir uma nova questão de como remover intersecção de duas SpatialPolygonsDataFrames mantendo a informação de dados
rafa.pereira
11
Eu corrigi o problema. Eu precisava instalar a rasterbiblioteca para que esta solução funcionasse. Essa adição à resposta seria útil. Além disso, crédito para esta resposta: gis.stackexchange.com/a/169597/93643
Ashe