名称

ST_IsValid — 测试几何图形在 2D 中是否有效。

大纲

boolean ST_IsValid(geometry g);

boolean ST_IsValid(geometry g, integer flags);

描述

根据 OGC 规则测试 ST_Geometry 值在 2D 中是否格式良好且有效。 对于 3 维和 4 维几何形状,有效性仍然仅在 2 维中进行测试。 对于无效的几何图形,会发出 PostgreSQL NOTICE,提供其无效原因的详细信息。

对于带有 flags 参数的版本,支持的值记录在 ST_IsValidDetail 中。此版本不会打印解释无效性的通知。

有关几何有效性定义的更多信息,请参阅第 第 4.4 节 “几何有效性验证”

[注意]

SQL-MM 将 ST_IsValid(NULL) 的结果定义为 0,而 PostGIS 返回 NULL。

这个函数是由 GEOS 模块执行的。

接受标志的版本从 2.0.0 开始可用。

此方法实现了 SQL 1.1 的 OGC 简单功能规范。

该方法实现了SQL/MM规范。 SQL-MM 3: 5.1.9

[注意]

OGC-SFS 和 SQL-MM 规范均不包含 ST_IsValid 的标志参数。 该标志是 PostGIS 扩展。

示例

Code
SELECT ST_IsValid('LINESTRING(0 0,1 1)') As good_line,
ST_IsValid('POLYGON((0 0,1 1,1 2,1 1,0 0))') As bad_poly;
栅格输出
NOTICE:  Self-intersection at or near point 0 0
 good_line | bad_poly
-----------+----------
 t         | f
Figure
Geometry figure for visual-st-isvalid-01

Find tables with invalid geometries in registered geometry columns.

Code
CREATE TEMP TABLE invalid_geometry_columns (
    table_name text,
    column_name text,
    invalid_count bigint
);

DO $$
DECLARE
    rec record;
    invalid_count bigint;
BEGIN
    FOR rec IN
        SELECT f_table_schema, f_table_name, f_geometry_column
        FROM geometry_columns
        ORDER BY f_table_schema, f_table_name, f_geometry_column
    LOOP
        EXECUTE format(
            'SELECT count(*) FROM %I.%I WHERE NOT ST_IsValid(%I, 0)',
            rec.f_table_schema,
            rec.f_table_name,
            rec.f_geometry_column
        ) INTO invalid_count;

        IF invalid_count 
> 0 THEN
            INSERT INTO invalid_geometry_columns
            VALUES (
                format('%I.%I', rec.f_table_schema, rec.f_table_name),
                rec.f_geometry_column,
                invalid_count
            );
        END IF;
    END LOOP;
END;
$$;

SELECT * FROM invalid_geometry_columns;