虽然将要素缓冲为零是自相交多边形的已知修复方法(这在 shp 文件中非常常见),但正如 Marcelo 所建议的那样,还有用于此目的的 ST_MakeValid 函数。还有一个关联函数 ST_IsValidReason 将告知问题所在,而不仅仅是盲目地尝试修复它。
在实践中,使用 ST_MakeValid(geom) 或 ST_Buffer(geom, 0) 可能会产生几何类型的混合,包括孤立点和线串。因此,进一步的改进可能是检查返回的几何类型,并且仅包括例如由 ST_MakeValid 生成的多边形。
create table valid_geoms as
with make_valid (id, geom) as
(select
row_number() over() as id,
(ST_Dump(ST_MakeValid(geom))).geom as geom from invalid_table
)
select id, geom from make_valid where ST_GeometryType(geom)='ST_Polygon';
其中 invalid_table 是原始 shp2pgsql 导入产生的表。
我在这里包含了一个生成的 id,因为 ST_MakeValid 可能会从输入几何图形中生成一个以上的多边形。可以重写查询以包含原始 id 字段,但不再保证它是唯一的。