## Name

ST_Line_Substring — Return a linestring being a substring of the input one
starting and ending at the given fractions of total 2d length.
Second and third arguments are float8 values between 0 and
1.

## Synopsis

`geometry `**ST_Line_Substring**(

geometry `a_linestring`, float `startfraction`, float `endfraction``)`

;

## Description

Return a linestring being a substring of the input one
starting and ending at the given fractions of total 2d length.
Second and third arguments are float8 values between 0 and
1. This only works with LINESTRINGs.
To use with contiguous MULTILINESTRINGs use in conjunction with ST_LineMerge.

If 'start' and 'end' have the same value this is equivalent
to ST_Line_Interpolate_Point.

See ST_Line_Locate_Point for
computing the line location nearest to a Point.

| |
---|

Since release 1.1.1 this function also interpolates M and
Z values (when present), while prior releases set them to
unspecified values. |

Availability: 1.1.0, Z and M supported added in 1.1.1

This function supports 3d and will not drop the z-index.

## Examples

--Return the approximate 1/3 mid-range part of a linestring
SELECT ST_AsText(ST_Line_SubString(ST_GeomFromText('LINESTRING(25 50, 100 125, 150 190)'), 0.333, 0.666));
st_astext
------------------------------------------------------------------------------------------------
LINESTRING(69.2846934853974 94.2846934853974,100 125,111.700356260683 140.210463138888)
--The below example simulates a while loop in
--SQL using PostgreSQL generate_series() to cut all
--linestrings in a table to 100 unit segments
-- of which no segment is longer than 100 units
-- units are measured in the SRID units of measurement
-- It also assumes all geometries are LINESTRING or contiguous MULTILINESTRING
--and no geometry is longer than 100 units*10000
--for better performance you can reduce the 10000
--to match max number of segments you expect
SELECT field1, field2, ST_Line_Substring(the_geom, 100.00*n/length,
CASE
WHEN 100.00*(n+1) < length THEN 100.00*(n+1)/length
ELSE 1
END) As the_geom
FROM
(SELECT sometable.field1, sometable.field2,
ST_LineMerge(sometable.the_geom) AS the_geom,
ST_Length(sometable.the_geom) As length
FROM sometable
) AS t
CROSS JOIN generate_series(0,10000) AS n
WHERE n*100.00/length < 1;