บัฟเฟอร์และการรวมใน 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 )


แก้ไข

ข้อมูลที่แท้จริงของฉันมีรูอยู่และฉันก็อยากจะอนุรักษ์พวกเขาไว้ ฉันได้อัปเดตข้อมูลตัวอย่างด้านบนเพื่อรวมรูหลังจากบัฟเฟอร์แล้ว

การใช้แนวทางของ @ JeffreyEvans กับ polys เหล่านี้:

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)

จะมีเพียงการทดสอบและดูเหมือนว่ามีแนวโน้ม :(แต่หลุมของฉันหลุมไม่ เราสามารถดัดแปลงสิ่งนี้เพื่อรักษารูพร้อมกับ polys ที่เกี่ยวข้องได้หรือไม่? (ผมกำลังมุ่งหน้าไปตามเส้นที่คล้ายกันเป็นคำแนะนำของคุณด้วยn <- length(buff@polygons[[1]]@Polygons); SpatialPolygons(mapply(function(x, y) Polygons(list(x), y), buff@polygons[[1]]@Polygons, seq_len(n)))... ฉันควรจะได้กล่าวถึงปัญหาหลุมในการโพสต์ขอโทษ.
jbaums
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.