6

私たちは、ArcGIS シェープファイル全体を PostGIS にインポートしており、その場でshp2pgsql. 問題は、シェープファイルにリングの自己交差がある場合、インポートがチョークすることです。

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"

どうすればこれを修正できますか?

4

3 に答える 3

8

このクエリはしばしば私のためにそれを修正します:

UPDATE place_shapes
  SET geometry=ST_Buffer(geometry, 0.0);
于 2012-08-11T09:47:07.377 に答える
7

フィーチャをゼロでバッファリングすることは、マルセロが提案したように、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 インポートの結果のテーブルです。

ST_MakeValid は入力ジオメトリから複数のポリゴンを生成する可能性があるため、生成された ID をここに含めます。元の id フィールドを含むようにクエリを書き直すことはできますが、一意であることが保証されなくなりました。

于 2014-01-25T19:33:28.400 に答える
0

この後処理ステップを実行すると、うまくいくことがわかります。

UPDATE place_shapes
  SET geometry=ST_SimplifyPreserveTopology(geometry, 0.0001)
  WHERE ST_IsValid(geometry) = false;

0.0001度単位の許容範囲です。好みに合わせて微調整する必要があるかもしれませんが、道路地図データについては、ほぼ正しいと思われます。

また、シェイプ テーブルが有効性を強制する場合 (そうすべきです)、使用shp2pgsqlして一時的な未検証のテーブルを作成し、そこでポリゴンを修正してから、それらをマスター テーブルにコピーする必要があります。

于 2012-08-10T01:09:20.673 に答える