如何对MultiPolygon类型GeoJSON使用ST_ExteriorRing填充孔洞
MultiPolygon填充孔洞、提取外边界的PostGIS实现
针对MultiPolygon类型的孔洞填充需求,根据你使用的PostGIS版本选对应方案即可:
方案1:PostGIS 3.2+ 最简写法
直接使用原生的ST_FillHoles函数,该函数原生支持Polygon、MultiPolygon两类输入,会自动丢弃所有内部孔洞环、保留原始外边界结构,输出几何类型和输入完全一致,甚至不需要你提前做类型分支判断,可以直接替换你原来的语句:
ST_SetSRID( ST_FillHoles(ST_GeomFromGeoJSON(mygeojson)), 4326 -- 替换为你业务实际使用的SRID )
该函数的处理逻辑和你之前对Polygon使用
ST_ExteriorRing的逻辑完全对齐,不会修改外边界的坐标精度,也不会改变子面的独立结构。
方案2:兼容PostGIS 2.x 低版本写法
如果你的环境PostGIS版本低于3.2没有内置ST_FillHoles,通过ST_Dump拆分多面为单个子面,逐个子面提取外环重建成面后再聚合回MultiPolygon即可,效果和高版本函数完全一致:
ST_SetSRID( ST_Multi(ST_Collect(filled_single_poly)), 4326 -- 替换为你业务实际使用的SRID ) FROM ( SELECT ST_MakePolygon(ST_ExteriorRing((dumped_geom).geom)) AS filled_single_poly FROM ( SELECT ST_Dump(ST_GeomFromGeoJSON(mygeojson)) AS dumped_geom ) t_dump ) t_collect
注意事项
- 不要用
ST_Buffer(geom, 0)、ST_UnaryUnion这类几何清洗函数实现填孔洞效果,这类函数在几何存在自相交、邻边共线的场景下会修改原始外边界形态,存在精度损失。 - 因为你已经提前做了几何类型分支判断,上述低版本写法传入MultiPolygon时,输出的一定是无孔洞的MultiPolygon结构,和你原有Polygon处理链路的输出效果完全匹配。
内容的提问来源于stack exchange,提问作者Christoffer
相关产品推荐
相关产品推荐

