Name

ST_Subdivide — Berechnet eine geradlinige Unterteilung einer Geometrie.

Synopsis

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

Beschreibung

Gibt eine Menge von Geometrien zurück, die das Ergebnis der Unterteilung von geom in Teile mit geradlinigen Linien sind, wobei jeder Teil nicht mehr als max_vertices enthält.

max_vertices muss 5 oder mehr sein, da 5 Punkte benötigt werden, um eine geschlossene Box darzustellen. gridSize kann angegeben werden, damit das Clipping im Raum mit fester Genauigkeit funktioniert (erfordert GEOS-3.9.0+).

Punkt-in-Polygon und andere räumliche Operationen sind bei indizierten, unterteilten Datensätzen normalerweise schneller. Da die Boundingboxen für die Teile in der Regel einen kleineren Bereich abdecken als die ursprüngliche Geometriebox, führen Indexabfragen zu weniger "Treffer"-Fällen. Die "Treffer"-Fälle sind schneller, weil die räumlichen Operationen, die von der Indexnachprüfung ausgeführt werden, weniger Punkte verarbeiten.

[Note]

Dies ist eine set-returning function (SRF), die eine Reihe von Zeilen mit einzelnen Geometriewerten zurückgibt. Sie kann in einer SELECT-Liste oder einer FROM-Klausel verwendet werden, um eine Ergebnismenge mit einem Datensatz für jede Ergebnisgeometrie zu erzeugen.

Wird vom GEOS Modul ausgeführt

Verfügbarkeit: 2.2.0

Verbessert: 2.5.0 verwendet vorhandene Punkte bei der Polygonaufteilung wieder, die Anzahl der Scheitelpunkte wurde von 8 auf 5 gesenkt.

Verbessert: 3.1.0 akzeptiert einen gridSize-Parameter.

Erfordert GEOS >= 3.9.0 zur Verwendung des Parameters gridSize

Beispiele

Beispiel: Unterteilen Sie ein Polygon in Teile mit nicht mehr als 10 Scheitelpunkten, und weisen Sie jedem Teil eine eindeutige ID zu.

Unterteilt in maximal 10 Scheitelpunkte

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

Beispiel: Verdichten Sie eine lange geografische Linie mit ST_Segmentize(geography, distance), und verwenden Sie ST_Subdivide, um die resultierende Linie in Unterlinien mit 8 Scheitelpunkten zu unterteilen.

Die verdichteten und geteilten Linien.

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)

Beispiel: Die komplexen Geometrien einer Tabelle werden an Ort und Stelle unterteilt. Die ursprünglichen Geometriedatensätze werden aus der Quelltabelle gelöscht, und neue Datensätze für jede unterteilte Ergebnisgeometrie werden eingefügt.


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;

Beispiel: Erstellen einer neuen Tabelle mit unterteilten Geometrien unter Beibehaltung des Schlüssels der ursprünglichen Geometrie, so dass die neue Tabelle mit der Quelltabelle verbunden werden kann. Da ST_Subdivide eine mengenrückgebende (Tabellen-)Funktion ist, die eine Menge von Einzelwertzeilen zurückgibt, erzeugt diese Syntax automatisch eine Tabelle mit einer Zeile für jedes Ergebnisteil.

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