回答:
無効なジオメトリの8年前の金山は、PostGIS isvalid回帰テストによって提供されます。これらのリグレッションテストの多くは、GEOSに移動しました。たとえば、こことここ、およびテストツリーの他のポケットに移動しました。(申し訳ありませんが、多すぎてハイライトできません。いくつか選択して、WKTをJTS Test builderに貼り付けて視覚化してください。)
例:
SELECT geomFromEWKT('LINESTRING(1 1, 1 1)');
geomfromewkt
------------------------------------------------------------------------------------
0102000000020000000000000000000840000000000000104000000000000008400000000000001040
問題:長さゼロのセグメントを格納すると、長さの比率(ゼロによる除算)を計算するとき、または方位角と三角関数を計算するときにバグが発生する可能性があります。
検出:
PostGISでは、長さゼロのセグメントはを使用して検出できますisValid()
。
解決策: 長さゼロのセグメントをポイントとして維持するようにしてください。
例:
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)))