Я хотів би виконати просторове накладання для ідентифікації багатокутника, в межах якого падає набір точок. Однак спершу я хочу забуфрувати і розчинити багатокутники, так що точки, що потрапляють де-небудь у злиті багатокутники (але не в межах будь-яких дірок), будуть позначені аналогічно процедурі накладання.
На жаль, процес буферизації та / або розчинення, який я використовую, зводить SpatialPolygons
об'єкт до багатокутника. Використання gBuffer
створює багатокутник коли byid=FALSE
, але не вдається об'єднати перекриваються багатокутники, коли byid=TRUE
. В останньому випадку згодом, розчиняючи багатокутники, gUnaryUnion
знову створюється багатокутник. Накладення SpatialPoints
з цими багатокутниками призводить до того, що всі точки, що містяться, повідомляються про попадання в полігон 1.
Ось пов'язаний приклад іграшки з буферизованими точками, де я хотів би зробити накладку точок з забудованими багатокутниками:
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)
І результати деяких накладок ...
З
byid=FALSE
:b <- gBuffer(pts, width=0.6) over(pts, b) # [1] 1 1 1 1
З
byid=TRUE
:b2 <- gBuffer(pts, width=0.6, byid=TRUE) over(pts, b2) # [1] 1 2 3 4
З
byid=TRUE
та наступнимиgUnaryUnion
:b3 <- gUnaryUnion(b2) over(pts, b3) # [1] 1 1 1 1
Я шукаю правильний метод для досягнення результату 1 1 1 2
, тобто точки 1, 2 і 3 потрапляють під полігон 1 (раніше багатокутники 1, 2 і 3, які були об'єднані), а точка 4 потрапляє в полігон 2 (спочатку багатокутник 4 ).
EDIT
Мої справжні дані містять дірки, і в ідеалі я б хотів їх зберегти. Я оновив наведені вище приклади, щоб включити отвір після буферування.
Застосовуючи підхід @ JeffreyEvans до цих полісів:
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)))
призводить до:
over(pts, b.exploded)
# FID
# 1 2
# 2 2
# 3 2
# 4 1
що є очікуваним результатом (я не надто метушився щодо поліпорядку - 2,2,2,1
проти 1,1,1,2
), але b.exploded
втратив інформацію про отвір, замість цього представляючи його як багатокутний полігон. Це, очевидно, не впливає на результат на прикладі іграшки, але накладка, що включає точки, розташовані в отворі, буде вводити в оману, наприклад:
in_hole <- SpatialPoints(cbind(1.375, 1.5))
over(in_hole, b.exploded)
# FID
# 1 2
:(
. Чи можемо ми пристосувати це, щоб зберегти дірки разом з полісами, з якими вони пов’язані? (Я прямував у відповідності з вашою пропозицією, зn <- length(buff@polygons[[1]]@Polygons); SpatialPolygons(mapply(function(x, y) Polygons(list(x), y), buff@polygons[[1]]@Polygons, seq_len(n)))
... я мав би згадати про проблему з дірками у публікації, вибачте.