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 扩展。 |
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
Find tables with invalid geometries in registered geometry columns.
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;