Name

ST_MakeValid — Versucht, eine ungültige Geometrie gültig zu machen, ohne dass Scheitelpunkte verloren gehen.

Synopsis

geometry ST_MakeValid(geometry input);

geometry ST_MakeValid(geometry input, text params);

Beschreibung

Die Funktion versucht, eine gültige Darstellung einer gegebenen ungültigen Geometrie zu erstellen, ohne dass einer der Eingabepunkte verloren geht. Gültige Geometrien werden unverändert zurückgegeben.

Unterstützte Eingaben sind: PUNKTE, MEHRPUNKTE, LINIENSTRÄNGE, MEHRLINIENSTRÄNGE, POLYGONEN, MEHRPOLYGONEN und GEOMETRIESAMMLUNGEN, die eine beliebige Mischung dieser Elemente enthalten.

Bei vollständiger oder teilweiser Dimensionsreduzierung kann die Ausgangsgeometrie eine Sammlung von Geometrien mit geringerer bis gleicher Dimension oder eine Geometrie mit geringerer Dimension sein.

Einzelne Polygone können im Falle von Selbstüberschneidungen zu Multi-Geometrien werden.

Mit dem Argument params kann eine Optionszeichenfolge angegeben werden, mit der die Methode für die Erstellung gültiger Geometrien ausgewählt wird. Die Optionszeichenfolge hat das Format "method=linework|structure keepcollapsed=true|false". Wird kein "params"-Argument angegeben, wird standardmäßig der "linework"-Algorithmus verwendet.

Der Schlüssel "Methode" hat zwei Werte.

  • "linework" ist der ursprüngliche Algorithmus, der gültige Geometrien erstellt, indem er zunächst alle Linien extrahiert, diese Linien zusammen kodiert und dann einen Wert aus dem Linienwerk ausgibt.

  • "Struktur" ist ein Algorithmus, der zwischen inneren und äußeren Ringen unterscheidet und eine neue Geometrie erstellt, indem er äußere Ringe zusammenfasst und dann alle inneren Ringe differenziert.

Der Schlüssel "keepcollapsed" ist nur für den Algorithmus "structure" gültig und nimmt den Wert "true" oder "false" an. Wenn er auf "false" gesetzt ist, werden Geometriekomponenten, die auf eine niedrigere Dimensionalität kollabieren, z. B. ein Ein-Punkt-Linienzug, fallengelassen.

Wird vom GEOS Modul ausgeführt

Verfügbarkeit: 2.0.0

Verbessert: 2.0.1, Geschwindigkeitsverbesserungen

Verbessert: 2.1.0, Unterstützung für GEOMETRYCOLLECTION und MULTIPOINT hinzugefügt.

Verbessert: 3.1.0, Entfernen von Koordinaten mit NaN-Werten hinzugefügt.

Verbessert: 3.2.0, zusätzliche Algorithmus-Optionen, 'Linienwerk' und 'Struktur', die GEOS >= 3.10.0 erfordern.

Diese Funktion unterstützt 3d und lässt den Z-Index nicht fallen.

Beispiele

vor_geom: MULTIPOLYGON aus 2 sich überlappenden Polygonen

nach_geom: MULTIPOLYGON aus 4 sich nicht überlappenden Polygonen

after_geom_structure: MULTIPOLYGON aus 1 nicht überlappenden Polygon

SELECT f.geom AS before_geom, ST_MakeValid(f.geom) AS after_geom, ST_MakeValid(f.geom, 'method=structure') AS after_geom_structure
FROM (SELECT 'MULTIPOLYGON(((186 194,187 194,188 195,189 195,190 195,
191 195,192 195,193 194,194 194,194 193,195 192,195 191,
195 190,195 189,195 188,194 187,194 186,14 6,13 6,12 5,11 5,
10 5,9 5,8 5,7 6,6 6,6 7,5 8,5 9,5 10,5 11,5 12,6 13,6 14,186 194)),
((150 90,149 80,146 71,142 62,135 55,128 48,119 44,110 41,100 40,
90 41,81 44,72 48,65 55,58 62,54 71,51 80,50 90,51 100,
54 109,58 118,65 125,72 132,81 136,90 139,100 140,110 139,
119 136,128 132,135 125,142 118,146 109,149 100,150 90)))'::geometry AS geom) AS f;

vor_geom: MULTIPOLYGON aus 6 sich überschneidenden Polygonen

nach_geom: MULTIPOLYGON aus 14 nicht überlappenden Polygonen

after_geom_structure: MULTIPOLYGON aus 1 nicht überlappendem Polygon

SELECT c.geom AS before_geom,
                    ST_MakeValid(c.geom) AS after_geom,
                    ST_MakeValid(c.geom, 'method=structure') AS after_geom_structure
        FROM (SELECT 'MULTIPOLYGON(((91 50,79 22,51 10,23 22,11 50,23 78,51 90,79 78,91 50)),
                  ((91 100,79 72,51 60,23 72,11 100,23 128,51 140,79 128,91 100)),
                  ((91 150,79 122,51 110,23 122,11 150,23 178,51 190,79 178,91 150)),
                  ((141 50,129 22,101 10,73 22,61 50,73 78,101 90,129 78,141 50)),
                  ((141 100,129 72,101 60,73 72,61 100,73 128,101 140,129 128,141 100)),
                  ((141 150,129 122,101 110,73 122,61 150,73 178,101 190,129 178,141 150)))'::geometry AS geom) AS c;

Beispiele

SELECT ST_AsText(ST_MakeValid(
    'LINESTRING(0 0, 0 0)',
    'method=structure keepcollapsed=true'
    ));

 st_astext
------------
 POINT(0 0)


SELECT ST_AsText(ST_MakeValid(
    'LINESTRING(0 0, 0 0)',
    'method=structure keepcollapsed=false'
    ));

    st_astext
------------------
 LINESTRING EMPTY