类别:

地理空间函数

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> )
Copy

实参

geography_or_geometry_expression

实参必须是 GEOGRAPHY 或 GEOMETRY 类型的表达式。

返回

Returns a BOOLEAN value.

使用说明

  • ST_ISVALID 仅用于检查形状的有效性。它不会修改数据。当使用空间格式(例如 WKT、WKB、EWKT、EWKB 或 GeoJSON)构造对象时,转换函数(例如 TO_GEOGRAPHYTO_GEOMETRYST_GEOGRAPHYFROMWKTST_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;
Copy
+----------+
| 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;
Copy
+----------+
| 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;
Copy
+------------------------+-----------------------+
| IS_VALID_BEFORE_BUFFER | IS_VALID_AFTER_BUFFER |
|------------------------+-----------------------|
| False                  | True                  |
+------------------------+-----------------------+
语言: 中文