無効なジオメトリの意味は何ですか


15

Postgisデータベースにいくつかのデータをインポートしましたが、一部のジオメトリが無効であると報告されています(ST_IsValidReasonは自己交差またはリング自己交差を報告します)。

私が実行しているクエリは、これらのジオメトリの無効な側面の影響を受けないようです(ST_Distanceクエリのみを使用しています)。

ジオメトリが無効な場合に壊れるものは何ですか?

これらのジオメトリを「自動的に」修正する(buffer(geom、0)またはST_SimplifyPreserveTopology(geom、0.0001))オプションですか?

回答:


19

いつ、どこで障害が発生するかを予測することはできないため、不正な形式のデータを保持することは悪い考えです。さらに、不正なデータは、最も悪質で幻想的なバグであるハイゼンバグを引き起こす可能性があります。

無効なジオメトリを格納することで起こりうる結果を議論するのは少し無意味だと思います。とはいえ、結果には次のものが含まれます。

  • 間違った結果(つまり、ST_Distance不正確または単純な間違った数字を返します)
  • データベースのパフォーマンスの問題:不正なデータを保持すると、データベースのパフォーマンスに深刻なダメージを与え、巨大なログファイルを作成する可能性があります。すべての関数呼び出しがエラーをログに書き込み、通常のデータベース作業を中断するためです。
  • データベースがクラッシュします。
  • アプリケーションのクラッシュ-データベースから不正な形式のデータを受信したか、不当な結果(負の距離など)を受信したことが原因です。
  • ファントムの動作(上記のリンクを参照)。これはすべての最悪の結果です。奇妙なことが起こります。スローダウン、データ損失、クラッシュ、不合理な結果、長い一時停止、無応答性、その他多くの呪い。それらはすべてのドキュメントで「未定義」のカテゴリに分類されるため、それらを見つけたり複製したりできない場合があります。

私のアドバイス-小さなバッファがデータの一貫性を著しく損なわない場合は、それらを使用して上記のいずれかが発生しないようにしてください。データを有効にしてください。


小さなバッファの使用について少し詳しく説明していただけますか?それ、どうやったら出来るの?
-diciu

1
ST_Buffer(the_geom, 0.0000001)自己交差のトリックを行うかもしれません。わずかに大きいジオメトリの結果が深刻でない場合にのみ使用してください。
アダムMatan

1
私の経験では、不正なデータの修正はかなりの調査です。しかし、時間がかかりますが、通常は努力する価値があります。このST_Buffer(the_geom, 0.0000001)トリックは間違いなく大いに役立ちます。
チャウ

問題は、ST_Bufferがジオメトリを修正することですが、結果は実際に私が期待したものではありません-この無効なポリゴンの場合(openstreetmap.org/browse/way/51954364)、ST_Bufferは左上の長方形のみを返します。ST_SimplifyPreserveTopologyは、必要なものに近いようです(有効なジオメトリですが、無効なオリジナルに可能な限り近い)。ST_SimplifyPreserveTopologyを使用する場合の欠点はありますか?
-diciu

そのジオメトリはMULTIPOLYGON、単一ではなく、2つのPolygon として処理する必要がありますPOLYGON。可能であれば、元のWKTを取得してください。
アダムMatan

13

最初に無効なジオメトリがデータベースに入るのを防ぐことができます。PostgreSQL / PostGISユーザーの場合、これはチェック制約で簡単に行えます。たとえばpublic.my_valid_table、ポリゴンジオメトリの列を持つテーブルを考えてgeom、次のSQL / DDLを使用します。

ALTER TABLE public.my_valid_table
  ADD CONSTRAINT enforce_valid_geom CHECK (st_isvalid(geom));

注:このテーブルには、制約を適用する前に有効なポリゴンが必要です。

その後、無効なジオメトリを挿入/追加しようとすると、エラーが表示されます。

ERROR:  new row for relation "my_valid_table" violates check constraint "enforce_valid_geom"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.