ST_OffsetCurve — Returnerar en förskjuten linje på ett givet avstånd och sida från en inmatad linje.
geometry ST_OffsetCurve(geometry line, float signed_distance, text style_parameters='');
Returnerar en offsetlinje på ett givet avstånd och sida från en indatalinje. Alla punkter i de returnerade geometrierna ligger inte längre bort än det angivna avståndet från indatageometrin. Användbar för att beräkna parallella linjer kring en mittlinje.
För positivt avstånd är förskjutningen på vänster sida om inmatningsraden och behåller samma riktning. För ett negativt avstånd är den på höger sida och i motsatt riktning.
Avståndsenheter mäts i enheter i det spatiala referenssystemet.
Observera att utdata kan vara MULTILINESTRING eller EMPTY för vissa pusselformade indatageometrier.
Den valfria tredje parametern gör det möjligt att ange en lista med blankseparerade nyckel=värde-par för att justera operationer enligt följande:
'quad_segs=#': antal segment som används för att approximera en kvartscirkel (standardvärde 8).
'join=round|mitre|bevel': fogstil (standard är "round"). "miter" accepteras också som synonym för "mitre".
'mitre_limit=#.#': gräns för mitraförhållande (påverkar endast miterad fogstil). 'miter_limit' accepteras också som synonym för 'mitre_limit'.
Utförs av GEOS-modulen.
Beteendet ändrades i GEOS 3.11 så att offsetkurvorna nu har samma riktning som indatalinjen, för både positiva och negativa offsets.
Tillgänglighet: 2.0
Förbättrad: 2.5 - stöd för GEOMETRYCOLLECTION och MULTILINESTRING har lagts till
|
|
|
Denna funktion ignorerar Z-dimensionen. Den ger alltid ett 2D-resultat även när den används på en 3D-geometri. |
Beräkna en öppen buffert runt vägar.
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;
Förskjut 15 enheter med quad_segs=4 join=round.
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');
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)
Förskjut -15 enheter med quad_segs=4 join=round.
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;
LINESTRING(164 31,31 31,31 195)
Tillämpa två negativa förskjutningar för att få en jämnare kurva; avstånden kombineras till -45 enheter.
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;
LINESTRING(164 61,61 61,61 195)
Samla den positiva förskjutningen och den dubbla förskjutningen för att skapa parallella kurvor.
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;
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))
Förskjut 15 enheter med en avfasad sammanfogning.
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');
LINESTRING(164 1,18 1,7.393398282201788 5.393398282201788,
5.393398282201788 7.393398282201788,1 18,1 195)
Samla förskjutningar på båda sidor med en geringfog och en geringgräns på 2,2.
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;
MULTILINESTRING((164 1,11.786796564403577 1,1 11.786796564403577,1 195),
(164 31,31 31,31 195))