Vorrei eseguire una sovrapposizione spaziale per identificare il poligono all'interno del quale rientrano una serie di punti. Tuttavia, per prima cosa voglio bufferizzare e dissolvere i poligoni, in modo tale che i punti che ricadono ovunque all'interno dei poligoni uniti (ma non all'interno di alcun foro) saranno etichettati in modo simile dalla procedura di sovrapposizione.
Sfortunatamente, il processo di buffering e / o dissolvenza che sto usando sta riducendo l' SpatialPolygons
oggetto a un poligono. L'uso di gBuffer
crea un poligono multiplo quando byid=FALSE
, ma non riesce a unire poligoni sovrapposti quando byid=TRUE
. In quest'ultimo caso, la successiva dissoluzione dei poligoni con gUnaryUnion
nuovamente crea un poligono. La sovrapposizione SpatialPoints
con questi poligonali comporta la segnalazione di tutti i punti contenuti come rientranti nel poligono 1.
Ecco un esempio di giocattolo correlato con punti bufferizzati, in cui mi piacerebbe fare una sovrapposizione dei punti con i poligoni bufferati:
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)
E i risultati di alcuni overlay ...
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
e successivegUnaryUnion
:b3 <- gUnaryUnion(b2) over(pts, b3) # [1] 1 1 1 1
Sto cercando il metodo corretto per ottenere il risultato 1 1 1 2
, ovvero i punti 1, 2 e 3 rientrano nel poligono 1 (precedentemente poligoni 1, 2 e 3, che sono stati uniti) e il punto 4 rientra nel poligono 2 (originariamente poligono 4 ).
MODIFICARE
I miei dati reali includono buchi, e idealmente mi piacerebbe essere in grado di conservarli. Ho aggiornato i dati di esempio sopra per includere un buco dopo il buffering.
Applicando l'approccio di @ JeffreyEvans a questi polis:
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)))
risulta in:
over(pts, b.exploded)
# FID
# 1 2
# 2 2
# 3 2
# 4 1
che è il risultato atteso (non sono troppo agitato per il poli ordine - 2,2,2,1
vs. 1,1,1,2
), ma b.exploded
ha perso le informazioni sul buco, invece di rappresentarlo come un poligono non buco. Ovviamente non influisce sul risultato dell'esempio di giocattolo, ma una sovrapposizione che coinvolge punti situati nel foro sarà fuorviante, ad esempio:
in_hole <- SpatialPoints(cbind(1.375, 1.5))
over(in_hole, b.exploded)
# FID
# 1 2
:(
. Possiamo adattare questo per mantenere i buchi insieme ai polis a cui sono associati? (Mi stavo muovendo in modo simile al tuo suggerimento, conn <- length(buff@polygons[[1]]@Polygons); SpatialPolygons(mapply(function(x, y) Polygons(list(x), y), buff@polygons[[1]]@Polygons, seq_len(n)))
... Avrei dovuto menzionare il problema del buco nel post, scusa.