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

如何对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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 22:09:23