From: Regina Obe Date: Fri, 11 Jul 2008 10:48:46 +0000 (+0000) Subject: Example uses of ST_Line_SubString X-Git-Tag: 1.4.0b1~858 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=dd1b9448a826d749d719fc85bac985f91996234f;p=postgis Example uses of ST_Line_SubString git-svn-id: http://svn.osgeo.org/postgis/trunk@2838 b70326c6-7e19-0410-871a-916f4a2858ee --- diff --git a/doc/reference.xml b/doc/reference.xml index 1703058c4..0fccb4728 100644 --- a/doc/reference.xml +++ b/doc/reference.xml @@ -2457,13 +2457,14 @@ z' = z This method is a subcase of the 3D method - ST_Line_substring(linestring geometry, startfraction float8, endfraction float8) + ST_Line_Substring(linestring geometry, startfraction float8, endfraction float8) 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. + 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 This method is a subcase of the 3D method Availability: 1.1.0 + +--Return the approximate 1/3 mid-range part of a linestring +SELECT ST_Line_SubString(ST_LineFromText('LINESTRING(748130.463 2919491.079, + 747979.395 2919630.415, + 747895.989829177 2919705.518)'), 0.333, 0.666); + +--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; +