在shp2pgsql中自动修复环自交叉

jpa*_*kal 5 gis import postgis shapefile self-intersection

我们将一大堆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"
Run Code Online (Sandbox Code Playgroud)

我们该如何解决这个问题?

Mar*_*elo 6

此查询通常会为我修复它:

UPDATE place_shapes
  SET geometry=ST_Buffer(geometry, 0.0);
Run Code Online (Sandbox Code Playgroud)


Joh*_*ell 6

正如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';
Run Code Online (Sandbox Code Playgroud)

其中invalid_table是原始shp2pgsql导入产生的表。

我在此处包括一个生成的ID,因为ST_MakeValid将根据输入几何图形生成多个多边形。可以重写查询以包括原始id字段,但是不再保证它是唯一的。