Entfernen eines Schnittpunkts eines Polygons von einem anderen mit R?


9

Ich versuche, den Schnittpunkt von Poly2 auf Poly1 zu entfernen. Unten sind die Koordinaten der 2 Polygone.

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

Die 2 Polygone sehen so aus. Geben Sie hier die Bildbeschreibung einWas ich am Ende erhalten möchte, ist das dunkelblaue Polygon (Poly1) ohne den hellblauen Bereich (Poly2), dh neue östliche Koordinaten.

Antworten:


7

Probieren Sie die gDifferenceFunktion aus dem rgeos- Paket aus:

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

gDifferenzergebnis


5

Die verwendete Lösung rgeos::gDifferenceist viel schneller, gibt jedoch ein einfaches SpatialPolygonsObjekt zurück.

Wenn Sie mit zwei SpatialPolygonsDataFrames arbeiten und die Datenrahmeninformationen beibehalten möchten, können Sie dies einfach tun. Das Ergebnis ist SpatialPolygonsDataFrame:

library(raster)

res <- p1 - p2

Bei Verwendung dieser Lösung erhalte ich den Fehler: "Nicht numerisches Argument für binären Operator"
Ashe

@Ashe, geben Sie ein, um class(my_obj)zu überprüfen, ob beide Ihrer Objekte sindSpatialPolygonsDataFrame
rafa.pereira

In der Tat bekomme ich SpatialPolygonsDataFrameals Klasse.
Ashe

Hmmm seltsam. Ich bin mir nicht sicher, warum das passieren würde. Vielleicht sollten Sie eine neue Frage öffnen, wie Sie den Schnittpunkt zweier SpatialPolygonsDataFrames entfernen können, während Sie die
Dateninformationen beibehalten

1
Ich habe das Problem behoben. Ich musste die rasterBibliothek installieren, damit diese Lösung funktioniert. Dieser Zusatz zur Antwort wäre hilfreich. Gutschrift zu dieser Antwort: gis.stackexchange.com/a/169597/93643
Ashe
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.