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

使用smoothr的fill_holes时,如何移除孔洞内多边形岛的轮廓?

移除多边形中的岛状轮廓解决方案

要移除孔洞内的岛状多边形轮廓(即多边形的内环结构),可以通过提取多边形的外环来实现,完全丢弃所有内环。以下是具体实现代码:

library(sf)
library(smoothr)

# 下载并读取数据
download.file("https://drive.google.com/uc?export=download&id=1-KcZce0jgIV0fwG797mq7FB5WjxwtKqX" , destfile="Zones.zip")
unzip("Zones.zip")

Zones <- st_read("Zones.gpkg")

Threshold <- units::set_units(1000, km^2)

# 合并多边形并填充小面积孔洞
Zones_Union <- st_union(Zones)
Zones_No_Holes <- fill_holes(Zones_Union, threshold = Threshold)

# 自定义函数:移除所有内环(岛状轮廓)
remove_inner_rings <- function(poly) {
  if (inherits(poly, "MULTIPOLYGON")) {
    outer_rings <- lapply(poly, function(p) st_polygon(list(p[[1]])))
    st_multipolygon(outer_rings)
  } else if (inherits(poly, "POLYGON")) {
    st_polygon(list(poly[[1]]))
  } else {
    stop("输入必须是POLYGON或MULTIPOLYGON类型")
  }
}

# 应用函数并转换为带坐标系的sf对象
Zones_No_Islands <- st_sfc(remove_inner_rings(Zones_No_Holes)) %>%
  st_set_crs(st_crs(Zones))

# 绘图查看最终结果
plot(Zones_No_Islands, col="aliceblue")

核心逻辑

  • 合并后的多边形包含外环(主区域边界)和内环(岛状多边形、孔洞的边界)。
  • fill_holes仅填充了面积小于阈值的孔洞,但保留了面积较大的岛状内环。
  • 自定义函数remove_inner_rings会遍历每个多边形,只保留第一个环(即外环),丢弃所有后续的内环,最终得到没有任何岛状轮廓的单一实心多边形。

如果需求是完全移除所有孔洞和岛状结构(不管面积大小),可以直接跳过fill_holes步骤,对合并后的Zones_Union执行移除内环操作。

内容的提问来源于stack exchange,提问作者Chris

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 00:45:57