我们正在将一大堆ArcGIS shapefile导入PostGIS,并使用shp2pgsql
进行即时转换。问题是,如果shapefile具有任何环自交,则导入扼流圈:
NOTICE: Ring Self-intersection at or near point -80.1338 25.8102
ERROR: new row for relation "place_shapes" violates
check constraint "shape_is_valid"
我们该如何解决呢?
最佳答案
正如Marcelo所建议的那样,将特征零缓冲是自相交多边形的一种已知解决方案(在shp文件中太常见了),但也有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字段,但是不再保证它是唯一的。
关于import - 在shp2pgsql中自动修复环形自交点,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11894149/