Cắt ngược (xóa) trong R?


14

Một clip ngược chỉ lưu lại một phần của đối tượng không gian của bạn nằm ngoài giới hạn của một đối tượng khác, trái ngược với một clip thông thường lưu các phần bên trong đối tượng khác.

Thực hiện clip đảo ngược trong ArcMap? chỉ ra cách thực hiện trong ArcMap.

Làm thế nào để tôi làm điều này trong R?

Ví dụ sinh sản (trên máy 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")

Điều tôi muốn ở đây là làm để cứu tất cả Vương quốc Anh ngoại trừ London. Trực quan, tôi muốn hình dạng màu đen trong hình ảnh kết quả là một lỗ.

nhập mô tả hình ảnh ở đây

Câu trả lời:


4

Trả lời cho các tính năng đơn giản:

Gói sf dựa trên Mã nguồn mở của Geometry Engine và như vậy có thể truy cập danh sách các lệnh như st_within, v.v.

Một lệnh như vậy, st_difference, sẽ thực hiện công việc:

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

cũng nhìn về phía dưới của bài viết này

cũng có thể được thực hiện bằng cách ép Sp vào sf với st_as_sf. Hãy chú ý đến các cảnh báo vì các thuộc tính có thể khó quản lý!


12

Có vẻ là một ứng dụng đơn giản gDifferencetừ rgeosgói:

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

Cảnh báo chiếu là do LondonBoroughsshapefile không có .prjtệp.

Chỉ để đảm bảo rằng đó là một lỗ hổng và không phải là một phác thảo hoặc một đa giác rắn khác:

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

Sooo đơn giản, cảm ơn vì phản ứng nhanh. Sẽ quan tâm đến việc xem mã nguồn của các chức năng này để xem những gì đang diễn ra dưới mui xe.
RobinLigsace

Sâu xa hơn, họ chỉ gọi GEOS là thư viện mã C của các hàm hình học trac.osgeo.org/geos
Spacesman

Thú vị - và giúp giải thích lý do tại sao nó nhanh chóng hợp lý tôi đoán. Dựa trên trang này, có vẻ như nó không được phát triển tích cực, bất cứ ai cũng có thể xác nhận / bác bỏ điều này? svn.osgeo.org/geos/branches/3.4/ChangeLog
RobinLigsace

1
Để chắc chắn nó được phát triển. Xem dòng thời gian trac.osgeo.org/geos/timeline hoặc danh sách gửi thư lưu trữ danh sách.osgeo.org/pipermail/geos
devel

5

Bit đến bữa tiệc muộn, nhưng có một cách đơn giản để làm điều này với mặt nạ bằng cách sử dụng đối số 'nghịch đảo';

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

Từ gói raster. Và từ sf có ý tưởng gì không?
RobinLigsace
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.