Yep, would need some wrapping to output right path :-) I'd really like to have more functions in PostGis...
I'm not going to do it yet, working on a SnapToLine function. Cheers, Rémi-C 2013/10/30 Nicolas Ribot <[email protected]> > Hi, > > To dump (multi)polygons boundaries, you can use: > st_exteriorRing((st_dumpRings((st_dump(geom)).geom)).geom) > > I returns one linestring for each boundary, taking holes into account. > > Nicolas > > On 30 October 2013 14:34, Rémi Cura <[email protected]> wrote: > > Hey, > > here is the function, safe for geometry collection and multilinestring as > > well. > > It mimics ST_DumpPoints. > > > > It doesn't work on polygon as we would first need a method STDumpLines. > > > > > > Origine of segments is preserved inside the path when multi. > > Could it be added to core ? > > Shall I add a ticket? > > > > Cheers, > > Rémi-C > > > > ///////////////////////////////// > > > > DROP FUNCTION IF EXISTS public.DumpSegments(line geometry ) ; > > CREATE OR REPLACE FUNCTION public.DumpSegments(_line geometry) > > RETURNS SETOF geometry_dump > > AS > > $BODY$ > > --this function breaks a line into minimal segments and return it > > DECLARE > > _r record; > > BEGIN > > > > FOR _r in SELECT ST_Dump(ST_CollectionExtract (_line,2)) AS dp > > LOOP > > RETURN QUERY WITH line AS( > > SELECT --ST_GeomFromText('LINESTRING(12 1, 13 1, 14 2, 15 4)') AS line > > (_r.dp).path AS gpath, (_r.dp).geom AS line > > ), > > dump AS( > > SELECT gpath[1] AS gpath, (ST_DumpPoints(line)) as dp > > FROM line > > ), > > segments AS ( > > SELECT CASE WHEN gpath IS NULL THEN ARRAY[(dp).path[1]-1] ELSE > ARRAY[gpath, > > (dp).path[1]-1] END AS path,ST_MakeLine( lag((dp).geom , 1, NULL) OVER > > (ORDER BY (dp).path),(dp).geom) AS geom > > FROM dump > > ) > > SELECT path,geom > > FROM segments > > WHEre geom IS NOT NULL; > > END LOOP;--loop if multi linestring > > RETURN; > > END; > > $BODY$ > > LANGUAGE plpgsql IMMUTABLE STRICT; > > > > > > SELECT public.DumpSegments(line2) > > FROM ST_GeomFromText('MULTILINESTRING((12 1, 13 1, 14 2, 15 4),(1 1, 2 > 2,3 > > 3))') AS line1,ST_GeomFromText( 'LINESTRING(12 1, 13 1, 14 2, 15 4)') AS > > line2 > > > > > > > > > > ////////////////////////////////////// > > > > > > > > > > 2013/10/30 Rémi Cura <[email protected]> > >> > >> Thanks, > >> wanted to do it the clean way (geos accelerated maybe?), > >> > >> but not so much a big deal, I'll go you way. > >> > >> Cheers, > >> Rémi-C > >> > >> > >> 2013/10/30 Nicolas Ribot <[email protected]> > >>> > >>> Hi, > >>> > >>> I don't think such a function exists in postgis. > >>> (To achieve that, I usually dump line points and create new > >>> linestrings with vertices n, n+1) > >>> > >>> Nicolas > >>> > >>> On 30 October 2013 10:59, Rémi Cura <[email protected]> wrote: > >>> > Hey, > >>> > is somebodyers aware of a function breaking a linestring into a set > of > >>> > segments (mathematical meaning), > >>> > without introducing new points? > >>> > > >>> > Cheers, > >>> > > >>> > > >>> > Rémi-C > >>> > > >>> > _______________________________________________ > >>> > postgis-users mailing list > >>> > [email protected] > >>> > http://lists.osgeo.org/cgi-bin/mailman/listinfo/postgis-users > >>> _______________________________________________ > >>> postgis-users mailing list > >>> [email protected] > >>> http://lists.osgeo.org/cgi-bin/mailman/listinfo/postgis-users > >> > >> > > > > > > _______________________________________________ > > postgis-users mailing list > > [email protected] > > http://lists.osgeo.org/cgi-bin/mailman/listinfo/postgis-users > _______________________________________________ > postgis-users mailing list > [email protected] > http://lists.osgeo.org/cgi-bin/mailman/listinfo/postgis-users >
_______________________________________________ postgis-users mailing list [email protected] http://lists.osgeo.org/cgi-bin/mailman/listinfo/postgis-users
