ฉันต้องการแสดงภาพซ้อนทับเชิงพื้นที่เพื่อระบุรูปหลายเหลี่ยมที่มีจุดตก อย่างไรก็ตามก่อนอื่นฉันต้องการบัฟเฟอร์และยุบรูปหลายเหลี่ยมดังกล่าวที่จุดตกที่ใดก็ได้ภายในรูปหลายเหลี่ยมผสาน (แต่ไม่ได้อยู่ในหลุมใด ๆ ) จะถูกติดป้ายคล้ายกันโดยขั้นตอนการซ้อนทับ
น่าเสียดายที่กระบวนการบัฟเฟอร์และ / หรือการละลายที่ใช้อยู่นั้นเป็นการลด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
:(
แต่หลุมของฉันหลุมไม่ เราสามารถดัดแปลงสิ่งนี้เพื่อรักษารูพร้อมกับ polys ที่เกี่ยวข้องได้หรือไม่? (ผมกำลังมุ่งหน้าไปตามเส้นที่คล้ายกันเป็นคำแนะนำของคุณด้วยn <- length(buff@polygons[[1]]@Polygons); SpatialPolygons(mapply(function(x, y) Polygons(list(x), y), buff@polygons[[1]]@Polygons, seq_len(n)))
... ฉันควรจะได้กล่าวถึงปัญหาหลุมในการโพสต์ขอโทษ.