Reverse Clipping (Löschen) in R?

14

Ein umgekehrter Clip speichert nur den Teil Ihres räumlichen Objekts, der sich außerhalb der Grenzen eines anderen Objekts befindet, im Gegensatz zu einem regulären Clip, der die Teile speichert, die sich innerhalb des anderen Objekts befinden.

Reverse Clip in ArcMap ausführen? zeigt, wie es in ArcMap gemacht wird.

Wie mache ich das in R?

Reproduzierbares Beispiel (auf Linux-Rechnern):

system("wget 'https://github.com/Robinlovelace/Creating-maps-in-R/archive/master.zip' -P /tmp/")
unzip("/tmp/master.zip", exdir = "/tmp/master")
uk <- readOGR("/tmp/master/Creating-maps-in-R-master/data/", "ukbord")
lnd <- readOGR("/tmp/master/Creating-maps-in-R-master/data/", "LondonBoroughs")
plot(uk)
plot(lnd, add = T, col = "black")

Was ich hier tun möchte, ist, ganz Großbritannien mit Ausnahme von London zu retten . Optisch möchte ich, dass die schwarze Form im resultierenden Bild ein Loch ist.

Bildbeschreibung hier eingeben

RobinLovelace
quelle

Antworten:

4

Antwort für einfache Funktionen:

Das sf-Paket basiert auf Geometry Engine Open Source und kann als solches auf die Liste der Befehle wie st_within usw. zugreifen.

Ein solcher Befehl, st_difference, erledigt die Aufgabe:

require(sf)

# make a square simple feature
s <- rbind(c(1,1), c(1,5), c(5,5), c(5,1), c(1,1))
s.sf <-st_sfc(st_polygon(list(s)))
s.pol = st_sf(ID = "sq", s.sf)

# make a smaller triangle simple feature
s2 <- rbind(c(2,2), c(3,4), c(4,2), c(2,2))
s2.sf <-st_sfc(st_polygon(list(s2)))
s2.pol = st_sf(ID = "tr", s2.sf)

# find the 'difference', i.e. reverse of st_intersection
t <- st_difference(s.pol,s2.pol)

plot(t)

# have a look at the new geometry, a well known text format with exterior followed by hole
st_geometry(t)[[1]]
POLYGON((1 1, 1 5, 5 5, 5 1, 1 1), (2 2, 4 2, 3 4, 2 2))

siehe auch unten in diesem Artikel

Sie können auch Sp mit st_as_sf zu sf zwingen. Beachten Sie die Warnungen, da die Verwaltung von Attributen schwierig sein kann!

Sam
quelle
12

Scheint eine einfache Anwendung gDifferenceaus dem rgeosPaket zu sein:

> require(rgeos)
> ukhole = gDifference(uk, lnd)
Warning message:
In RGEOSBinTopoFunc(spgeom1, spgeom2, byid, id, "rgeos_difference") :
  spgeom1 and spgeom2 have different proj4 strings
> plot(ukhole)

Die Projektionswarnung ist, weil das LondonBoroughsShapefile keine .prjDatei enthält.

Nur um sicherzustellen, dass es sich um ein Loch und nicht um einen Umriss oder ein anderes festes Polygon handelt:

> gArea(lnd) + gArea(ukhole) - gArea(uk)
[1] 0
Raumfahrer
quelle
Sooo einfach, danke für die schnelle Antwort. Würde mich interessieren, den Quellcode dieser Funktionen zu betrachten, um zu sehen, was unter der Haube vor sich geht.
Robin Lovelace
Tief unten sie nur GEOS nennen , die eine C-Code - Bibliothek von Geometriefunktionen trac.osgeo.org/geos
Spacedman
Interessant - und hilft zu erklären, warum es ziemlich schnell ist, denke ich. Es scheint, als würde diese Seite nicht aktiv weiterentwickelt. Kann jemand dies bestätigen / widerlegen? svn.osgeo.org/geos/branches/3.4/ChangeLog
RobinLovelace
1
Sicher ist es entwickelt. Weitere Informationen finden Sie auf der Timeline trac.osgeo.org/geos/timeline oder in den Mailinglistenarchiven lists.osgeo.org/pipermail/geos-devel
user30184
5

Ein bisschen zu spät zur Party, aber es gibt einen einfachen Weg, dies mit mask zu tun, indem man das 'inverse' Argument benutzt;

ukhole <- mask(uk, lnd, inverse = TRUE)
Coding4Biology
quelle
Aus dem Rasterpaket. Und von sf irgendwelche Ideen?
Robin Lovelace