Answers:
PostGIS等值回归测试提供了一个具有8年历史的无效几何形状的金矿。这些回归测试中的许多已移至GEOS,例如此处和此处,以及测试树中的其他部分。(对不起,有太多要突出显示的内容。选择其中的几个并将WKT粘贴到JTS Test构建器中以使其可视化。)
例:
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)))