буфер і об'єднання в R без зведення до багатокутника


9

Я хотів би виконати просторове накладання для ідентифікації багатокутника, в межах якого падає набір точок. Однак спершу я хочу забуфрувати і розчинити багатокутники, так що точки, що потрапляють де-небудь у злиті багатокутники (але не в межах будь-яких дірок), будуть позначені аналогічно процедурі накладання.

На жаль, процес буферизації та / або розчинення, який я використовую, зводить 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

Відповіді:


7

Виявляється, sp::disaggregateїх можна використовувати, щоб розтягнути одночастинні багатокутники.

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можна їх знову поєднувати.)


3

Я співчуваю, це трохи болить. Ви повинні підірвати прорізи об'єкта багатокутника gBuffer в окремі багатокутники.

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)

Щойно тестували, і це здається багатообіцяючим, але мої отвори вже не дірки :(. Чи можемо ми пристосувати це, щоб зберегти дірки разом з полісами, з якими вони пов’язані? (Я прямував у відповідності з вашою пропозицією, з n <- length(buff@polygons[[1]]@Polygons); SpatialPolygons(mapply(function(x, y) Polygons(list(x), y), buff@polygons[[1]]@Polygons, seq_len(n)))... я мав би згадати про проблему з дірками у публікації, вибачте.
jbaums
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.