Name

ST_CoverageInvalidEdges — Fensterfunktion, die Stellen findet, an denen die Polygone keine gültige Abdeckung bilden.

Synopsis

geometry ST_CoverageInvalidEdges(geometry winset geom, float8 tolerance = 0);

Beschreibung

Eine Fensterfunktion, die prüft, ob die Polygone in der Fensterpartition eine gültige polygonale Abdeckung bilden. Sie gibt lineare Indikatoren zurück, die die Lage der ungültigen Kanten (falls vorhanden) in jedem Polygon anzeigen.

Eine Menge gültiger Polygone ist eine gültige Abdeckung, wenn die folgenden Bedingungen erfüllt sind:

  • Nicht überlappend - Polygone überlappen sich nicht (ihre Innenräume schneiden sich nicht)

  • Edge-Matched - Scheitelpunkte entlang gemeinsamer Kanten sind identisch

Als Fensterfunktion wird für jedes Eingabepolygon ein Wert zurückgegeben. Für Polygone, die eine oder mehrere der Gültigkeitsbedingungen verletzen, ist der Rückgabewert ein MULTILINESTRING, der die problematischen Kanten enthält. Flächendeckend gültige Polygone geben den Wert NULL zurück. Nicht-polygonale oder leere Geometrien liefern ebenfalls NULL-Werte.

Die Bedingungen erlauben es, dass eine gültige Abdeckung Löcher (Lücken zwischen Polygonen) enthält, solange die umgebenden Polygone kantenangepasst sind. Sehr schmale Lücken sind jedoch oft unerwünscht. Wenn der Parameter tolerance mit einem Abstand ungleich Null angegeben wird, werden auch Kanten, die engere Lücken bilden, als ungültig zurückgegeben.

Die Polygone, die auf die Gültigkeit der Abdeckung geprüft werden, müssen ebenfalls gültige Geometrien sein. Dies kann mit ST_IsValid überprüft werden.

Verfügbarkeit: 3.4.0

Benötigt GEOS >= 3.12.0

Beispiele

Ungültige Kanten aufgrund von Überschneidungen und nicht übereinstimmenden Scheitelpunkten

WITH coverage(id, geom) AS (VALUES
  (1, 'POLYGON ((10 190, 30 160, 40 110, 100 70, 120 10, 10 10, 10 190))'::geometry),
  (2, 'POLYGON ((100 190, 10 190, 30 160, 40 110, 50 80, 74 110.5, 100 130, 140 120, 140 160, 100 190))'::geometry),
  (3, 'POLYGON ((140 190, 190 190, 190 80, 140 80, 140 190))'::geometry),
  (4, 'POLYGON ((180 40, 120 10, 100 70, 140 80, 190 80, 180 40))'::geometry)
)
SELECT id, ST_AsText(ST_CoverageInvalidEdges(geom) OVER ())
  FROM coverage;

 id |               st_astext
----+---------------------------------------
  1 | LINESTRING (40 110, 100 70)
  2 | MULTILINESTRING ((100 130, 140 120, 140 160, 100 190), (40 110, 50 80, 74 110.5))
  3 | LINESTRING (140 80, 140 190)
  4 | null
      
-- Test entire table for coverage validity
SELECT true = ALL (
    SELECT ST_CoverageInvalidEdges(geom) OVER () IS NULL
    FROM coverage
    );