我们正在将一大堆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/

10-11 00:52