几何有效性
📄字数 1.5K
👁️阅读量 加载中...
有效性介绍
几何有效性主要适用于二维几何图形,多边形(POLYGON)和多面(MULTIPOLYGON)。允许多边形几何形状模拟平面区域的规则定义了有效性。点(POINT)和多点(MULTIPOINT)几何图形不具备有效性。
符合以下条件的多边形(POLYGON)是有效的:
- 多边形的环必须闭合。
- 内环应该处于外环的内部。
- 环不能自相交(即它们不能相互接触,也不能交叉)。
- 环不能与其他环接触,除非在某个点相切(即有且仅有一个点相切)。
符合以下条件的多面(MULTIPOLYGON)是有效的:
- 子元素POLYGON有效。
- 子元素不重叠(即其内部不得相交)。
- 子元素仅在有限个点处接触(即不沿线接触)。
上述条件说明有效的多边形几何也是简单的。
在线性几何中,有效性的主要规则是线串(LINESTRING)必须至少包含两个不同的点,并且必须具有非零长度。非简单(自相交)的线性几何对象也是有效的。
sql
--len_zero无效,并提示错误原因
SQL> SELECT
ST_IsValid('LINESTRING(0 0, 1 1)') AS len_nonzero,
ST_IsValid('LINESTRING(0 0, 0 0, 0 0)') AS len_zero,
ST_IsValid('LINESTRING(10 10, 150 150, 180 50, 20 130)') AS self_int;
+-------------+----------+----------+
| LEN_NONZERO | LEN_ZERO | SELF_INT |
+-------------+----------+----------+
| T | F | T |
+-------------+----------+----------+
(1 row)
Warning: [E24015] Spatial Error: Too few points in geometry component at or near point 0 0
Use time:0 ms.有效性管理
空间库支持创建、存储符合和不符合有效性规则的几何图形,并标记和修复不符合有效性规则的的几何图形。在某些情况下,OGC有效性规则比预期更严格(例如零长度线串和带有倒孔的多边形)。
虚谷空间数据库提供的许多函数在实际操作中都假设输入的几何参数符合有效性规则。例如,计算在多边形外部定义有孔的多边形的面积,或者以非简单边界线构造多边形没有意义。假设输入的几何参数有效,则不需要检查拓扑正确性,使得函数能更有效地运行,并生成有效的几何输出,从而支持空间库功能的安全链接和连续操作。
提示
零长度线和具有反转的多边形通常可以正确处理。
如果在调用函数时遇到意外错误消息,应首先确认函数参数的有效性,使用以下方法验证正在处理的数据。
使用ST_IsValid函数验证有效性
示例:验证POLYGON ((20 180, 180 180, 180 20, 20 20, 20 180))是否有效,返回true。
sql
SQL> SELECT ST_IsValid('POLYGON ((20 180, 180 180, 180 20, 20 20, 20 180))');
+-------+
| EXPR1 |
+-------+
| T |
+-------+使用ST_IsValidDetail函数确认几何无效的性质和位置的信息
示例:验证POLYGON ((20 20, 120 190, 50 190, 170 50, 20 20))是否有效,返回false,并返回无效原因自相交,自相交点位于POINT(91.51162790697674 141.56976744186045)。
sql
SQL> SELECT valid,reason, location FROM TABLE(select ST_IsValidDetail('POLYGON((20 20, 120 190, 50 190, 170 50, 20 20))'));
+-------+-------------------+----------------------------------------------------+
| VALID | REASON | LOCATION |
+-------+-------------------+----------------------------------------------------+
| F | Self-intersection | 010100002000FFFAFFE80BFA82BEE05640B823EE883BB26140 |
+-------+-------------------+----------------------------------------------------+使用ST_MakeValid函数更正无效的几何图形
示例:返回LINESTRING(0 0, 0 0, 0 0)的有效几何对象。
sql
SQL> SELECT TO_CHAR(ST_ASEWKT(ST_MakeValid('LINESTRING(0 0, 0 0, 0 0)')));
+------------+
| EXPR1 |
+------------+
| POINT(0 0) |
+------------+