You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言sf包:如何识别空心几何体外边界内的完全包含几何体

解决方案:识别并合并处于带孔洞多边形外边界内的几何体

针对带孔洞多边形的空间判断需求,核心思路是先提取目标多边形的无孔洞外边界,再基于此筛选出完全处于外边界内部的几何体,最后完成合并操作。

问题原因

  • st_contains(geom1, geom2) 返回FALSE:带孔洞多边形的"内部"定义不包含孔洞区域,geom2处于孔洞中,因此不被geom1判定为包含。
  • st_intersects(geom1, sf_data$geometry) 会同时选中geom2和geom3:geom3与geom1的边界顶点相交,满足相交判定条件。

实现步骤

  1. 提取外边界多边形:sf中多边形的第一个环为外边界,后续环是孔洞,单独提取外边界生成无孔洞多边形。
  2. 筛选目标几何体:用空间关系函数判断哪些几何体完全处于外边界内部,排除触碰边界的geom3。
  3. 合并几何体:将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 03:40:01