R语言sf包:如何识别空心几何体外边界内的完全包含几何体
解决方案:识别并合并处于带孔洞多边形外边界内的几何体
针对带孔洞多边形的空间判断需求,核心思路是先提取目标多边形的无孔洞外边界,再基于此筛选出完全处于外边界内部的几何体,最后完成合并操作。
问题原因
st_contains(geom1, geom2)返回FALSE:带孔洞多边形的"内部"定义不包含孔洞区域,geom2处于孔洞中,因此不被geom1判定为包含。st_intersects(geom1, sf_data$geometry)会同时选中geom2和geom3:geom3与geom1的边界顶点相交,满足相交判定条件。
实现步骤
- 提取外边界多边形:sf中多边形的第一个环为外边界,后续环是孔洞,单独提取外边界生成无孔洞多边形。
- 筛选目标几何体:用空间关系函数判断哪些几何体完全处于外边界内部,排除触碰边界的geom3。
- 合并几何体:将geom1与筛选出的geom2合并。
完整代码
library(sf) # 创建示例数据 geom1 <- st_polygon(list( rbind(c(0, 0), c(0, 5), c(5, 5), c(5, 0), c(0, 0)), # 外边界 rbind(c(1, 1), c(1, 4), c(4, 4), c(4, 1), c(1, 1)) # 孔洞 )) geom2 <- st_polygon(list( rbind(c(1, 1), c(1, 4), c(4, 4), c(4, 1), c(1, 1)) # 孔洞内的多边形 )) geom3 <- st_polygon(list( rbind(c(5, 5), c(5, 9), c(9, 9), c(9, 5), c(5, 5)) # 与外边界顶点接触的多边形 )) sf_data <- st_sf(geometry = st_sfc(geom1, geom2, geom3)) # 提取geom1的无孔洞外边界 geom1_outer <- st_polygon(list(geom1[[1]])) # 筛选完全处于外边界内的几何体(不含边界触碰) inside_mask <- st_within(sf_data$geometry, geom1_outer, sparse = FALSE)[, 1] target_geoms <- sf_data[inside_mask, ] # 合并geom1与geom2 merged_geom <- st_union(geom1, target_geoms$geometry[2]) # 可视化验证结果 plot(merged_geom, col = "pink") plot(sf_data$geometry[3], col = "blue", add = TRUE)
关键说明
st_within的判定规则是:几何体所有内部点都位于目标几何体内部,且边界不与目标几何体外部相交,恰好排除了geom3这种仅触碰边界的情况。- 若需要允许触碰边界的场景,可改用
st_contains_properly或调整空间关系参数,但当前需求下st_within更贴合"完全处于内"的要求。
内容的提问来源于stack exchange,提问作者Pedro Alves
相关产品推荐
相关产品推荐

