Name

ST_ChaikinSmoothing — Gibt eine geglättete Version einer Geometrie zurück, die den Chaikin-Algorithmus verwendet

Synopsis

geometry ST_ChaikinSmoothing(geometry geom, integer nIterations = 1, boolean preserveEndPoints = false);

Beschreibung

Glättet eine lineare oder polygonale Geometrie mit Chaikin-Algorithmus. Der Grad der Glättung wird durch den Parameter nIterationen gesteuert. Bei jeder Iteration wird jeder innere Scheitelpunkt durch zwei Scheitelpunkte ersetzt, die bei 1/4 der Länge der Liniensegmente vor und nach dem Scheitelpunkt liegen. Ein angemessenes Maß an Glättung wird durch 3 Iterationen erreicht; das Maximum ist auf 5 begrenzt.

Wenn preserveEndPoints true ist, werden die Endpunkte von Polygonringen nicht geglättet. Die Endpunkte von LineStrings werden immer beibehalten.

[Note]

Die Anzahl der Scheitelpunkte verdoppelt sich mit jeder Iteration, so dass die Ergebnisgeometrie viel mehr Punkte als die Eingabe haben kann. Um die Anzahl der Punkte zu reduzieren, verwenden Sie eine Vereinfachungsfunktion für das Ergebnis (siehe ST_Simplify, ST_SimplifyPreserveTopology und ST_SimplifyVW).

Das Ergebnis enthält interpolierte Werte für die Z- und M-Dimensionen, sofern vorhanden.

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

Verfügbarkeit: 2.5.0

Beispiele

Glätten eines Dreiecks:

SELECT ST_AsText(ST_ChaikinSmoothing(geom)) smoothed
FROM (SELECT  'POLYGON((0 0, 8 8, 0 16, 0 0))'::geometry geom) AS foo;

                 smoothed
───────────────────────────────────────────
 POLYGON((2 2,6 6,6 10,2 14,0 12,0 4,2 2))

Glätten eines Polygons mit 1, 2 und 3 Iterationen:

nIterationen = 1

nIterationen = 2

nIterationen = 3

SELECT ST_ChaikinSmoothing(
            'POLYGON ((20 20, 60 90, 10 150, 100 190, 190 160, 130 120, 190 50, 140 70, 120 10, 90 60, 20 20))',
            generate_series(1, 3) );

Glätten eines LineStrings mit 1, 2 und 3 Iterationen:

nIterationen = 1

nIterationen = 2

nIterationen = 3

SELECT ST_ChaikinSmoothing(
            'LINESTRING (10 140, 80 130, 100 190, 190 150, 140 20, 120 120, 50 30, 30 100)',
            generate_series(1, 3) );