[postgis-users] ST_Split precision issue?

Nicol Hermann postgis at geoworld.de
Sun May 2 04:08:54 PDT 2021


Thanks Martin.
Your query provides the result I was expecting.
What is the difference between closest point along the line and the
ST_Snap I have tried?
ST_Snap was just providing one part.

Thanks again 
Nicol


Am Freitag, den 30.04.2021, 12:45 -0700 schrieb Martin Davis:
> It would probably be helpful if ST_Split was enhanced to have this
> same behaviour (i.e. split at the closest point along the line).
> 
> On Fri, Apr 30, 2021 at 12:27 PM Martin Davis <mtnclimb at gmail.com>
> wrote:
> > For working with points and lines it's probably better to use the
> > linear referencing functions.  Here's a query which does what you
> > require:
> > 
> > WITH line(geom) AS (VALUES
> > ('LINESTRING(8.39567520433486 49.4224277276901,8.39591232763397
> > 49.4198517063953)'::geometry)
> > )
> > SELECT ST_AsText( 
> >   ST_LineSubstring( geom, 0, ST_LineLocatePoint(geom,
> > 'POINT(8.39583178549713 49.4207266868819)'::geometry))
> > ) AS part1,
> > ST_AsText( 
> >   ST_LineSubstring( geom, ST_LineLocatePoint(geom,
> > 'POINT(8.39583178549713 49.4207266868819)'::geometry), 1)
> > ) AS part2
> > FROM line;
> > 
> > 
> > On Sun, Apr 25, 2021 at 7:49 AM Nicol Hermann <postgis at geoworld.de>
> > wrote:
> > > Hello List,
> > > 
> > > I am trying to split a linestring at an intersection to another
> > > line
> > > into it's two segments.
> > > This works as expected with "dummy" coordinates, but fails with
> > > "real-
> > > world" coordinates.
> > > 
> > > This:
> > > 
> > > SELECT ST_AsText( ST_Split (ST_GeomFromText('LINESTRING(0 0,2
> > > 2)'),
> > > ST_GeomFromText('POINT(1 1)') ) ) as lsegments;
> > > 
> > > gives me the expected output:
> > > 
> > >                           lsegments                          
> > > -------------------------------------------------------------
> > >  GEOMETRYCOLLECTION(LINESTRING(0 0,1 1),LINESTRING(1 1,2 2))
> > > (1 Zeile)
> > > 
> > > 
> > > When I am trying this with real world coordinates I am always
> > > getting
> > > the un-splitted original linesting back.
> > > Sample:
> > > 
> > > SELECT ST_AsText(ST_intersection(aline, bline)) AS
> > > wktcut                                                           
> > >      
> > > 
> > > FROM (SELECT
> > >     ST_GeomFromText('LINESTRING(8.39567520433486
> > > 49.4224277276901,8.39591232763397 49.4198517063953)') As aline,
> > >     ST_GeomFromText('LINESTRING(8.39481293779266
> > > 49.4206708596104,8.39717339245195 49.4208001995917)') As bline )
> > > As
> > > foo;
> > > 
> > > returns
> > > POINT(8.39583178549713 49.4207266868819)
> > > 
> > > If I am using this in the split command
> > > 
> > > SELECT ST_AsText( ST_Split
> > > (ST_GeomFromText('LINESTRING(8.39567520433486
> > > 49.4224277276901,8.39591232763397 49.4198517063953)'),
> > > ST_GeomFromText('POINT(8.39583178549713 49.4207266868819)') ) )
> > > as
> > > lsegments;
> > > 
> > > the result is 
> > > lsegments                                              
> > > ---------------------------------------------------------------
> > > -------
> > >  GEOMETRYCOLLECTION(LINESTRING(8.39567520433486
> > > 49.4224277276901,8.39591232763397 49.4198517063953))
> > > (1 Zeile)
> > > 
> > > which es equal to the input.
> > > 
> > > Is this a precision issue between differen postgis functions and
> > > how
> > > can I solve this?
> > > 
> > > If I'am adding ST_Snap it returns a linestring which only
> > > represents
> > > one of the 2 segments I would expect.
> > > 
> > > See:
> > > 
> > > SELECT 
> > >  ST_AsText( 
> > >   ST_Split ( 
> > >    ST_Snap ( 
> > >      ST_GeomFromText('LINESTRING(8.39567520433486
> > > 49.4224277276901,8.39591232763397 49.4198517063953)'),
> > > ST_GeomFromText('POINT(8.39583178549713 49.4207266868819)'), 1
> > > ), 
> > >   ST_GeomFromText('POINT(8.39583178549713 49.4207266868819)') )
> > > );
> > > ) ) 
> > > as lsegments;
> > > 
> > > response is:
> > > 
> > > lsegemts                                               
> > > ---------------------------------------------------------------
> > > -------
> > >  GEOMETRYCOLLECTION(LINESTRING(8.39567520433486
> > > 49.4224277276901,8.39583178549713 49.4207266868819))
> > > 
> > > 
> > > Any hints, or do I have a misconception how ST_Split should work?
> > > 
> > > Thanks
> > > Nicol
> > > 
> > > _______________________________________________
> > > postgis-users mailing list
> > > postgis-users at lists.osgeo.org
> > > https://lists.osgeo.org/mailman/listinfo/postgis-users
> 
> _______________________________________________
> postgis-users mailing list
> postgis-users at lists.osgeo.org
> https://lists.osgeo.org/mailman/listinfo/postgis-users



More information about the postgis-users mailing list