Name

ST_SimplifyPolygonHull — Berechnet eine vereinfachte topologieerhaltende äußere oder innere Hülle einer polygonalen Geometrie.

Synopsis

geometry ST_SimplifyPolygonHull(geometry param_geom, float vertex_fraction, boolean is_outer = true);

Beschreibung

Berechnet eine vereinfachte topologieerhaltende äußere oder innere Hülle einer polygonalen Geometrie. Eine äußere Hülle deckt die Eingabegeometrie vollständig ab. Eine innere Hülle wird vollständig von der Eingabegeometrie abgedeckt. Das Ergebnis ist eine polygonale Geometrie, die durch eine Teilmenge der Eingabepunkte gebildet wird. MultiPolygone und Löcher werden behandelt und führen zu einem Ergebnis mit derselben Struktur wie die Eingabe.

Die Verringerung der Scheitelpunktanzahl wird durch den Parameter vertex_fraction gesteuert, der eine Zahl im Bereich von 0 bis 1 ist. Niedrigere Werte führen zu einfacheren Ergebnissen mit einer geringeren Anzahl von Scheitelpunkten und einer geringeren Konkavität. Ein Scheitelpunktanteil von 1,0 ergibt sowohl für äußere als auch für innere Hüllen die ursprüngliche Geometrie. Für äußere Hüllen ergibt ein Wert von 0,0 die konvexe Hülle (für ein einzelnes Polygon); für innere Hüllen ergibt er ein Dreieck.

Bei der Vereinfachung werden nach und nach die konkaven Ecken entfernt, die die geringste Fläche enthalten, bis das Ziel für die Anzahl der Eckpunkte erreicht ist. Er verhindert, dass sich Kanten kreuzen, so dass das Ergebnis immer eine gültige polygonale Geometrie ist.

Um bessere Ergebnisse bei Geometrien zu erzielen, die relativ lange Liniensegmente enthalten, kann es notwendig sein, die Eingabe zu "segmentieren", wie unten gezeigt.

Wird vom GEOS Modul ausgeführt

Verfügbarkeit: 3.3.0.

Erfordert GEOS >= 3.11.0.

Beispiele

Äußere Hülle eines Polygons

SELECT ST_SimplifyPolygonHull(
  'POLYGON ((131 158, 136 163, 161 165, 173 156, 179 148, 169 140, 186 144, 190 137, 185 131, 174 128, 174 124, 166 119, 158 121, 158 115, 165 107, 161 97, 166 88, 166 79, 158 57, 145 57, 112 53, 111 47, 93 43, 90 48, 88 40, 80 39, 68 32, 51 33, 40 31, 39 34, 49 38, 34 38, 25 34, 28 39, 36 40, 44 46, 24 41, 17 41, 14 46, 19 50, 33 54, 21 55, 13 52, 11 57, 22 60, 34 59, 41 68, 75 72, 62 77, 56 70, 46 72, 31 69, 46 76, 52 82, 47 84, 56 90, 66 90, 64 94, 56 91, 33 97, 36 100, 23 100, 22 107, 29 106, 31 112, 46 116, 36 118, 28 131, 53 132, 59 127, 62 131, 76 130, 80 135, 89 137, 87 143, 73 145, 80 150, 88 150, 85 157, 99 162, 116 158, 115 165, 123 165, 122 170, 134 164, 131 158))',
    0.3);

Innere Hülle eines Polygons

SELECT ST_SimplifyPolygonHull(
  'POLYGON ((131 158, 136 163, 161 165, 173 156, 179 148, 169 140, 186 144, 190 137, 185 131, 174 128, 174 124, 166 119, 158 121, 158 115, 165 107, 161 97, 166 88, 166 79, 158 57, 145 57, 112 53, 111 47, 93 43, 90 48, 88 40, 80 39, 68 32, 51 33, 40 31, 39 34, 49 38, 34 38, 25 34, 28 39, 36 40, 44 46, 24 41, 17 41, 14 46, 19 50, 33 54, 21 55, 13 52, 11 57, 22 60, 34 59, 41 68, 75 72, 62 77, 56 70, 46 72, 31 69, 46 76, 52 82, 47 84, 56 90, 66 90, 64 94, 56 91, 33 97, 36 100, 23 100, 22 107, 29 106, 31 112, 46 116, 36 118, 28 131, 53 132, 59 127, 62 131, 76 130, 80 135, 89 137, 87 143, 73 145, 80 150, 88 150, 85 157, 99 162, 116 158, 115 165, 123 165, 122 170, 134 164, 131 158))',
    0.3, false);

Vereinfachung der Außenhülle eines MultiPolygons, mit Segmentierung

SELECT ST_SimplifyPolygonHull(
  ST_Segmentize(ST_Letters('xt'), 2.0),
    0.1);