使用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
相关产品推荐
相关产品推荐

