Name

ST_OffsetCurve — Gibt eine versetzte Linie in einem bestimmten Abstand und einer bestimmten Seite von einer Eingabelinie zurück.

Übersicht

geometry ST_OffsetCurve(geometry line, float signed_distance, text style_parameters='');

Beschreibung

Gibt eine versetzte Linie in einem bestimmten Abstand und einer bestimmten Seite von einer Eingabelinie zurück. Alle Punkte der zurückgegebenen Geometrien sind nicht weiter als der angegebene Abstand von der Eingabegeometrie entfernt. Nützlich für die Berechnung von parallelen Linien um eine Mittellinie.

Bei einem positiven Abstand befindet sich der Versatz auf der linken Seite der Eingabezeile und behält die gleiche Richtung bei. Bei einem negativen Abstand befindet er sich auf der rechten Seite und in der entgegengesetzten Richtung.

Die Einheiten der Entfernung werden in den Einheiten des Koordinatenreferenzsystems gemessen.

Bei einer Puzzlestück-förmigen Geometrie kann die Ausgabe manchmal ein MULTILINESTRING oder EMPTY sein.

Der optionale dritte Parameter ermöglicht es eine Liste von leerzeichengetrennten key=value Paaren anzulegen, um die Berechnungen wie folgt zu optimieren:

  • 'quad_segs=#' : Anzahl der Segmente die verwendet werden um einen Viertelkreis anzunähern (standardmäßig 8).

  • 'join=round|mitre|bevel' : join style (defaults to "round"). 'miter' kann auch als Synonym für 'mitre' verwendet werden.

  • 'mitre_limit=#.#' : Gehrungsobergrenze (beeinflusst nur Gehrungsverbindungen). 'miter_limit' kann auch als Synonym von 'mitre_limit' verwendet werden.

Wird vom GEOS Modul ausgeführt

Durch die Änderung des Verhaltens in GEOS 3.11 haben versetzte Kurven nun die gleiche Richtung wie die Eingabelinie, sowohl bei positiven als auch bei negativen Versetzungen.

Verfügbarkeit: 2.0

Erweiterung: ab 2.5 wird auch GEOMETRYCOLLECTION und MULTILINESTRING unterstützt.

[Anmerkung]

Diese Funktion ignoriert die Z-Dimension. Sie liefert immer ein 2D-Ergebnis, auch wenn sie auf eine 3D-Geometrie angewendet wird.

Beispiele

Compute an open buffer around roads.

Code
SELECT ST_Union(
 ST_OffsetCurve(f.geom, f.width/2, 'quad_segs=4 join=round'),
 ST_OffsetCurve(f.geom, -f.width/2, 'quad_segs=4 join=round')
) as track
FROM someroadstable;

                

Offset 15 units with quad_segs=4 join=round.

Code
SELECT ST_OffsetCurve(
    ST_GeomFromText('LINESTRING(164 16,144 16,124 16,104 16,84 16,64 16,
    44 16,24 16,20 16,18 16,17 17,
    16 18,16 20,16 40,16 60,16 80,16 100,
    16 120,16 140,16 160,16 180,16 195)'),
    15, 'quad_segs=4 join=round');
Ausgabe von Rastern
LINESTRING(164 1,18 1,15.073645169758077 1.288220793951544,
    12.259748514523654 2.141807012330698,9.66644650470597 3.527955815461818,
    7.393398282201788 5.393398282201788,5.393398282201788 7.393398282201788,
    3.527955815461818 9.66644650470597,2.141807012330696 12.259748514523654,
    1.288220793951544 15.073645169758075,1 18,1 195)
Figure
Geometry figure for visual-st-offsetcurve-01

Offset -15 units with quad_segs=4 join=round.

