Name

ST_CoverageInvalidEdges — Fonction window qui trouve les endroits où les polygones ne forment pas une couverture valide.

Synopsis

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

Description

Une fonction window qui vérifie si les polygones de la partition window forment une couverture polygonale valide. Elle renvoie des indicateurs linéaires indiquant l'emplacement des arêtes non valides (le cas échéant) dans chaque polygone.

Un ensemble de polygones valides est une couverture valide si les conditions suivantes sont remplies :

  • Non-overlapping - les polygones ne se chevauchent pas (leurs intérieurs ne s'intersectent pas)

  • Edge-Matched - les sommets situés le long d'arêtes communes sont identiques

En tant que fonction window, une valeur est renvoyée pour chaque polygone d'entrée. Pour les polygones qui ne respectent pas une ou plusieurs des conditions de validité, la valeur renvoyée est un MULTILINESTRING contenant les arêtes problématiques. Les polygones valides du point de vue de la couverture renvoient la valeur NULL. Les géométries non polygonales ou vides produisent également des valeurs NULL.

Les conditions permettent à une couverture valide de contenir des trous (espaces entre les polygones), pour autant que les polygones environnants soient adaptés aux bords. Toutefois, des espaces très étroits ne sont souvent pas souhaitables. Si le paramètre tolérance est spécifié avec une distance non nulle, les arêtes formant des espaces plus étroits seront également renvoyées comme non valides.

Les polygones dont la validité de la couverture est vérifiée doivent également être des géométries valides. Ceci peut être vérifié avec ST_IsValid.

Disponibilité : 3.4.0

Nécessite GEOS >= 3.12.0

Exemples

Arêtes non valides dues au chevauchement et à la non-concordance des sommets

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