Cortar polígono e reter dados?


13

Eu tenho esses dois polígonos:

library(sp); library(rgeos); library(maptools)

coords1 <- matrix(c(-1.841960, -1.823464, -1.838623, -1.841960, 55.663696,
                    55.659178, 55.650841, 55.663696), ncol=2)
coords2 <- matrix(c(-1.822606, -1.816790, -1.832712, -1.822606, 55.657887,
                    55.646806, 55.650679, 55.657887), ncol=2)
p1 <- Polygon(coords1)
p2 <- Polygon(coords2)
p1 <- Polygons(list(p1), ID = "p1")
p2 <- Polygons(list(p2), ID = "p2")
myPolys <- SpatialPolygons(list(p1, p2))
spdf1 = SpatialPolygonsDataFrame(myPolys, data.frame(variable1 = c(232,
                                                                   242), variable2 = c(235, 464), row.names = c("p1", "p2")))
proj4string(spdf1) <- CRS("+proj=longlat +datum=WGS84 +ellps=WGS84
+towgs84=0,0,0")
plot(spdf1, col="red")

coords1a <- matrix(c(-1.830219, -1.833753, -1.821154, -1.830219, 55.647353,
                     55.656629, 55.652122, 55.647353), ncol=2)
p1a <- Polygon(coords1a)
p1a <- Polygons(list(p1a), ID = "p1a")
myPolys1 <- SpatialPolygons(list(p1a))
spdf2 = SpatialPolygonsDataFrame(myPolys1, data.frame(variable1 = c(2),
                                                      variable2 = c(3), row.names = c("p1a")))
proj4string(spdf2) <- CRS("+proj=longlat +datum=WGS84 +ellps=WGS84
+towgs84=0,0,0")
plot(spdf2, col="yellow", add=T)

insira a descrição da imagem aqui

Eu quero cortar partes daquelas spdf1que são cruzadas spdf2. No entanto, quero spdf1permanecer como SpatialPolygonsDataFrame e manter todas as informações contidas nele spdf1@data.

Eu tentei o gDifference da seguinte maneira, que corta partes spdf1que são interceptadas por spdf2, mas depois converte spdf1em SpatialPolygons (isto é, descartando as informações contidas em spdf1@data).

gDifference(spdf1, spdf2, byid=T)

Como posso cortar spdf1com spdf2mas manter os dados contidos em spdf1@data? Eu verifiquei e tentei essa pergunta semelhante sem como sobrepor um polígono sobre SpatialPointsDataFrame e preservar os dados SPDF?

Respostas:


9

A abordagem mais simples seria

  library(raster)
  x <- spdf1 - spdf2

  # or, more formally
  y <- erase(spdf1,  spdf2)

Consulte? 'Raster-package' (seção XIV) para obter mais funções que lidam com sobreposição de polígonos. Essas funções usam as funções básicas de rgeos sob o capô, nas funções 'nível de usuário' (em oposição a 'nível de desenvolvedor').


O que você quer dizer com "nas funções 'em nível de usuário' (em oposição a 'nível de desenvolvedor')"?
luciano

rgeosfornece operações geométricas, mas não lida com os atributos dos dados. Portanto, o uso dessas funções requer muito trabalho para manter tudo unido. As funções de varredura simplificar isso e se comportam como funções semelhantes em software GIS,
Robert Hijmans

Sim, mas isso pode levar a erro na SpatialPolygonsDataFrame (parte2, x @ dados [jogo (row.names (parte2),: row.names de dados e polígonos IDs não correspondem
jebyrnes

Isso seria um bug. Você pode dar um exemplo disso?
Robert Hijmans

4

Uma solução alternativa seria adicionar novamente os atributos após fazer o clipe, enquanto fazia a conversão de SpatialPolygonspara SpatialPolygonsDataFrame.

sp3 <- gDifference(spdf1, spdf2, byid = TRUE)
row.names(sp3) <- row.names(spdf1)

spdf3 <- SpatialPolygonsDataFrame(sp3, data = spdf1@data)

spdf3@data

   variable1 variable2
p1       232       235
p2       242       464

plot(spdf3, col="red")

insira a descrição da imagem aqui


Isso parece um problema que tenho, apenas o clipe de saída em minha instância específica produz nomes de nomes de spdf1 que não existem (como um simples gsub para se livrar do segundo dígito na linha. Nomes devem cuidar da correspondência de nomes de nomes, não? )
jebyrnes

Erro no SpatialPolygonsDataFrame (clip, data = as.data.frame (all_spdfs_together @ data)): Incompatibilidade de comprimento do objeto: o clipe possui 1718 objetos Polygons, mas o as.data.frame (all_spdfs_together @ data) possui 86 linhas
jebyrnes

Claro - eu tenho um monte de polígonos de coisas no oceano. Alguns são colocados incorretamente em terra ou se sobrepõem à terra. Quero recortar isso para ter apenas áreas que estão no oceano. Eu tenho um shapefile no litoral para comparar. Aqui está o código - gist.github.com/jebyrnes/c2e8d2b6c82849dad3a813d952ab8bb0
jebyrnes

1
deixa pra lá - as obras solução raster :: erase (que não tinha antes por algum motivo estranho)
jebyrnes
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.