ย้อนกลับการคลิป (การลบ) ใน R หรือไม่


14

คลิปย้อนกลับบันทึกเฉพาะส่วนของวัตถุอวกาศของคุณที่อยู่นอก ขอบเขตของวัตถุอื่นซึ่งตรงข้ามกับคลิปปกติที่บันทึกชิ้นส่วนที่อยู่ภายในวัตถุอื่น

กำลังแสดงคลิปย้อนกลับใน ArcMap? แสดงวิธีการทำใน ArcMap

ฉันจะทำสิ่งนี้ใน R ได้อย่างไร

ตัวอย่างที่ทำซ้ำได้ (บนเครื่อง Linux):

system("wget 'https://github.com/Robinlovelace/Creating-maps-in-R/archive/master.zip' -P /tmp/")
unzip("/tmp/master.zip", exdir = "/tmp/master")
uk <- readOGR("/tmp/master/Creating-maps-in-R-master/data/", "ukbord")
lnd <- readOGR("/tmp/master/Creating-maps-in-R-master/data/", "LondonBoroughs")
plot(uk)
plot(lnd, add = T, col = "black")

สิ่งที่ฉันต้องการทำที่นี่คือบันทึกสหราชอาณาจักรทั้งหมดยกเว้นลอนดอน สายตาฉันต้องการให้รูปร่างสีดำในภาพที่ปรากฏเป็นรู

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

คำตอบ:


4

คำตอบสำหรับคุณสมบัติที่เรียบง่าย:

แพคเกจ sf วาดบน Geometry Engine Open Source และสามารถเข้าถึงรายการคำสั่งเช่น st_within เป็นต้น

หนึ่งคำสั่งดังกล่าว st_difference จะทำงาน:

require(sf)

# make a square simple feature
s <- rbind(c(1,1), c(1,5), c(5,5), c(5,1), c(1,1))
s.sf <-st_sfc(st_polygon(list(s)))
s.pol = st_sf(ID = "sq", s.sf)

# make a smaller triangle simple feature
s2 <- rbind(c(2,2), c(3,4), c(4,2), c(2,2))
s2.sf <-st_sfc(st_polygon(list(s2)))
s2.pol = st_sf(ID = "tr", s2.sf)

# find the 'difference', i.e. reverse of st_intersection
t <- st_difference(s.pol,s2.pol)

plot(t)

# have a look at the new geometry, a well known text format with exterior followed by hole
st_geometry(t)[[1]]
POLYGON((1 1, 1 5, 5 5, 5 1, 1 1), (2 2, 4 2, 3 4, 2 2))

ดูที่ด้านล่างของบทความนี้

สามารถทำได้โดยการบังคับ Sp ให้ sf ด้วย st_as_sf ฟังคำเตือนในลักษณะที่จะจัดการได้ยาก!


12

ดูเหมือนว่าจะเป็นแอปพลิเคชันที่เรียบง่ายของgDifferenceจากrgeosแพคเกจ:

> require(rgeos)
> ukhole = gDifference(uk, lnd)
Warning message:
In RGEOSBinTopoFunc(spgeom1, spgeom2, byid, id, "rgeos_difference") :
  spgeom1 and spgeom2 have different proj4 strings
> plot(ukhole)

คำเตือนในการฉายภาพเป็นเพราะLondonBoroughsshapefile ไม่มี.prjไฟล์

เพื่อให้แน่ใจว่าเป็นรูและไม่ใช่โครงร่างหรือรูปหลายเหลี่ยมที่เป็นของแข็งอื่น:

> gArea(lnd) + gArea(ukhole) - gArea(uk)
[1] 0

ง่ายมากขอบคุณสำหรับการตอบสนองที่รวดเร็ว จะสนใจที่จะดูซอร์สโค้ดของฟังก์ชั่นเหล่านี้เพื่อดูว่าเกิดอะไรขึ้นภายใต้ประทุน
RobinLovelace

ลึกลงไปพวกเขาเพียงแค่เรียก GEOS ซึ่งเป็นห้องสมุด C-code ของฟังก์ชันเรขาคณิตtrac.osgeo.org/geos
Spacedman

น่าสนใจ - และช่วยอธิบายว่าทำไมฉันจึงเดาได้อย่างรวดเร็ว จากหน้านี้ดูเหมือนว่าจะไม่มีการพัฒนาอย่างแข็งขันใครสามารถยืนยัน / ปฏิเสธได้? svn.osgeo.org/geos/branches/3.4/ChangeLog
RobinLovelace

1
แน่นอนว่ามันได้รับการพัฒนา ดูไทม์ไลน์trac.osgeo.org/geos/timelineหรือรายการจดหมายข่าวที่เก็บถาวรรายชื่อosgeo.org/pipermail/geos-devel
30184

5

ปาร์ตี้ช้าไปหน่อย แต่มีวิธีง่าย ๆ ในการใช้หน้ากากโดยใช้อาร์กิวเมนต์ 'inverse';

ukhole <- mask(uk, lnd, inverse = TRUE)

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