Import shp2pgsql中环形自相交点的自动固定

Import shp2pgsql中环形自相交点的自动固定,import,gis,postgis,shapefile,self-intersection,Import,Gis,Postgis,Shapefile,Self Intersection,我们正在将大量ArcGIS形状文件导入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" 我们如何解决这个问题?结果表明,运行

我们正在将大量ArcGIS形状文件导入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"

我们如何解决这个问题?

结果表明,运行此后处理步骤可以实现以下目的:

UPDATE place_shapes
  SET geometry=ST_SimplifyPreserveTopology(geometry, 0.0001)
  WHERE ST_IsValid(geometry) = false;
0.0001
是以度为单位的公差,您可能需要根据自己的喜好对其进行调整,但对于街道地图数据来说似乎是正确的


此外,如果形状表强制执行有效性(它应该执行有效性),则需要使用
shp2pgsql
创建临时未验证表,在那里修复多边形,然后将其复制到主表。

此查询通常会为我修复:

UPDATE place_shapes
  SET geometry=ST_Buffer(geometry, 0.0);

正如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字段,但不再保证它是唯一的。

这可能会解决问题,但不一定是出于正确的原因,因为保留拓扑简化实际上会改变基础几何体,因此您得到的不一定是原始多边形,固定与否。最好使用ST_MakeValid,它正是为这类事情而设计的——删除自相交。“可能会产生混合的几何类型,包括孤立点和线字符串”-无法足够突出显示,您需要密切注意这一点。是的,这就是ST_GeometryType(geom)的位置='ST_Polygon'在末尾。处理点和线字符串的类型:-)