无效几何的含义是什么


15

我已在Postgis数据库中导入了一些数据,并且报告了某些几何形状无效(ST_IsValidReason报告了自相交或环自相交)。

我正在执行的查询似乎不受这些几何的无效方面的影响(我仅使用ST_Distance查询)。

几何无效时会破坏什么?

是否可以“自动”修复这些几何(缓冲区(geom,0)或ST_SimplifyPreserveTopology(geom,0.0001))?

Answers:


19

保留格式错误的数据不是一个好主意,因为您永远无法预测故障发生的时间和地点。此外,格式错误的数据可能会导致Heisenbug,这是最恶性和最虚幻的bug类型。

我认为讨论存储无效几何的可能结果有点没有意义。话虽如此,后果可能包括:

  • 错误的结果(即,结果ST_Distance将返回不正确或简单的错误数字)
  • 数据库性能问题:保留格式错误的数据会严重损害数据库性能并创建巨大的日志文件,因为每个函数调用都会向日志中写入错误,并打乱普通的数据库工作。
  • 数据库崩溃。
  • 应用程序崩溃-要么是由于从数据库接收格式错误的数据,要么是由于接收到不合理的结果(例如负距离)引起的。
  • 幻像行为(请参见上面的链接)。这是所有人最糟糕的后果。您会发生奇怪的事情。速度慢,数据丢失,崩溃,不合理的结果,长时间的停顿,无响应和许多其他诅咒。您可能无法发现或复制它们,因为它们在每个文档中都属于“未定义”类别。

我的建议-如果小的缓冲区不会严重损害您的数据一致性,请使用它们来防止上述任何情况的发生。保持您的数据有效。


您能否详细说明如何使用小型缓冲区?我怎么做?
diciu 2010年

1
ST_Buffer(the_geom, 0.0000001)可能会达到自我交集的目的。仅当几何形状稍大的后果不严重时才使用它。
亚当·马坦

1
我的经验是,纠正格式错误的数据是一项调查。但是,尽管很耗时,但通常值得付出努力。这个ST_Buffer(the_geom, 0.0000001)技巧绝对有很大帮助。

事情是ST_Buffer修复几何,但结果是不是真的我所期待的-在这里这种无效的多边形(openstreetmap.org/browse/way/51954364)ST_Buffer只返回左上方的矩形。ST_SimplifyPreserveTopology似乎更接近我需要的内容(有效的几何图形,但尽可能接近无效的原始图形)。使用ST_SimplifyPreserveTopology有任何不利之处吗?
diciu 2010年

该几何应作为MULTIPOLYGON两个多边形中的一个处理,而不是一个POLYGON。如果可能,请尝试获取原始的WKT。
亚当·马坦

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"
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.