Wie erstelle ich einen echten GIS-Clip einer Polygonebene mit einer Polygonebene in R?

16

Ich möchte einen echten GIS-Clip in R von Bodenpolygonen mit einer Reihe von Polygonen mit nur einer Begrenzung erstellen, finde jedoch keine R-Funktion, um dies ordnungsgemäß durchzuführen. Es sollte genau wie die clipFunktion in ArcMap von ESRI funktionieren. Ich habe die overMethode in sppackage ausprobiert , aber es scheint nicht für polys over polys zu funktionieren.

Ein Vorschlag war, das gIntersectionin- rgeosPaket mit dem folgenden Code als Clip zu verwenden:

#------------------------------------
library(rgeos)
library(maptools)

#Read layers as SpatialPolygonsDataFrame (both the same Albers projection)
Soils_poly = readShapePoly("Soils_polygons")  #Note - Has 400 polygons
clipper_poly = readShapePoly("clipper_polygon")  #Note - Has 1 polygon

#Try gintersection as clip 
Clipped_polys = gIntersection(Clipper_Tile_poly, Soils_poly)

#-----------------------------------

Dies dauert 5 Minuten (viel zu langsam) und es treten folgende Fehler auf:

Fehler in RGEOSBinTopoFunc (spgeom1, spgeom2, byid, id, drop_not_poly, "rgeos_intersection"): TopologyException: kein ausgehendes dirEdge gefunden bei -721459.77681285271 2009506.5980877089

Ich habe auch versucht, diesen Code auf Überlappungen zu überprüfen:

gIntersects(Clipper_Tile_poly, Soils_poly)

und das Ergebnis war WAHR. clipFunktion in ESRI ArcMap funktioniert gut für diese Daten.

Kennt jemand eine R-Funktion, um einen Clip auf räumlichen Polygonen mit räumlichen Polygonen richtig zu machen?

user29199
quelle
Versuchen Sie gIntersection mit byid = TRUE (ich denke, es ist ein Problem mit herabhängenden Topologien für bestimmte Clips, und manchmal hilft es, dies auf diese Weise zu tun) schneide diese Paare. Es gibt keine einfachen High-Level-Wrapper für all diese afaik
mdsumner

Antworten:

20

Der von @mdsummer zur Verfügung gestellte Hinweis zur Verwendung byid=TRUEfunktioniert korrekt.

Siehe das reproduzierbare Beispiel unten:

library(rgeos)
library(sp)

#Create SpatialPlygons objects
polygon1 <- readWKT("POLYGON((-190 -50, -200 -10, -110 20, -190 -50))") #polygon 1
polygon2 <- readWKT("POLYGON((-180 -20, -140 55, 10 0, -140 -60, -180 -20))") #polygon 2

par(mfrow = c(1,2)) #in separate windows
plot(polygon1, main = "Polygon1") #window 1
plot(polygon2, main = "Polygon2") #window 2

Polygone nebeneinander

polygon_set <- readWKT(paste("POLYGON((-180 -20, -140 55, 10 0, -140 -60, -180 -20),",
                     "(-190 -50, -200 -10, -110 20, -190 -50))"))

par(mfrow = c(1,1)) #now, simultaneously
plot(polygon_set, main = "Polygon1 & Polygon2")

Bildbeschreibung hier eingeben

clip <- gIntersection(polygon1, polygon2, byid = TRUE, drop_lower_td = TRUE) #clip polygon 2 with polygon 1
plot(clip, col = "lightblue")

Bildbeschreibung hier eingeben

GT <- GridTopology(c(-175, -85), c(10, 10), c(36, 18))
gr <- as(as(SpatialGrid(GT), "SpatialPixels"), "SpatialPolygons")
plot(gr)

Bildbeschreibung hier eingeben

clip2 <- gIntersection(clip, gr, byid = TRUE, drop_lower_td = TRUE)
plot(clip2, col = "pink")

Bildbeschreibung hier eingeben

Andre Silva
quelle
1
Arbeitet einen Traum - unglaublich schnell. Ich benutze dies, um Polylinien zu schneiden. Ich wollte Teilmengen des Shapefiles für britische Flüsse erstellen, da es viel schneller ist, mit einer kleineren Teilmenge von Daten zu arbeiten.
CJB
1
@AndreSilva, dachte ich, aber ich glaube nicht! Betreff: Community, ich wünschte, die R GIS-Entwickler-Community wäre etwas größer. Ich werde wahrscheinlich auf ArcMap zurückgreifen müssen, um einige Digitalisierungs- und andere Prozesse auszuführen, die in der GUI schnell sind.
Rich Pauloo
3

Sie können auch das Rasterpaket verwenden raster::intersect(spdf1, spdf2). Es hat den Vorteil, dass die Attribute für den Fall beibehalten werden, dass Sie über einen SpatialPolygonsDataFrame verfügen.

library(sp); library(rgeos)

coords1 <- matrix(c(-1.841960, -1.823464, -1.838623, -1.841960, 55.663696,
                55.659178, 55.650841, 55.663696), ncol=2)
coords2 <- matrix(c(-1.822606, -1.816790, -1.832712, -1.822606, 55.657887,
                55.646806, 55.650679, 55.657887), ncol=2)
p1 <- Polygon(coords1)
p2 <- Polygon(coords2)
p1 <- Polygons(list(p1), ID = "p1")
p2 <- Polygons(list(p2), ID = "p2")
myPolys <- SpatialPolygons(list(p1, p2))
spdf1 = SpatialPolygonsDataFrame(myPolys, data.frame(variable1 = c(232,
                                                               242), variable2 = c(235, 464), row.names = c("p1", "p2")))
coords1a <- matrix(c(-1.830219, -1.833753, -1.821154, -1.830219, 55.647353,
                 55.656629, 55.652122, 55.647353), ncol=2)
p1a <- Polygon(coords1a)
p1a <- Polygons(list(p1a), ID = "p1a")
myPolys1 <- SpatialPolygons(list(p1a))
spdf2 = SpatialPolygonsDataFrame(myPolys1, data.frame(variable1 = c(2),
                                                  variable2 = c(3), row.names = c("p1a")))

# works but drop the attributes
#gIntersection(spdf1, spdf2, byid=T)

#better to keep attributes
inter1=raster::intersect(spdf1, spdf2)

plot(spdf1, col="red")
plot(spdf2, col="yellow", add=T)
plot(inter1,col="blue", add=T)

Bildbeschreibung hier eingeben

Dank dieser Frage an den Hinweis und für den Beispielcode.

jeb
quelle