Name

ST_MakeValid — Tente de rendre valide une géométrie invalide sans perdre de sommets.

Synopsis

geometry ST_MakeValid(geometry input);

geometry ST_MakeValid(geometry input, text params);

Description

La fonction tente de créer une représentation valide d'une géométrie invalide donnée sans perdre aucun des sommets d'entrée. Les géométries valides sont retournées inchangées.

Les types de données pris en charge sont : POINTS, MULTIPOINTS, LINESTRINGS, MULTILINESTRINGS, POLYGONS, MULTIPOLYGONS et GEOMETRYCOLLECTIONS contenant n'importe quel mélange de ces éléments.

En cas de diminution de dimension (total ou partiel), la géométrie de sortie peut être une collection de géométries de dimension inférieure à égale, ou une géométrie de dimension inférieure.

Les polygones simples peuvent devenir des multigéométries en cas d'auto-intersections.

L'argument params peut être utilisé pour fournir une chaîne d'options permettant de sélectionner la méthode à utiliser pour construire une géométrie valide. La chaîne d'options est au format "method=linework|structure keepcollapsed=true|false". Si aucun argument "params" n'est fourni, l'algorithme "linework" sera utilisé par défaut.

La clé "method" a deux valeurs.

  • Le "linework" est l'algorithme original, et construit des géométries valides en extrayant d'abord toutes les lignes, en codant ce linework ensemble, puis en construisant une sortie de valeur à partir du linework.

  • La "structure" est un algorithme qui distingue les anneaux intérieurs et extérieurs, construisant une nouvelle géométrie en réunissant les anneaux extérieurs, puis en différenciant tous les anneaux intérieurs.

La clé "keepcollapsed" est uniquement valable pour l'algorithme "structure" et prend la valeur "true" ou "false". Lorsqu'elle est définie sur "false", les composants géométriques qui se réduisent à une dimension inférieure, par exemple une ligne à un point, sont abandonnés.

Effectué par le module GEOS.

Disponibilité : 2.0.0

Amélioré : 2.0.1, améliorations de la vitesse

Amélioration : 2.1.0, ajout du support pour GEOMETRYCOLLECTION et MULTIPOINT.

Amélioration : 3.1.0, suppression des coordonnées avec des valeurs NaN.

Amélioration : 3.2.0, ajout d'options d'algorithme, 'linework' et 'structure' qui nécessite GEOS >= 3.10.0.

Cette fonction prend en charge la 3D et ne supprime pas l'indice z.

Exemples

before_geom : MULTIPOLYGON de 2 polygones qui se superposent

after_geom : MULTIPOLYGON de 4 polygones qui ne se superposent pas

after_geom_structure : MULTIPOLYGON de 1 polygone qui ne se chevauche pas

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;

before_geom : MULTIPOLYGON de 6 polygones qui se superposent

after_geom : MULTIPOLYGON de 14 polygones qui ne se superposent pas

after_geom_structure : MULTIPOLYGON de 1 polygone qui ne se chevauche pas

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;

Exemples

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

Voir aussi

ST_IsValid, ST_Collect, ST_CollectionExtract