çoklu poligona indirgenmeden R'de tampon ve birleşim


9

İçinde bir dizi noktanın düştüğü çokgeni tanımlamak için uzamsal bir bindirme yapmak istiyorum. Bununla birlikte, ilk önce çokgenleri tamponlamak ve çözmek istiyorum, böylece birleştirilmiş çokgenler içinde herhangi bir yere düşen noktalar (ancak herhangi bir delik içinde değil) üst üste bindirme prosedürü ile benzer şekilde etiketlenecektir.

Ne yazık ki, kullandığım tamponlama ve / veya çözme işlemi, SpatialPolygonsnesneyi çokgen haline indirgiyor. Kullanmak gBufferzaman çok çokgen oluşturur byid=FALSE, ancak çakışan çokgenleri ne zaman birleştiremezse byid=TRUE. İkinci durumda, daha sonra çokgenlerin gUnaryUniontekrar eritilmesi çok poligon oluşturur. SpatialPointsBu çok-çokgen ile üst üste bindirme , içerilen tüm noktaların çokgen 1 içine düştüğü bildirilmektedir.

Burada, tamponlu noktalarla ilgili bir oyuncak örneği, tamponlanmış çokgenlerle noktaların bir bindirmesini yapmak istiyorum:

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)

resim açıklamasını buraya girin

Ve bazı kaplamaların sonuçları ...

  • İle byid=FALSE:

    b <- gBuffer(pts, width=0.6) 
    over(pts, b)
    # [1] 1 1 1 1
    
  • İle byid=TRUE:

    b2 <- gBuffer(pts, width=0.6, byid=TRUE) 
    over(pts, b2)
    # [1] 1 2 3 4
    
  • Birlikte byid=TRUEve daha sonra gUnaryUnion:

    b3 <- gUnaryUnion(b2)
    over(pts, b3)
    # [1] 1 1 1 1
    

Sonucu elde etmek için doğru yöntemi arıyorum 1 1 1 2, yani 1, 2 ve 3 noktaları çokgen 1 (daha önce birleştirilen çokgenler 1, 2 ve 3) içine düşüyor ve nokta 4 çokgen 2 (başlangıçta çokgen 4) içine düşüyor ).


DÜZENLE

Gerçek verilerim delikler içeriyor ve ideal olarak onları korumak istiyorum. Arabelleğe aldıktan sonra bir delik eklemek için yukarıdaki örnek verileri güncelledim.

@ JeffreyEvans'ın bu polilere yaklaşımını uygulamak:

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))) 

sonuç:

over(pts, b.exploded)

#   FID
# 1   2
# 2   2
# 3   2
# 4   1

Bu beklenen sonuçtur (poli sırası hakkında çok fazla karışıklık yapmadım - 2,2,2,1vs. 1,1,1,2), ancak b.explodeddelikle ilgili bir çokgen olarak temsil eden delik hakkındaki bilgileri kaybetti. Açıkçası oyuncak örneğinin sonucunu etkilemez, ancak delikte bulunan noktaları içeren bir kaplama yanıltıcı olacaktır, örneğin:

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

Yanıtlar:


7

Tek sp::disaggregateparçalı çokgenleri ayırmak için kullanılabileceği ortaya çıktı .

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::aggregatetekrar birleştirmek için kullanılabilir.)


3

Sempatikim, bu biraz acı. GBuffer çokgen nesnesinin yuvalarını tek tek çokgenlere patlatmanız gerekir.

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)

Sadece test ettim ve umut verici görünüyor, ancak benim deliklerim artık delik değil :(. Delikleri ilişkili oldukları polislerle birlikte tutmak için uyarlayabilir miyiz? (Senin öneride olduğu gibi aynı çizgide ilerliyordum, n <- length(buff@polygons[[1]]@Polygons); SpatialPolygons(mapply(function(x, y) Polygons(list(x), y), buff@polygons[[1]]@Polygons, seq_len(n)))ben ...
Yazıdaki
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.