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

我要在这里做的是保存伦敦以外的整个英国。视觉上,我希望结果图像中的黑色形状是一个孔。

在此处输入图片说明

Answers:


4

简单功能的答案:

sf包使用Geometry Engine开放源代码,因此可以访问命令列表,例如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))

也请参阅本文的底部

也可以通过使用st_as_sf将Sp强制为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 2014年

在最深处,他们只调用GEOS,这是几何函数的C代码库trac.osgeo.org/geos
Spacedman 2014年

有趣-并有助于解释为什么我猜它相当快。根据此页面,似乎没有积极地进行开发,任何人都可以确认/驳斥吗?svn.osgeo.org/geos/branches/3.4/ChangeLog
RobinLovelace 2014年

1
可以肯定的是它已经开发出来了。请参阅时间轴trac.osgeo.org/geos/timeline或邮件列表档案list.osgeo.org/pipermail/geos-devel
user30184 2014年

5

参加聚会有点晚,但是有一个简单的方法可以使用'inverse'参数使用遮罩来实现。

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

来自栅格数据包。还有任何想法?
RobinLovelace
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.