Más

¿Recorte inverso (borrado) en R?

¿Recorte inverso (borrado) en R?


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 se dentro el otro objeto.

¿Realizando 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 /") descomprimir ("/ tmp / master.zip", exdir = " / tmp / master ") uk <- readOGR (" / tmp / master / Creando-mapas-en-R-master / data / "," ukbord ") lnd <- readOGR (" / tmp / master / Creando-mapas- 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 para Londres. Visualmente, quiero que la forma negra de la imagen resultante sea un agujero.


Respuesta para características simples:

sf se basa en el código abierto de Geometry Engine y, como tal, puede acceder a la lista de comandos como st_within, etc.

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

require (sf) # hacer una característica simple cuadrada s <- rbind (c (1,1), c (1,5), c (5,5), c (5,1), c (1,1)) s.sf <-st_sfc (st_polygon (lista (s))) s.pol = st_sf (ID = "sq", s.sf) # hacer un triángulo más pequeño función simple s2 <- rbind (c (2,2), c (3,4), c (4,2), c (2,2)) s2.sf <-st_sfc (st_polygon (lista (s2))) s2.pol = st_sf (ID = "tr", s2. sf) # encuentra la 'diferencia', es decir, inversa de st_intersection t <- st_difference (s.pol, s2.pol) plot (t) # echa un vistazo a la nueva geometría, un formato de texto bien conocido con exterior seguido de agujero st_geometry (t) [[1]] POLÍGONO ((1 1, 1 5, 5 5, 5 1, 1 1), (2 2, 4 2, 3 4, 2 2))

ver también hacia la parte inferior de este artículo

también se puede hacer coaccionando a Sp a sf con st_as_sf. Preste atención a las advertencias, ya que los atributos pueden ser difíciles de administrar.


Parece ser una simple aplicación degDiferenciadesde elrgeospaquete:

> require (rgeos)> ukhole = gDifference (uk, lnd) Mensaje de advertencia: En RGEOSBinTopoFunc (spgeom1, spgeom2, byid, id, "rgeos_difference"): spgeom1 y spgeom2 tienen diferentes cadenas proj4> plot (ukhole)

La advertencia de proyección se debe a queLondonBoroughsshapefile no tiene un.prjexpediente.

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

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

ukhole <- máscara (reino unido, lnd, inverso = VERDADERO)