9 votos

búfer y de la unión en R sin la reducción a un sistema de multi-polígono

Me gustaría realizar una superposición espacial para identificar el polígono en el que un conjunto de puntos de caída. Sin embargo, en primer lugar quiero búfer y disolver los polígonos, de tal manera que los puntos de caer en cualquier lugar dentro de fusionó polígonos (pero no dentro de los agujeros) serán etiquetados de manera similar por la superposición de procedimiento.

Por desgracia, el almacenamiento y/o proceso de disolución estoy usando es la reducción de la SpatialPolygons objeto a una multi-polígono. El uso de gBuffer crea un multi-polígono cuando byid=FALSE, pero no de la unión de la superposición de polígonos cuando byid=TRUE. En el último caso, posteriormente, la disolución de los polígonos con gUnaryUnion crea de nuevo un multi-polígono. La superposición SpatialPoints con estos multi-polígono resultados en todos los contenidos de puntos de ser reportado como caigan dentro del polígono 1.

He aquí una de juguetes relacionados con el ejemplo, con el búfer puntos, donde me gustaría hacer una superposición de los puntos con el búfer de polígonos:

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)

enter image description here

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 la subsiguiente gUnaryUnion:

    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 de caer dentro del polígono 1 (anteriormente polígonos 1, 2, y 3, que han sido combinados), y el punto 4, cae dentro del polígono 2 (originalmente polígono 4).


EDITAR

Mi verdadero datos incluyen los agujeros, y lo ideal sería que me gustaría ser capaz de conservarlos. He actualizado los datos del ejemplo anterior para incluir un agujero después de que el almacenamiento en búfer.

La aplicación de @JeffreyEvans enfoque de estos polígonos:

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

que es el resultado esperado (no estoy demasiado mimados acerca de la poli orden - 2,2,2,1 vs 1,1,1,2), pero b.exploded ha perdido la información sobre el agujero, en vez representa como un agujero polígono. Es evidente que no se afectará el resultado para el juguete ejemplo, pero una superposición que implican puntos situados en el agujero será engañoso, por ejemplo:

in_hole <- SpatialPoints(cbind(1.375, 1.5))
over(in_hole, b.exploded)
#   FID
# 1   2

7voto

Adam Lassek Puntos 18918

Resulta que sp::disaggregate puede ser utilizado para separar el singlepart polígonos.

pts <- SpatialPoints(cbind(c(1, 1, 2, 3), c(1, 2, 1.5, 2.5))) 
b <- gBuffer(pts, width=0.6) 
over(pts, disaggregate(b))

# [1] 1 1 1 2

in_hole <- SpatialPoints(cbind(1.375, 1.5))
over(in_hole, disaggregate(b))

# [1] NA

(raster::aggregate puede ser utilizado para combinar de nuevo.)

3voto

Dan Puntos 16

Estoy de acuerdo, esto es un poco de un dolor. Tienes que explotar las ranuras, de la gBuffer objeto poligonal, en polígonos individuales.

require(sp)
require(rgeos)
pts <- SpatialPoints(cbind(c(1, 1, 3), c(1, 2, 3))) 

b <- gBuffer(pts, width=0.6)

over(pts, b)

###########################################################
# explodes slots into individual polygons
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 <- SpatialPolygonsDataFrame(b.spolys, data.frame(FID=as.numeric(row.ids)) ) 
###########################################################

over(pts, b)

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X