Ritaglio inverso (cancellazione) in R?


14

Una clip inversa salva solo la parte dell'oggetto spaziale che è al di fuori dei limiti di un altro oggetto, al contrario di una clip normale che salva le parti che si trovano all'interno dell'altro oggetto.

Esecuzione di clip inversa in ArcMap? mostra come farlo in ArcMap.

Come posso farlo in R?

Esempio riproducibile (su macchine Linux):

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

Quello che voglio fare qui è salvare tutto il Regno Unito tranne Londra. Visivamente, voglio che la forma nera nell'immagine risultante sia un buco.

inserisci qui la descrizione dell'immagine

Risposte:


4

Risposta per funzionalità semplici:

Il pacchetto sf si basa su Geometry Engine Open Source e come tale può accedere all'elenco di comandi come st_within ecc.

Uno di questi comandi, st_difference, farà il lavoro:

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

vedi anche verso il fondo di questo articolo

può essere fatto anche forzando Sp su sf con st_as_sf. Fai attenzione agli avvisi perché gli attributi possono essere difficili da gestire!


12

Sembra essere una semplice applicazione di gDifferencedalla rgeosconfezione:

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

L'avviso di proiezione è perché lo LondonBoroughsshapefile non ha un .prjfile.

Solo per assicurarsi che sia un buco e non un contorno o un altro poligono solido:

> gArea(lnd) + gArea(ukhole) - gArea(uk)
[1] 0

Così semplice, grazie per la risposta veloce. Sarebbe interessato a guardare il codice sorgente di queste funzioni per vedere cosa sta succedendo sotto il cofano.
RobinLovelace,

In fondo chiamano semplicemente GEOS, che è una libreria di codice C di funzioni geometriche trac.osgeo.org/geos
Spacedman

Interessante - e aiuta a spiegare perché è ragionevolmente veloce immagino. Sulla base di questa pagina, sembra che non sia stato sviluppato attivamente qualcuno può confermare / smentire questo? svn.osgeo.org/geos/branches/3.4/ChangeLog
RobinLovelace

1
Di sicuro è sviluppato. Vedi la cronologia trac.osgeo.org/geos/timeline o gli archivi delle mailing list lists.osgeo.org/pipermail/geos-devel
user30184

5

Un po 'tardi alla festa, ma c'è un modo semplice per farlo con la maschera usando l'argomento "inverso";

ukhole <- mask(uk, lnd, inverse = TRUE)

Dal pacchetto raster. E da sf qualche idea?
RobinLovelace,
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.