ST_IsValid — Prüft, ob eine Geometrie in 2D wohlgeformt ist.
boolean ST_IsValid(geometry g);
boolean ST_IsValid(geometry g, integer flags);
Prüft, ob ein ST_Geometry-Wert wohlgeformt und in 2D gemäß den OGC-Regeln gültig ist. Bei Geometrien mit 3 und 4 Dimensionen wird die Gültigkeit weiterhin nur in 2 Dimensionen geprüft. Für Geometrien, die ungültig sind, wird ein PostgreSQL-NOTICE ausgegeben, der die Gründe für die Ungültigkeit angibt.
Für die Version mit dem Parameter flags sind die unterstützten Werte in ST_IsValidDetail dokumentiert. Diese Version druckt keinen HINWEIS, der die Ungültigkeit erklärt.
Weitere Informationen über die Definition der Geometriegültigkeit finden Sie unter Section 4.4, “Geometrievalidierung”
|
|
|
SQL-MM definiert das Ergebnis von ST_IsValid(NULL) als 0, während PostGIS NULL zurückgibt. |
Wird vom GEOS Modul ausgeführt
Die Version, die Flaggen akzeptiert, ist ab 2.0.0 verfügbar.
Diese Methode implementiert die OGC Simple Features Implementation Specification for SQL 1.1.
Diese Methode setzt die SQL/MM-Spezifikation um. SQL-MM 3: 5.1.9
|
|
|
Weder die OGC-SFS- noch die SQL-MM-Spezifikationen enthalten ein Flag-Argument für ST_IsValid. Das Flag ist eine PostGIS-Erweiterung. |
SELECT ST_IsValid(ST_GeomFromText('LINESTRING(0 0, 1 1)')) As good_line,
ST_IsValid(ST_GeomFromText('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;