- 类别:
ST_ISVALID¶
Returns TRUE if the specified GEOGRAPHY or GEOMETRY object represents a valid shape. Examples of invalid shapes include shapes with self-intersections and spikes.
语法¶
ST_ISVALID( <geography_or_geometry_expression> )
实参¶
geography_or_geometry_expression
实参必须是 GEOGRAPHY 或 GEOMETRY 类型的表达式。
返回¶
Returns a BOOLEAN value.
使用说明¶
ST_ISVALID 仅用于检查形状的有效性。它不会修改数据。当使用空间格式(例如 WKT、WKB、EWKT、EWKB 或 GeoJSON)构造对象时,转换函数(例如 TO_GEOGRAPHY、TO_GEOMETRY、ST_GEOGRAPHYFROMWKT 或 ST_GEOMETRYFROMWKT)会解析输入,默认情况下会尝试验证或修复形状。如果转换函数无法修复形状,那么除非您接受无效的形状,否则它将返回错误。
要引入可能无效的数据(例如,计划稍后更正的数据),请在调用转换函数时为附加
allow_invalid
实参指定 TRUE,以允许无效的形状。然后,您可以使用 ST_ISVALID 函数标记表中的无效行。当给定无效的形状时,某些地理空间函数可能会返回错误或不可用的结果。使用 ST_ISVALID 函数检查有效性。在执行空间分析之前,您可以更正无效的形状。
简单的更正方法包括使用一个较小的正向或负向距离进行缓冲(例如,用于去除微小尖刺或解决自交叉问题),然后使用 ST_ISVALID 函数重新检查其有效性。
示例¶
以下示例使用 ST_ISVALID 函数。
确定多边形是否为有效形状:
SELECT ST_ISVALID(
TO_GEOGRAPHY('POLYGON((-93.086 37.557,-86.699 37.497,-93.198 35.123,-93.086 37.557))')
) AS is_valid;
+----------+
| IS_VALID |
|----------|
| True |
+----------+
SELECT ST_ISVALID(
TO_GEOGRAPHY( 'POLYGON((-92.799 37.601,-88.240 37.617,-92.733 36.198,-88.305 36.171,-92.799 37.601))', TRUE)
) AS is_valid;
+----------+
| IS_VALID |
|----------|
| False |
+----------+
使用 ST_BUFFER 函数添加小缓冲区,以更正无效的形状:
WITH g AS (
SELECT TO_GEOMETRY('POLYGON((0 0, 2 2, 2 0, 0 2, 0 0))', TRUE) AS geom
)
SELECT ST_ISVALID(geom) AS is_valid_before_buffer,
ST_ISVALID(ST_BUFFER(geom, -0.001)) AS is_valid_after_buffer
FROM g;
+------------------------+-----------------------+
| IS_VALID_BEFORE_BUFFER | IS_VALID_AFTER_BUFFER |
|------------------------+-----------------------|
| False | True |
+------------------------+-----------------------+