¿Recortar polígono y retener datos?

13

Tengo estos dos 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)

ingrese la descripción de la imagen aquí

Quiero cortar partes de spdf1eso por las que se cruzan spdf2. Sin embargo, quiero spdf1permanecer como SpatialPolygonsDataFrame y retener cualquier información contenida en él spdf1@data.

He intentado gDifference de la siguiente manera, que corta partes de las spdf1cuales están intersectadas por spdf2, pero luego se convierte spdf1en Polígonos Espaciales (es decir, descartando la información contenida en spdf1@data).

gDifference(spdf1, spdf2, byid=T)

¿Cómo puedo cortar en spdf1con spdf2, pero conservan los datos contenidos en spdf1@data? ¿He comprobado e intentado esta pregunta similar sin cómo superponer un polígono sobre SpatialPointsDataFrame y preservar los datos SPDF?

luciano
fuente

Respuestas:

9

El enfoque más simple sería

  library(raster)
  x <- spdf1 - spdf2

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

Ver? 'Raster-package' (sección XIV) para más funciones relacionadas con la superposición de polígonos. Estas funciones utilizan las funciones básicas de rgeos debajo del capó, en funciones de 'nivel de usuario' (en oposición a 'nivel de desarrollador').

Robert Hijmans
fuente
¿Qué quiere decir con "en 'funciones de' nivel de usuario '(en oposición a' nivel de desarrollador ')?
luciano
rgeosproporciona operaciones geométricas pero no trata con los atributos de los datos. Por lo tanto, el uso de estas funciones requiere mucho trabajo para mantener todo junto. Las funciones ráster simplifican esto y se comportan como funciones similares en el software SIG.
Robert Hijmans
Sí, pero esto puede conducir a un error en SpatialPolygonsDataFrame (part2, x @ data [match (row.names (part2),: row.names of data and Polygons IDs not match
jebyrnes
Eso sería un error. ¿Puedes dar un ejemplo de eso?
Robert Hijmans el
4

Una solución alternativa sería volver a agregar los atributos después de hacer el clip, mientras se convierte de SpatialPolygonsa 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")

ingrese la descripción de la imagen aquí

Andre Silva
fuente
Esto parece un problema que tengo, solo el clip de salida en mi instancia particular produce nombres de fila de spdf1 que no existen (como un simple gsub para deshacerse del segundo dígito en la fila. Nombres deberían ocuparse de la coincidencia de los nombres de fila, ¿no? )
jebyrnes
Error en SpatialPolygonsDataFrame (clip, data = as.data.frame (all_spdfs_together @ data)): Discrepancia en la longitud del objeto: clip tiene 1718 objetos Polygons, pero as.data.frame (all_spdfs_together @ data) tiene 86 filas
jebyrnes
Claro, tengo un montón de polígonos de cosas en el océano. Algunos se colocan incorrectamente en tierra o se superponen con tierra. Quiero recortar eso, así que solo tengo áreas que están en el océano. Tengo un archivo de forma de costa contra el que comparar. Aquí está el código: gist.github.com/jebyrnes/c2e8d2b6c82849dad3a813d952ab8bb0
jebyrnes el
1
no importa - la solución raster :: erase funciona (no lo había hecho antes por alguna extraña razón)
jebyrnes