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)
我们该如何解决这个问题?
此查询通常会为我修复它:
UPDATE place_shapes
SET geometry=ST_Buffer(geometry, 0.0);
Run Code Online (Sandbox Code Playgroud)
正如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字段,但是不再保证它是唯一的。