Code
SELECT ST_OffsetCurve(
    geom,
    -15,
    'quad_segs=4 join=round') As notsocurvy
    FROM ST_GeomFromText('LINESTRING(164 16,144 16,124 16,104 16,84 16,64 16,
    44 16,24 16,20 16,18 16,17 17,
    16 18,16 20,16 40,16 60,16 80,16 100,
    16 120,16 140,16 160,16 180,16 195)') As geom;
Ausgabe von Rastern
LINESTRING(164 31,31 31,31 195)
Figure
Geometry figure for visual-st-offsetcurve-02

Apply two negative offsets to obtain a smoother curve; the distances combine to -45 units.

Code
SELECT ST_OffsetCurve(
    ST_OffsetCurve(
        geom,
        -30,
        'quad_segs=4 join=round'),
    -15,
    'quad_segs=4 join=round') As morecurvy
    FROM ST_GeomFromText('LINESTRING(164 16,144 16,124 16,104 16,84 16,64 16,
    44 16,24 16,20 16,18 16,17 17,
    16 18,16 20,16 40,16 60,16 80,16 100,
    16 120,16 140,16 160,16 180,16 195)') As geom;
Ausgabe von Rastern
LINESTRING(164 61,61 61,61 195)
Figure
Geometry figure for visual-st-offsetcurve-03

Collect the positive offset and the double-offset to produce parallel curves.

Code
SELECT ST_Collect(
    ST_OffsetCurve(geom, 15, 'quad_segs=4 join=round'),
    ST_OffsetCurve(
        ST_OffsetCurve(
            geom,
            -30,
            'quad_segs=4 join=round'),
        -15,
        'quad_segs=4 join=round')
) As parallel_curves
    FROM ST_GeomFromText('LINESTRING(164 16,144 16,124 16,104 16,84 16,64 16,
    44 16,24 16,20 16,18 16,17 17,
    16 18,16 20,16 40,16 60,16 80,16 100,
    16 120,16 140,16 160,16 180,16 195)') As geom;
Ausgabe von Rastern
MULTILINESTRING((164 1,18 1,15.073645169758077 1.288220793951544,
12.259748514523654 2.141807012330698,9.66644650470597 3.527955815461818,
7.393398282201788 5.393398282201788,5.393398282201788 7.393398282201788,
3.527955815461818 9.66644650470597,2.141807012330696 12.259748514523654,
1.288220793951544 15.073645169758075,1 18,1 195),(164 61,61 61,61 195))
Figure
Geometry figure for visual-st-offsetcurve-04

Offset 15 units with a bevel join.

Code
SELECT ST_OffsetCurve(
    ST_GeomFromText('LINESTRING(164 16,144 16,124 16,104 16,84 16,64 16,
    44 16,24 16,20 16,18 16,17 17,
    16 18,16 20,16 40,16 60,16 80,16 100,
    16 120,16 140,16 160,16 180,16 195)'),
        15, 'quad_segs=4 join=bevel');
Ausgabe von Rastern
LINESTRING(164 1,18 1,7.393398282201788 5.393398282201788,
    5.393398282201788 7.393398282201788,1 18,1 195)
Figure
Geometry figure for visual-st-offsetcurve-05

Collect offsets on both sides using a mitre join and a mitre limit of 2.2.

Code
SELECT ST_Collect(
    ST_OffsetCurve(geom, 15, 'quad_segs=4 join=mitre mitre_limit=2.2'),
    ST_OffsetCurve(geom, -15, 'quad_segs=4 join=mitre mitre_limit=2.2')
    )
    FROM ST_GeomFromText('LINESTRING(164 16,144 16,124 16,104 16,84 16,64 16,
    44 16,24 16,20 16,18 16,17 17,
    16 18,16 20,16 40,16 60,16 80,16 100,
    16 120,16 140,16 160,16 180,16 195)') As geom;
Ausgabe von Rastern
MULTILINESTRING((164 1,11.786796564403577 1,1 11.786796564403577,1 195),
    (164 31,31 31,31 195))
Figure
Geometry figure for visual-st-offsetcurve-06

Siehe auch

ST_Buffer