¿Recorte inverso (borrado) en R?

14

Un clip inverso guarda solo la parte de su objeto espacial que está fuera de los límites de otro objeto, a diferencia de un clip normal que guarda las partes que están dentro del otro objeto.

Realizar clip inverso en ArcMap? muestra cómo hacerlo en ArcMap.

¿Cómo hago esto en R?

Ejemplo reproducible (en máquinas 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")

Lo que quiero hacer aquí es salvar todo el Reino Unido, excepto Londres. Visualmente, quiero que la forma negra en la imagen resultante sea un agujero.

ingrese la descripción de la imagen aquí

RobinLovelace
fuente

Respuestas:

4

Respuesta para características simples:

El paquete sf se basa en Geometry Engine Open Source y, como tal, puede acceder a la lista de comandos como st_within, etc.

Uno de estos comandos, st_difference, hará el trabajo:

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

ver también al final de este artículo

También se puede hacer coaccionando Sp a sf con st_as_sf. ¡Preste atención a las advertencias ya que los atributos pueden ser difíciles de manejar!

Sam
fuente
12

Parece ser una aplicación simple gDifferencedel rgeospaquete:

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

La advertencia de proyección se debe a que el archivo de forma LondonBoroughsno tiene un .prjarchivo.

Solo para asegurarse de que sea un agujero y no un contorno u otro polígono sólido:

> gArea(lnd) + gArea(ukhole) - gArea(uk)
[1] 0
Hombre espacial
fuente
Muy simple, gracias por la rápida respuesta. Estaría interesado en mirar el código fuente de estas funciones para ver qué sucede debajo del capó.
RobinLovelace
En el fondo, simplemente llaman GEOS, que es una biblioteca de código C de funciones de geometría trac.osgeo.org/geos
Spacedman
Interesante, y ayuda a explicar por qué es razonablemente rápido, supongo. Según esta página, parece que no se está desarrollando activamente. ¿Alguien puede confirmar / refutar esto? svn.osgeo.org/geos/branches/3.4/ChangeLog
RobinLovelace
1
Seguro que está desarrollado. Vea la línea de tiempo trac.osgeo.org/geos/timeline o la lista de correo archives lists.osgeo.org/pipermail/geos-devel
user30184
5

Un poco tarde para la fiesta, pero hay una manera simple de hacer esto con una máscara usando el argumento 'inverso';

ukhole <- mask(uk, lnd, inverse = TRUE)
Codificación4Biología
fuente
Del paquete ráster. ¿Y de sf alguna idea?
RobinLovelace