CREATE TEMP TABLE mypolygontable AS
SELECT
  'MULTIPOLYGON(((0 0, 0 4, 4 4, 4 0, 0 0),
                 (1 1, 1 2, 2 2, 2 1, 1 1)),
                ((5 5, 5 6, 6 6, 6 5, 5 5))
               )'::geometry geom;


-- make line segments from every startpoint and endpoint
SELECT ST_AsText( ST_MakeLine(sp,ep) )
FROM
  -- extract the endpoints for every 2-point line segment for each linestring
  (SELECT
     ST_PointN(geom, generate_series(1, ST_NPoints(geom)-1)) as sp,
     ST_PointN(geom, generate_series(2, ST_NPoints(geom)  )) as ep
   FROM
      -- extract the individual linestrings
     (SELECT (ST_Dump(ST_Boundary(geom))).geom
      FROM mypolygontable
      ) AS linestrings
   ) AS segments;

      st_astext
---------------------
 LINESTRING(0 0,0 4)
 LINESTRING(0 4,4 4)
 LINESTRING(4 4,4 0)
 LINESTRING(4 0,0 0)
 LINESTRING(1 1,1 2)
 LINESTRING(1 2,2 2)
 LINESTRING(2 2,2 1)
 LINESTRING(2 1,1 1)
 LINESTRING(5 5,5 6)
 LINESTRING(5 6,6 6)
 LINESTRING(6 6,6 5)
 LINESTRING(6 5,5 5)
(12 rows)


Cheers,
Kevin

On 1/29/2010 5:16 AM, Nicolas Gillet - MARKET-IP wrote:
Hello,

I am looking for some tips to split a polygon to its simplest linestrings.

An example worth better than words :

POLYGON((0 0, 0 1, 1 1, 1 0, 0 0))

Would become :

MULTINLINESTRING((0 0, 0 1), (0 1, 1 1), (1 1, 1 0), (1 0, 0 0))

Every single linestring has to have two and only two points.

Is there a way to do this with the existing postgis functions ?

I found several ways to turn a polygon to a (multi)linestring but not to
split it then into shortest linestrings.

Thanks for any input.

Nicolas

Gillet



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

Reply via email to