Name

ST_OffsetCurve — Renvoie une ligne décalée par rapport à une distance et un côté donnés à partir d'une ligne en entrée.

Synopsis

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

Description

Renvoie une ligne décalée par rapport à une distance et un côté donnés à partir d'une ligne en entrée. Tous les points des géométries renvoyées ne sont pas plus éloignés que la distance donnée de la géométrie d'entrée. Utile pour calculer des lignes parallèles autour d'une ligne centrale.

Pour une distance positive, le décalage se situe à gauche de la ligne d'entrée et conserve la même direction. Pour une distance négative, il se trouve sur le côté droit et dans la direction opposée.

Les unités de distance sont mesurées en unités du système de référence spatiale.

Notez que la sortie peut être un MULTILINESTRING ou un EMPTY pour certaines géométries d'entrée en forme de puzzle.

Le troisième paramètre facultatif permet de spécifier une liste de paires clé/valeur séparées par des blancs afin de modifier les opérations comme suit :

  • 'quad_segs=#' : nombre de segments utilisés pour approximer un quart de cercle (8 par défaut).

  • 'join=round|mitre|bevel' : style de jointure (la valeur par défaut est "round"). 'miter' est également accepté comme synonyme de 'mitre'.

  • 'mitre_limit=#.#' : limite du rapport de "mitre" (n'affecte que le style d'assemblage "mitred"). 'miter_limit' est également accepté comme synonyme de 'mitre_limit'.

Effectué par le module GEOS.

Behavior changed in GEOS 3.11 so offset curves now have the same direction as the input line, for both positive and negative offsets.

Disponibilité : 2.0

Amélioration : 2.5 - ajout de la prise en charge de GEOMETRYCOLLECTION et MULTILINESTRING

[Note]

Cette fonction ignore la dimension Z. Elle donne toujours un résultat en 2D, même lorsqu'elle est utilisée sur une géométrie en 3D.

Exemples

Calculer une zone tampon ouverte autour des routes

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;

                

15, 'quad_segs=4 join=round' ligne originale et son décalage de 15 unités.

SELECT ST_AsText(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'));

output

LINESTRING(164 1,18 1,12.2597485145237 2.1418070123307,
    7.39339828220179 5.39339828220179,
    5.39339828220179 7.39339828220179,
    2.14180701233067 12.2597485145237,1 18,1 195)
                

-15, 'quad_segs=4 join=round' ligne originale et son décalage de -15 unités

SELECT ST_AsText(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;

notsocurvy

LINESTRING(31 195,31 31,164 31)
                

double décalage pour obtenir plus de courbes, notez que le premier inverse la direction, donc -30 + 15 = -15

SELECT ST_AsText(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;

morecurvy

LINESTRING(164 31,46 31,40.2597485145236 32.1418070123307,
35.3933982822018 35.3933982822018,
32.1418070123307 40.2597485145237,31 46,31 195)
                

Double décalage pour obtenir des courbes plus prononcées, combiné avec le décalage régulier 15 pour obtenir des lignes parallèles. Superposition avec l'original.

SELECT ST_AsText(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;

parallel curves

MULTILINESTRING((164 1,18 1,12.2597485145237 2.1418070123307,
7.39339828220179 5.39339828220179,5.39339828220179 7.39339828220179,
2.14180701233067 12.2597485145237,1 18,1 195),
(164 31,46 31,40.2597485145236 32.1418070123307,35.3933982822018 35.3933982822018,
32.1418070123307 40.2597485145237,31 46,31 195))
                

15, "quad_segs=4 join=bevel" montré avec la ligne originale

SELECT ST_AsText(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'));

output

LINESTRING(164 1,18 1,7.39339828220179 5.39339828220179,
    5.39339828220179 7.39339828220179,1 18,1 195)
                

15,-15 collecté, join=mitre mitre_limit=2.1

SELECT ST_AsText(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;

output

MULTILINESTRING((164 1,11.7867965644036 1,1 11.7867965644036,1 195),
    (31 195,31 31,164 31))
                

Voir aussi

ST_Buffer