Name

ST_Subdivide — Calcule une subdivision rectiligne d'une géométrie.

Synopsis

setof geometry ST_Subdivide(geometry geom, integer max_vertices=256, float8 gridSize = -1);

Description

Renvoie un ensemble de géométries résultant de la division de geom en parties à l'aide de lignes rectilignes, chaque partie ne contenant pas plus de max_vertices.

max_vertices doit être égal ou supérieur à 5, car 5 points sont nécessaires pour représenter une boîte fermée. gridSize peut être spécifié pour que la subdivision fonctionne dans un espace de précision fixe (nécessite GEOS-3.9.0+).

Les opérations "point dans polygone" et autres opérations spatiales sont normalement plus rapides pour les ensembles de données subdivisés et indexés. Étant donné que les boîtes de délimitation des parties couvrent généralement une zone plus petite que la boîte b de la géométrie d'origine, les requêtes d'index produisent moins de cas "hit". Les cas "hit" sont plus rapides car les opérations spatiales exécutées par la revérification de l'index traitent moins de points.

[Note]

Il s'agit d'une fonction de retour d'ensemble (SRF) qui renvoie un ensemble de lignes contenant des valeurs de géométrie uniques. Elle peut être utilisée dans une liste SELECT ou une clause FROM pour produire un ensemble de résultats avec un enregistrement pour chaque géométrie de résultat.

Effectué par le module GEOS.

Disponibilité : 2.2.0

Amélioration : 2.5.0 réutilise les points existants lors de la division d'un polygone, le nombre de vertex est réduit de 8 à 5.

Amélioration : 3.1.0 accepte un paramètre gridSize.

Nécessite GEOS >= 3.9.0 pour utiliser le paramètre gridSize

Exemples

Exemple: Subdivisez un polygone en parties ne comportant pas plus de 10 sommets et attribuez à chaque partie un identifiant unique.

Subdivisé en un maximum de 10 sommets

SELECT row_number() OVER() As rn, ST_AsText(geom) As wkt
    FROM (SELECT ST_SubDivide(
        'POLYGON((132 10,119 23,85 35,68 29,66 28,49 42,32 56,22 64,32 110,40 119,36 150,
        57 158,75 171,92 182,114 184,132 186,146 178,176 184,179 162,184 141,190 122,
        190 100,185 79,186 56,186 52,178 34,168 18,147 13,132 10))'::geometry,10))  AS f(geom);
rn │                                                      wkt
────┼────────────────────────────────────────────────────────────────────────────────────────────────────────────────
  1 │ POLYGON((119 23,85 35,68 29,66 28,32 56,22 64,29.8260869565217 100,119 100,119 23))
  2 │ POLYGON((132 10,119 23,119 56,186 56,186 52,178 34,168 18,147 13,132 10))
  3 │ POLYGON((119 56,119 100,190 100,185 79,186 56,119 56))
  4 │ POLYGON((29.8260869565217 100,32 110,40 119,36 150,57 158,75 171,92 182,114 184,114 100,29.8260869565217 100))
  5 │ POLYGON((114 184,132 186,146 178,176 184,179 162,184 141,190 122,190 100,114 100,114 184))
  

Exemple: Densifier une longue ligne de type geography en utilisant ST_Segmentize(geography, distance), et utiliser ST_Subdivide pour diviser la ligne résultante en sous-lignes de 8 sommets.

Les lignes densifiées et divisées.

SELECT ST_AsText( ST_Subdivide(
            ST_Segmentize('LINESTRING(0 0, 85 85)'::geography,
                          1200000)::geometry,    8));
LINESTRING(0 0,0.487578359029357 5.57659056746196,0.984542144675897 11.1527721155093,1.50101059639722 16.7281035483571,1.94532113630331 21.25)
LINESTRING(1.94532113630331 21.25,2.04869538062779 22.3020741387339,2.64204641967673 27.8740533545155,3.29994062412787 33.443216802941,4.04836719489742 39.0084282520239,4.59890468420694 42.5)
LINESTRING(4.59890468420694 42.5,4.92498503922732 44.5680389206321,5.98737409390639 50.1195229244701,7.3290919767674 55.6587646879025,8.79638749938413 60.1969505994924)
LINESTRING(8.79638749938413 60.1969505994924,9.11375579533779 61.1785363177625,11.6558166691368 66.6648504160202,15.642041247655 72.0867690601745,22.8716627200212 77.3609628116894,24.6991785131552 77.8939011989848)
LINESTRING(24.6991785131552 77.8939011989848,39.4046096622744 82.1822848017636,44.7994523421035 82.5156766227011)
LINESTRING(44.7994523421035 82.5156766227011,85 85)

Exemple: Subdiviser les géométries complexes d'une table existante. Les enregistrements de la géométrie d'origine sont supprimés de la table source et de nouveaux enregistrements sont insérés pour chaque géométrie de résultat subdivisée.


WITH complex_areas_to_subdivide AS (
    DELETE from polygons_table
    WHERE ST_NPoints(geom) 
> 255
    RETURNING id, column1, column2, column3, geom
)
INSERT INTO polygons_table (fid, column1, column2, column3, geom)
    SELECT fid, column1, column2, column3,
           ST_Subdivide(geom, 255) as geom
    FROM complex_areas_to_subdivide;

Exemple: Créer une nouvelle table contenant les géométries subdivisées, en conservant la clé de la géométrie d'origine afin que la nouvelle table puisse être jointe à la table source. Étant donné que ST_Subdivide est une fonction (tableau) qui renvoie un ensemble de lignes à valeur unique, cette syntaxe produit automatiquement un tableau avec une ligne pour chaque partie du résultat.

CREATE TABLE subdivided_geoms AS
    SELECT pkey, ST_Subdivide(geom) AS geom
    FROM original_geoms;