Rimuovere l'intersezione di un poligono da un altro usando R?


9

Sto cercando di rimuovere l'intersezione da Poly2 a Poly1. Di seguito sono riportati i coords dei 2 poligoni.

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

I 2 poligoni si presentano così inserisci qui la descrizione dell'immagineCiò che vorrei ottenere alla fine è il poligono blu scuro (Poly1) senza l'area blu (Poly2), ovvero nuove coordinate orientali.

Risposte:


7

Prova la gDifferencefunzione dal pacchetto 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")

Risultato gDifference


5

La soluzione utilizzata rgeos::gDifferenceè molto più veloce, ma restituisce un SpatialPolygonsoggetto semplice .

Se stai lavorando con due SpatialPolygonsDataFramesecondi e desideri conservare le informazioni sul frame di dati, puoi semplicemente farlo e il risultato sarà un SpatialPolygonsDataFrame:

library(raster)

res <- p1 - p2

Usando questa soluzione, ottengo l'errore: "argomento non numerico per l'operatore binario"
Ashe

@Ashe, digita class(my_obj)per verificare se entrambi i tuoi oggetti sonoSpatialPolygonsDataFrame
rafa.pereira

Anzi, ottengo SpatialPolygonsDataFramecome classe.
Ashe,

Hmmm strano. Non sono sicuro del perché questo accada. Forse dovresti aprire una nuova domanda su come rimuovere l'intersezione di due SpatialPolygonsDataFrames mantenendo le informazioni sui dati
rafa.pereira

1
Ho risolto il problema. Ho dovuto installare la rasterlibreria per far funzionare questa soluzione. Quell'aggiunta alla risposta sarebbe utile. Inoltre, merito a questa risposta: gis.stackexchange.com/a/169597/93643
Ashe
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.