คลิปรูปหลายเหลี่ยมและเก็บข้อมูลหรือไม่


13

ฉันมีรูปหลายเหลี่ยมสองรูปนี้:

library(sp); library(rgeos); library(maptools)

coords1 <- matrix(c(-1.841960, -1.823464, -1.838623, -1.841960, 55.663696,
                    55.659178, 55.650841, 55.663696), ncol=2)
coords2 <- matrix(c(-1.822606, -1.816790, -1.832712, -1.822606, 55.657887,
                    55.646806, 55.650679, 55.657887), ncol=2)
p1 <- Polygon(coords1)
p2 <- Polygon(coords2)
p1 <- Polygons(list(p1), ID = "p1")
p2 <- Polygons(list(p2), ID = "p2")
myPolys <- SpatialPolygons(list(p1, p2))
spdf1 = SpatialPolygonsDataFrame(myPolys, data.frame(variable1 = c(232,
                                                                   242), variable2 = c(235, 464), row.names = c("p1", "p2")))
proj4string(spdf1) <- CRS("+proj=longlat +datum=WGS84 +ellps=WGS84
+towgs84=0,0,0")
plot(spdf1, col="red")

coords1a <- matrix(c(-1.830219, -1.833753, -1.821154, -1.830219, 55.647353,
                     55.656629, 55.652122, 55.647353), ncol=2)
p1a <- Polygon(coords1a)
p1a <- Polygons(list(p1a), ID = "p1a")
myPolys1 <- SpatialPolygons(list(p1a))
spdf2 = SpatialPolygonsDataFrame(myPolys1, data.frame(variable1 = c(2),
                                                      variable2 = c(3), row.names = c("p1a")))
proj4string(spdf2) <- CRS("+proj=longlat +datum=WGS84 +ellps=WGS84
+towgs84=0,0,0")
plot(spdf2, col="yellow", add=T)

ป้อนคำอธิบายรูปภาพที่นี่

ฉันต้องการที่จะตัดออกจากส่วนของที่ได้รับการตัดโดยspdf1 spdf2แต่ผมต้องการที่spdf1จะยังคงเป็น SpatialPolygonsDataFrame และจะเก็บข้อมูลใด ๆ spdf1@dataที่มีอยู่ภายใน

ฉันได้ลองใช้ gDifference ดังต่อไปนี้ซึ่งตัดบางส่วนของspdf1ที่ถูกตัดกันด้วยspdf2แต่จากนั้นจะแปลงspdf1เป็น SpatialPolygons (เช่นการละทิ้งข้อมูลที่มีอยู่spdf1@data)

gDifference(spdf1, spdf2, byid=T)

ฉันจะตัดspdf1ต่อspdf2แต่เก็บข้อมูลที่มีอยู่ได้spdf1@dataอย่างไร ฉันได้ตรวจสอบและลองคำถามที่คล้ายกันนี้แล้วโดยไม่ต้องซ้อนโพลีกอนทับ SpatialPointsDataFrame และเก็บรักษาข้อมูล SPDF ไว้อย่างไร

คำตอบ:


9

วิธีที่ง่ายที่สุดก็คือ

  library(raster)
  x <- spdf1 - spdf2

  # or, more formally
  y <- erase(spdf1,  spdf2)

เห็นไหม? 'แพ็คเกจแรสเตอร์' (ส่วนที่สิบสี่) สำหรับฟังก์ชั่นเพิ่มเติมที่เกี่ยวข้องกับการซ้อนทับหลายเหลี่ยม ฟังก์ชั่นเหล่านี้ใช้ฟังก์ชั่นพื้นฐานของ rgeos ภายใต้ประทุนในฟังก์ชั่น 'ระดับผู้ใช้' (ตรงข้ามกับฟังก์ชั่น 'ระดับผู้พัฒนา')


คุณหมายถึงอะไรโดย "ใน" ฟังก์ชั่น 'ระดับผู้ใช้' (ตรงข้ามกับฟังก์ชั่น 'ระดับผู้พัฒนา') '?
luciano

rgeosให้การดำเนินการทางเรขาคณิต แต่ไม่ได้จัดการกับคุณลักษณะของข้อมูล ดังนั้นการใช้ฟังก์ชั่นเหล่านี้จึงจำเป็นต้องใช้แรงงานจำนวนมาก ฟังก์ชั่นแรสเตอร์ทำให้สิ่งนี้ง่ายขึ้นและการทำงานคล้ายกับฟังก์ชั่นที่คล้ายกันในซอฟต์แวร์ GIS
Robert Hijmans

ใช่ แต่สิ่งนี้อาจนำไปสู่ข้อผิดพลาดใน SpatialPolygonsDataFrame (ตอนที่ 2, x @ data [การจับคู่ (row.names (ตอนที่ 2)): แถวชื่อของข้อมูลและหมายเลข
โพลีออ

นั่นจะเป็นข้อผิดพลาด คุณสามารถแสดงตัวอย่างของสิ่งนั้นได้หรือไม่?
Robert Hijmans

4

การแก้ปัญหาก็จะไปอีกครั้งเพิ่มแอตทริบิวต์หลังจากทำคลิปขณะที่การแปลงจากไปSpatialPolygonsSpatialPolygonsDataFrame

sp3 <- gDifference(spdf1, spdf2, byid = TRUE)
row.names(sp3) <- row.names(spdf1)

spdf3 <- SpatialPolygonsDataFrame(sp3, data = spdf1@data)

spdf3@data

   variable1 variable2
p1       232       235
p2       242       464

plot(spdf3, col="red")

ป้อนคำอธิบายรูปภาพที่นี่


ดูเหมือนว่าฉันจะมีปัญหาเฉพาะคลิปผลลัพธ์ในตัวอย่างของฉันเท่านั้นที่สร้าง rownames จาก spdf1 ที่ไม่มีอยู่ (ในฐานะ gsub ทั่วไปเพื่อกำจัดตัวเลขที่ 2 ใน row.names ควรดูแลการจับคู่ rownames ไม่ใช่หรือไม่? )
jebyrnes

ข้อผิดพลาดใน SpatialPolygonsDataFrame (คลิปข้อมูล = as.data.frame (all_spdfs_together @ data)): ไม่ตรงกันความยาวของวัตถุ: คลิปมีวัตถุ 1718 รูปหลายเหลี่ยม แต่ as.data.frame (all_spdfs_together @ data) มี 86 แถว
jebyrnes

แน่นอน - ฉันมีรูปหลายเหลี่ยมหลายอย่างในมหาสมุทร บางคนวางอย่างไม่ถูกต้องบนบกหรือทับซ้อนกับที่ดิน ฉันต้องการตัดออกเพื่อให้ฉันมีพื้นที่ที่อยู่ในมหาสมุทรเท่านั้น ฉันมีไฟล์รูปร่างชายฝั่งเพื่อเปรียบเทียบ นี่คือรหัส - gist.github.com/jebyrnes/c2e8d2b6c82849dad3a813d952ab8bb0
jebyrnes

1
ไม่เป็นไร - ผลงานการแก้ปัญหาแรสเตอร์ :: ลบ (มันไม่ได้ก่อนด้วยเหตุผลบางอย่างแปลก)
jebyrnes
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.