从 R sf 中的多边形中删除孔

Posted

技术标签:

【中文标题】从 R sf 中的多边形中删除孔【英文标题】:Removing holes from polygons in R sf 【发布时间】:2019-03-10 07:36:23 【问题描述】:

有没有办法用 sf 包从 R 中的多边形中删除孔?我也会对包含其他软件包的解决方案感兴趣。 这是一个带有两个孔的多边形示例。

library(sf)
outer = matrix(c(0,0,10,0,10,10,0,10,0,0),ncol=2, byrow=TRUE)
hole1 = matrix(c(1,1,1,2,2,2,2,1,1,1),ncol=2, byrow=TRUE)
hole2 = matrix(c(5,5,5,6,6,6,6,5,5,5),ncol=2, byrow=TRUE)
pts = list(outer, hole1, hole2)
(pl1 = st_polygon(pts))
# POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0), (1 1, 1 2, 2 2, 2 1, 1 1),(5 5, 5 6, 6 6, 6 5, 5 5))    

下图:

plot(pl1, col="red")

【问题讨论】:

这样的? gis.stackexchange.com/questions/224048/… 好的,谢谢。现在,sf有类似的解决方案吗? 【参考方案1】:

sfheaders::sf_remove_holes()也可以这样做

sfheaders::sf_remove_holes(pl1)
POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))

【讨论】:

【参考方案2】:

关注https://github.com/r-spatial/sf/issues/609#issuecomment-357426716, 这可以工作:

library(sf)
outer = matrix(c(0,0,10,0,10,10,0,10,0,0),ncol=2, byrow=TRUE)
hole1 = matrix(c(1,1,1,2,2,2,2,1,1,1),ncol=2, byrow=TRUE)
hole2 = matrix(c(5,5,5,6,6,6,6,5,5,5),ncol=2, byrow=TRUE)
pts = list(outer, hole1, hole2)
pl1 = st_geometry(st_polygon(pts))

plot(pl1)

pl2 <- st_multipolygon(lapply(pl1, function(x) x[1]))
plot(pl2)

由reprex package (v0.2.1) 于 2018 年 10 月 5 日创建

【讨论】:

如何将其应用于shapefiles 对象? (我的意思是,删除shapefile 中的孔) @noriega 您可以使用sf::st_read("your_shapefile.shp") 将 sahpefile 加载到 R 中,并使用 Ibusett 建议的方法。 由于 pl1[1],这会创建第一个多边形的 length(pl1)(即 3 个)副本 - 这是有意的吗? @jbaums 你是对的。那是一个错字(现已更正)。另请注意,我必须在pl1 上添加st_geometry 调用才能使其正常工作(需要sfc_POLYGON 对象) 另外,@AF7 报告的功能看起来不错,也更通用,所以我建议用户看看。【参考方案3】:

@lbusett 回答了这个问题后,nngeo 包引入了一个函数来执行此操作(并在描述中引用了他,做得好)。

所以你可以使用:

nngeo::st_remove_holes(your_sf_object)

见https://rdrr.io/cran/nngeo/man/st_remove_holes.html

【讨论】:

以上是关于从 R sf 中的多边形中删除孔的主要内容,如果未能解决你的问题,请参考以下文章

通过R中的sf将经度和纬度序列转换为多边形

如何计算多边形之间的所有成对交互以及 R 中 sf 的百分比覆盖率?

使用 tidyverse + sf R 创建每个多边形的线密度

我有一个 OpenGL 镶嵌球体,我想在其中切一个圆柱形孔

如何从 cv2.findContours 结果中重新创建带有孔的原始图像?

不相交多边形中的点