Recorte reverso (apagamento) em R?


14

Um clipe reverso salva apenas a parte do seu objeto espacial que está fora dos limites de outro objeto, em oposição a um clipe comum que salva as partes que estão dentro do outro objeto.

Executando clipe reverso no ArcMap? mostra como fazer isso no ArcMap.

Como faço isso em R?

Exemplo reproduzível (em 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")

O que eu quero fazer aqui é salvar todo o Reino Unido, exceto Londres. Visualmente, quero que a forma preta na imagem resultante seja um buraco.

insira a descrição da imagem aqui

Respostas:


4

Resposta para recursos simples:

O pacote sf baseia-se no código-fonte aberto do Geometry Engine e, como tal, pode acessar a lista de comandos como st_within etc.

Um desses comandos, st_difference, fará o trabalho:

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

veja também no final deste artigo

também pode ser feito coagindo Sp a sf com st_as_sf. Preste atenção aos avisos, pois os atributos podem ser difíceis de gerenciar!


12

Parece ser uma aplicação simples gDifferencedo rgeospacote:

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

O aviso de projeção ocorre porque o LondonBoroughsshapefile não possui um .prjarquivo.

Apenas para ter certeza de que é um buraco e não um contorno ou outro polígono sólido:

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

Tão simples, obrigado pela resposta rápida. Estaria interessado em olhar o código fonte dessas funções para ver o que está acontecendo sob o capô.
precisa saber é o seguinte

No fundo, eles só chamar GEOS que é uma biblioteca de código C de funções geometria trac.osgeo.org/geos
Spacedman

Interessante - e ajuda a explicar por que é razoavelmente rápido, eu acho. Com base nesta página, parece que não está sendo desenvolvido ativamente. Alguém pode confirmar / refutar isso? svn.osgeo.org/geos/branches/3.4/ChangeLog
RobinLovelace

1
Com certeza é desenvolvido. Veja a linha do tempo trac.osgeo.org/geos/timeline ou mailing list archives lists.osgeo.org/pipermail/geos-devel
user30184

5

Um pouco atrasado para a festa, mas existe uma maneira simples de fazer isso com a máscara usando o argumento 'inverso';

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

Do pacote raster. E de sf alguma idéia?
precisa saber é o seguinte
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.