Name

ST_LineSubstring — Gibt den Teil einer Linie zwischen zwei gebrochenen Stellen zurück.

Synopsis

geometry ST_LineSubstring(geometry a_linestring, float8 startfraction, float8 endfraction);

geography ST_LineSubstring(geography a_linestring, float8 startfraction, float8 endfraction);

Beschreibung

Berechnet die Zeile, die der Abschnitt der Eingabezeile ist, der an den angegebenen Bruchstellen beginnt und endet. Das erste Argument muss ein LINESTRING sein. Das zweite und dritte Argument sind Werte im Bereich [0, 1], die die Anfangs- und Endpunkte als Bruchteile der Zeilenlänge darstellen. Die Werte Z und M werden für hinzugefügte Endpunkte interpoliert, falls vorhanden.

Gleichbedeutend mit ST_LineInterpolatePoint, wenn Anfangswert und Endwert ident sind.

[Note]

Dies funktioniert nur bei LINESTRINGs. Zur Verwendung bei zusammenhängenden MULTILINESTRINGs müssen diese zunächst mit ST_LineMerge verbunden werden.

[Note]

Ab Version 1.1.1 interpoliert diese Funktion auch M- und Z-Werte (falls vorhanden), während frühere Versionen unbestimmte Werte setzten.

Verbessert: 3.4.0 - Unterstützung für Geographie wurde eingeführt.

Änderung: 2.1.0. Bis zu 2.0.x wurde diese Funktion mit ST_Line_Substring bezeichnet.

Verfügbarkeit: 1.1.0, mit 1.1.1 wurde die Unterstützung für Z und M hinzugefügt

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

Beispiele

Ein Linienstück von einem Mittelstück mit 1/3 Länge überlagert (0.333, 0.666)

SELECT ST_AsText(ST_LineSubstring( 'LINESTRING (20 180, 50 20, 90 80, 120 40, 180 150)', 0.333, 0.666));
------------------------------------------------------------------------------------------------
LINESTRING (45.17311810399485 45.74337011202746, 50 20, 90 80, 112.97593050157862 49.36542599789519)

Wenn Anfangs- und Endpunkt gleich sind, ist das Ergebnis ein PUNKT.

SELECT ST_AsText(ST_LineSubstring( 'LINESTRING(25 50, 100 125, 150 190)', 0.333, 0.333));
------------------------------------------
 POINT(69.2846934853974 94.2846934853974)

Eine Abfrage, um einen LineString in Abschnitte der Länge 100 oder kürzer zu schneiden. Sie verwendet generate_series() mit einem CROSS JOIN LATERAL, um das Äquivalent einer FOR-Schleife zu erzeugen.


WITH data(id, geom) AS (VALUES
        ( 'A', 'LINESTRING( 0 0, 200 0)'::geometry ),
        ( 'B', 'LINESTRING( 0 100, 350 100)'::geometry ),
        ( 'C', 'LINESTRING( 0 200, 50 200)'::geometry )
    )
SELECT id, i,
       ST_AsText( ST_LineSubstring( geom, startfrac, LEAST( endfrac, 1 )) ) AS geom
FROM (
    SELECT id, geom, ST_Length(geom) len, 100 sublen FROM data
    ) AS d
CROSS JOIN LATERAL (
    SELECT i, (sublen * i) / len AS startfrac,
              (sublen * (i+1)) / len AS endfrac
    FROM generate_series(0, floor( len / sublen )::integer ) AS t(i)
    -- skip last i if line length is exact multiple of sublen
    WHERE (sublen * i) / len <
> 1.0
    ) AS d2;

 id | i |            geom
----+---+-----------------------------
 A  | 0 | LINESTRING(0 0,100 0)
 A  | 1 | LINESTRING(100 0,200 0)
 B  | 0 | LINESTRING(0 100,100 100)
 B  | 1 | LINESTRING(100 100,200 100)
 B  | 2 | LINESTRING(200 100,300 100)
 B  | 3 | LINESTRING(300 100,350 100)
 C  | 0 | LINESTRING(0 200,50 200)

Geografische Umsetzungsmaßnahmen entlang eines Sphäroids, Geometrie entlang einer Linie

SELECT ST_AsText(ST_LineSubstring( 'LINESTRING(-118.2436 34.0522, -71.0570 42.3611)'::geography, 0.333, 0.666),6) AS geog_sub
 , ST_AsText(ST_LineSubstring('LINESTRING(-118.2436 34.0522, -71.0570 42.3611)'::geometry, 0.333, 0.666),6) AS geom_sub;
---------------------------------------------------------------
geog_sub | LINESTRING(-104.167064 38.854691,-87.674646 41.849854)
geom_sub | LINESTRING(-102.530462 36.819064,-86.817324 39.585927)