無効なジオメトリー動物園


9

多くの場合、私は何度も、無効なジオメトリに起因する奇妙なバグと格闘することに何時間も費やしてきました。症状は次のように大きく異なります。

  • データベースの速度低下
  • Incorrect \ Nullクエリの結果
  • エラーと警告でログファイルが過負荷になっている
  • 幾何演算子との一貫性のない結果(例:交差)

ここにいる全員がデータをサニタイズするのを助けるために、無効なジオメトリのタイプを分類したいと思います。

お好きなタイプの無効なジオメトリで回答してください(回答ごとに1つのタイプ)。スクリーンショット、説明、ソリューションは大歓迎ですが、答えは短くしてください。

回答:


6

無効なジオメトリの8年前の金山は、PostGIS isvalid回帰テストによって提供されます。これらのリグレッションテストの多くは、GEOSに移動しました。たとえば、ここここ、およびテストツリーの他のポケットに移動しました。(申し訳ありませんが、多すぎてハイライトできません。いくつか選択して、WKTをJTS Test builderに貼り付けて視覚化してください。)


3

長さゼロのセグメント

例:

SELECT geomFromEWKT('LINESTRING(1 1, 1 1)');

                                    geomfromewkt                                    
------------------------------------------------------------------------------------
 0102000000020000000000000000000840000000000000104000000000000008400000000000001040

問題:長さゼロのセグメントを格納すると、長さの比率(ゼロによる除算)を計算するとき、または方位角と三角関数を計算するときにバグが発生する可能性があります。

検出: PostGISでは、長さゼロのセグメントはを使用して検出できますisValid()

解決策: 長さゼロのセグメントをポイントとして維持するようにしてください。


3

自己交差するポリゴン

ここに画像の説明を入力してください

例:

SELECT isValid(geomFromEWKT('POLYGON((0 0, 1 1, 1 0, 0 1, 0 0))'));
NOTICE:  Self-intersection at or near point 0.5 0.5
 isvalid 
---------
 f
(1 row)

問題:間違った計算、例えばarea()

SELECT area(geomFromEWKT('POLYGON((0 0, 1 1, 1 0, 0 1, 0 0))'));
 area 
------
    0
(1 row)

これにより、関数の呼び出しでゼロ除算のバグが発生する可能性があります。

検出: PostGISでは、を使用して自己交差セグメントを検出できますisValid()

解決策:変換がするMULTIPOLYGON(コメントを参照してください)。


:同じ形状が有効と同等であることMULTIPOLYGON(((0 0, 0 1, 0.5 0.5, 0 0)),((1 1, 1 0, 0.5 0.5, 1 1)))
マイク・T

@Mike Toews:正解です。MULTIPOLYGONに変換することをお勧めします。
アダムMatan
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.