ST_Dump is useful for extracting individual geometries from a collection, like LINESTRINGs from a MULTILINESTRING. There is a function slated for future development called ST_DumpPoints which will do what you are after, but that'll be sometime with version 1.4.1 or something.

For now, you can do what you want with generate_series.
ie.

SELECT
 ST_AsText(ST_MakeLine(p1, p2)),
 ST_Length(ST_MakeLine(p1, p2))
FROM (
 SELECT
   ST_PointN(geom, generate_series(1, ST_NPoints(geom)-1)) AS p1,
   ST_PointN(geom, generate_series(2, ST_NPoints(geom))) AS p2
 FROM
  (SELECT ST_AsText('
     LINESTRING(
         0 0,
         0 5,
         10 5,
         10 2,
         2 2)'::geometry) AS geom
   ) AS a
 ) AS b;

      st_astext       | st_length
-----------------------+-----------
LINESTRING(0 0,0 5)   |         5
LINESTRING(0 5,10 5)  |        10
LINESTRING(10 5,10 2) |         3
LINESTRING(10 2,2 2)  |         8
(4 rows)

Cheers,
Kevin


benton101 wrote:
Hi,

I have a line of Geo Type LINESTRING. It contains one vertices somewhere
along its total length with a start and end point. I want to find the length
of each line between the end points and the vertices. I have attempted to
use ST_Dump to do this. I was hoping that it would create two records, but
it seems that ST_Dump see's it as one geometry. Is this true and if so is
there another function I could use to find out the length of each vertices?

This is the sql I have formed, the table has some lines that overlap /
intersect each other ...

SELECT get_results.the_geom AS the_geom
  FROM (SELECT (ST_Dump(dump_results.the_geom)).geom AS the_geom
          FROM (SELECT ST_MakeLine(union_results.pnt) AS the_geom
                     , union_results.gid AS gid
                  FROM (SELECT a.gid
                             , ST_StartPoint(ST_Intersection(a.the_geom,
b.the_geom)) AS pnt
                          FROM spl_mga_road_lines a
                             , spl_mga_road_lines b
                         WHERE ST_Intersects(a.the_geom,b.the_geom)
                           AND
GeometryType(ST_StartPoint(ST_Intersection(a.the_geom, b.the_geom))) =
'POINT'
                               UNION
                        SELECT a.gid
                             , ST_Intersection(a.the_geom, b.the_geom) AS
pnt
                          FROM spl_mga_road_lines a
                             , spl_mga_road_lines b
                         WHERE ST_Intersects(a.the_geom,b.the_geom)
                           AND GeometryType(ST_Intersection(a.the_geom,
b.the_geom)) = 'POINT'
                               UNION
                        SELECT a.gid
                             , ST_EndPoint(ST_Intersection(a.the_geom,
b.the_geom)) AS pnt
                          FROM spl_mga_road_lines a
                             , spl_mga_road_lines b
                         WHERE ST_Intersects(a.the_geom,b.the_geom)
                           AND
GeometryType(ST_EndPoint(ST_Intersection(a.the_geom, b.the_geom))) = 'POINT'
                             ) union_results
              GROUP BY union_results.gid) dump_results
WHERE ST_Length(dump_results.the_geom) > 5.0)get_results


Thank You
Ben

_______________________________________________
postgis-users mailing list
[email protected]
http://postgis.refractions.net/mailman/listinfo/postgis-users

Reply via email to