Me gustaría realizar una superposición espacial para identificar el polígono dentro del cual cae un conjunto de puntos. Sin embargo, primero quiero amortiguar y disolver los polígonos, de modo que los puntos que caen en cualquier lugar dentro de los polígonos fusionados (pero no dentro de ningún agujero) se etiquetarán de manera similar por el procedimiento de superposición.
Desafortunadamente, el proceso de amortiguación y / o disolución que estoy usando está reduciendo el SpatialPolygons
objeto a un polígono múltiple. El uso gBuffer
crea un polígono múltiple cuando byid=FALSE
, pero no une polígonos superpuestos cuando byid=TRUE
. En el último caso, la disolución posterior de polígonos con gUnaryUnion
nuevamente crea un polígono múltiple. La superposición SpatialPoints
de estos resultados con múltiples polígonos hace que todos los puntos contenidos se informen como pertenecientes al polígono 1.
Aquí hay un ejemplo de juguete relacionado con puntos almacenados, donde me gustaría hacer una superposición de los puntos con los polígonos almacenados:
library(sp)
library(rgeos)
pts <- SpatialPoints(cbind(c(1, 1, 2, 3), c(1, 2, 1.5, 2.5)))
plot(gBuffer(pts, width=0.6), lwd=2)
points(pts, pch=20, cex=2)
text(coordinates(pts), labels=seq_len(length(pts)), pos=4, font=2)
Y los resultados de algunas superposiciones ...
Con
byid=FALSE
:b <- gBuffer(pts, width=0.6) over(pts, b) # [1] 1 1 1 1
Con
byid=TRUE
:b2 <- gBuffer(pts, width=0.6, byid=TRUE) over(pts, b2) # [1] 1 2 3 4
Con
byid=TRUE
y subsecuentegUnaryUnion
:b3 <- gUnaryUnion(b2) over(pts, b3) # [1] 1 1 1 1
Estoy buscando el método correcto para lograr el resultado 1 1 1 2
, es decir, los puntos 1, 2 y 3 caen dentro del polígono 1 (anteriormente polígonos 1, 2 y 3, que se han fusionado), y el punto 4 cae dentro del polígono 2 (originalmente polígono 4 )
EDITAR
Mis datos verdaderos incluyen agujeros, e idealmente me gustaría poder conservarlos. He actualizado los datos de ejemplo anteriores para incluir un agujero después del almacenamiento en búfer.
Aplicando el enfoque de @ JeffreyEvans a estas políticas:
polys <- b@polygons[[1]]@Polygons
pl <- vector("list", length(polys))
for (i in 1:length(polys)) { pl[i] <- Polygons(list(polys[[i]]), i) }
b.spolys <- SpatialPolygons(pl)
row.ids <- sapply(slot(b.spolys, "polygons"), function(i) slot(i, "ID"))
b.exploded <- SpatialPolygonsDataFrame(b.spolys, data.frame(FID=as.numeric(row.ids)))
resultados en:
over(pts, b.exploded)
# FID
# 1 2
# 2 2
# 3 2
# 4 1
cuál es el resultado esperado (no estoy demasiado preocupado por el orden polivinílico - 2,2,2,1
vs. 1,1,1,2
), pero b.exploded
ha perdido la información sobre el agujero, en su lugar, lo representa como un polígono sin agujero. Obviamente, no afecta el resultado del ejemplo del juguete, pero una superposición que involucra puntos ubicados en el hoyo será engañosa, por ejemplo:
in_hole <- SpatialPoints(cbind(1.375, 1.5))
over(in_hole, b.exploded)
# FID
# 1 2
:(
. ¿Podemos adaptar esto para mantener los agujeros junto con los polys con los que están asociados? (Me dirigía a lo largo de líneas similares a su sugerencia, conn <- length(buff@polygons[[1]]@Polygons); SpatialPolygons(mapply(function(x, y) Polygons(list(x), y), buff@polygons[[1]]@Polygons, seq_len(n)))
... Debería haber mencionado el problema del agujero en la publicación, lo siento.