Czy usunąć przecięcie jednego wielokąta z drugiego za pomocą R?

9

Próbuję usunąć przecięcie z Poly2 na Poly1. Poniżej znajdują się współrzędne 2 wielokątów.

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

Dwa wielokąty wyglądają tak: Na wprowadź opis zdjęcia tutajkońcu chciałbym uzyskać ciemnoniebieski wielokąt (Poly1) bez jasnoniebieskiego obszaru (Poly2), tj. Nowe współrzędne wschodnie.

Godin A.
źródło

Odpowiedzi:

7

Wypróbuj gDifferencefunkcję z pakietu 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 Wynik różnicy

rcs
źródło
5

Użyte rozwiązanie rgeos::gDifferencejest znacznie szybsze, ale zwraca prosty SpatialPolygonsobiekt.

Jeśli pracujesz z dwoma SpatialPolygonsDataFrames i chcesz zachować informacje o ramce danych, możesz po prostu to zrobić, a wynikiem będzie SpatialPolygonsDataFrame:

library(raster)

res <- p1 - p2
rafa.pereira
źródło
Korzystając z tego rozwiązania, pojawia się błąd: „argument nieliczbowy dla operatora binarnego”
Ashe
@ Tak, wpisz, class(my_obj)aby sprawdzić, czy oba twoje obiekty sąSpatialPolygonsDataFrame
rafa.pereira
Rzeczywiście, rozumiem SpatialPolygonsDataFramejako klasa.
Ashe,
Hmmm dziwne. Nie jestem pewien, dlaczego tak się stało. Być może powinieneś otworzyć nowe pytanie, jak usunąć przecięcie dwóch SpatialPolygonsDataFrames przy zachowaniu informacji o danych
rafa.pereira
1
Naprawiłem problem. Musiałem zainstalować rasterbibliotekę, aby to rozwiązanie działało. Ten dodatek do odpowiedzi byłby pomocny. Również przypis
Ashe