[postgis-users] why doesn't linemerge() work?

Nicolas Ribot nicolas.ribot at gmail.com
Fri Oct 19 01:45:08 PDT 2012


Hi Andrew,

This (long) thread may give you some hints on how to order and then
merge lines together:
"Closing polylines", 11 May 2012.

Nicolas

On 19 October 2012 00:27, Andrew Ukrainec <aukrainec at accipiterradar.com> wrote:
> I've been trying to append a new LINESTRING to an existing
> LINESTRING in a table, and this seems to be an impossible
> task.  I've searched the net for solutions, and tried all
> possible obvious approaches:
>
> ST_LineMerge(ST_Collect(geom1,geom2))
> ST_LineMerge(ST_Union(geom1,geom2))
> ...
>
> I wrote a function to use the aggregate version of the call
>
> ST_LineMerge(ST_Collect(geom))
>
> I keep getting a MULTILINESTRING() at the output rather
> than a single LINESTRING().
>
> If I run this example adapted from an example on
> the OSGeo site:
>
> SELECT ST_AsText(ST_LineMerge(ST_Collect(the_geom)))
>   FROM (SELECT 'LINESTRING(0 0, 0 1)'::geometry the_geom
>   UNION ALL
>   SELECT 'LINESTRING(1 0, 1 1)'::geometry the_geom
>   UNION ALL
>   SELECT 'LINESTRING(0 0, 1 0)'::geometry the_geom
>   UNION ALL
>   SELECT 'LINESTRING(1 1, 0 1)'::geometry the_geom) as a;
>
> I get a single LINESTRING that I hoped for,
>
>   LINESTRING(0 0, 1 0, 1 1, 0 1, 0 0)
>
> but the answer is completely counter intuitive to me.
> I expected the individual LINESTRINGs to be simply appended
> in order.  If I adjust the data in the first LINESTRING so
> that '0 1' point is now '1 0':
>
> SELECT ST_AsText(ST_LineMerge(ST_Collect(the_geom)))
>   FROM (SELECT 'LINESTRING(0 0, 1 0)'::geometry the_geom
>   UNION ALL
>   SELECT 'LINESTRING(1 0, 1 1)'::geometry the_geom
>   UNION ALL
>   SELECT 'LINESTRING(0 0,1 0)'::geometry the_geom
>   UNION ALL
>   SELECT 'LINESTRING(1 1, 0 1)'::geometry the_geom) as a;
>
> then again the operation fails and I get MULTILINESTRING()
> at the output.
>
>   MULTILINESTRING((1 0,1 1,0 1),(1 0,0 0,1 0))
>
> The PostGIS documentation only contains the mysterious
> statement in the Example section:
>
> "--If can't be merged - original MULTILINESTRING is returned"
>
> I can accept that LINEMERGE() does not work the way I imagined
> it would, but then there is no explanation of how it does work
> in the documentation.  In the case that one wants to glue
> two LINESTRING() together into a single LINESTRING() preserving
> the order of the points, can anyone suggest how this can
> be done efficiently?
>
> Thanks in advance.
>
> _______________________________________________
> postgis-users mailing list
> postgis-users at postgis.refractions.net
> http://postgis.refractions.net/mailman/listinfo/postgis-users



More information about the postgis-users mailing list