[postgis-users] st_split

franco base frenk.calza at gmail.com
Tue Oct 29 04:43:35 PDT 2013


Thanks Remi
You are very clear now.

Meanwhile I make some test and I think there is a bug somewhere.
I use the ST_ClosestPoint example documenation



SELECT   ST_AsText(ST_ClosestPoint(pt,line)) AS cp_pt_line,
                 ST_AsText(ST_ClosestPoint(line,pt)) As cp_line_pt,
                 ST_Contains(line, ST_ClosestPoint(line,pt)), --- f
                 ST_Intersects (line, ST_ClosestPoint(line,pt)), --- f
                 ST_Distance (line, ST_ClosestPoint(line,pt)), ---- 0
                 ST_Line_Locate_Point (line, ST_ClosestPoint(line,pt)) ---
return value

FROM
(SELECT 'POINT(100 100)'::geometry As pt,
                 'LINESTRING (20 80, 98 190, 110 180, 50 75 )'::geometry As
line ) As foo


give this output:

"cp_pt_line";"cp_line_pt";"st_contains";"st_intersects";"st_distance";"st_line_locate_point"
"POINT(100 100)";"POINT(73.0769230769231
115.384615384615)";f;f;0;0.828619715102687


Something is wrong






2013/10/29 Rémi Cura <remi.cura at gmail.com>

> Hey sorry for being unclear.
>
> I put you a pseudo code and some explanation :
>
>    - first you work with real world data (observation, measure), which
>    are of a given precision (showing the uncertainty of the measure).
>    If your data are real world observation ,they may be precise up to the
>    centimeter, the meter , whatever. So there is no significance of keeping
>    XXX digits after the comma.
>    - Second about translating : for your computer manipulating a number
>    like 650254,2354 is not the same as manipulating a number like 254,2354.
>    Numbers are represented with double precision, which can be precise up
>    to* 15 digits *thanks to postgres. Keeping the number of digits low in
>    your coordinates "free" some precision for computing. You can translate by
>    any number as long as it reduce the number of digits in the coordinates.
>    You can also manually translate like : x := x - 859 ; y:= y - 87426.
>    - Third : about ST_ClosestPoint : if you point are a result of a
>    previous computing, they are already of limited precision, thus you have to
>    compensate this by manually putting the points onto the lines (using
>    ST_ClosestPoint will give you a new point corresponding to old point
>    projected onto line).
>
>
>
> Here is the pseudo code
>
> --if your data are of limited precision (always the case ! )
> snap to grid (your data precision)
>
> --before computation
> translate everyting (-(min_x+max_x)/2, -(min_y+max_y)/2)
>
> --computation : do your spatial test
>
> --if  precision issue not solved, use ST_ClosestPoint to project your
> point onto lines
>
> --after computation
> translate everyting (+(min_x+max_x)/2, +(min_y+max_y)/2)
>
> Cheers,
>
> Rémi-C
>
>
> 2013/10/29 franco base <frenk.calza at gmail.com>
>
>> Ayway
>> St_split and St_snap don't work
>>
>> SELECT line,
>> point,
>> st_contains (st_snap (geom_line, geom_point,0.001), geom_point),
>> st_geometrytype ((st_dump(ST_split(st_snap (geom_line, geom_point,0.001),
>> geom_point))).geom),
>> (st_dump(ST_split(st_snap (geom_line, geom_point,0.001),
>> geom_point))).geom as splitted_geometry
>>
>> give
>>
>> "id";"line";"point";"st_contains";"st_geometrytype";"splitted_geometry"
>>
>> 1;7646;11764;t;"ST_LineString";"0102000020BB0B000006000000A4703D0A471F37412D211F04AF335341FAEDEBE0491F3741325530C2AE335341BD5296014F1F37418FC2F578AE3353414694F606521F3741D2DEE07BAE3353412D211F74541F37418FC2F578AE3353415713362F611F37410D996234AF335341"
>>
>> 2;7646;11764;t;"ST_LineString";"0102000020BB0B0000020000005713362F611F37410D996234AF33534123B9FC675020374112143FF6BC335341"
>>
>> 3;7646;11769;t;"ST_LineString";"0102000020BB0B000006000000A4703D0A471F37412D211F04AF335341FAEDEBE0491F3741325530C2AE335341BD5296014F1F37418FC2F578AE3353414694F606521F3741D2DEE07BAE3353412D211F74541F37418FC2F578AE3353415EF0DD584620374139BF2762BC335341"
>>
>> 4;7646;11769;t;"ST_LineString";"0102000020BB0B0000020000005EF0DD584620374139BF2762BC33534123B9FC675020374112143FF6BC335341"
>>
>> 5;7646;11762;t;"ST_LineString";"0102000020BB0B000006000000A4703D0A471F37412D211F04AF335341FAEDEBE0491F3741325530C2AE335341BD5296014F1F37418FC2F578AE3353414694F606521F3741D2DEE07BAE3353412D211F74541F37418FC2F578AE335341A5CBC785841F374156A2A33CB1335341"
>>
>> 6;7646;11762;t;"ST_LineString";"0102000020BB0B000002000000A5CBC785841F374156A2A33CB133534123B9FC675020374112143FF6BC335341"
>>
>> St_geometrytype=ST_LineString but in qgis I have point and line.
>>
>> point splitted geometry (id =2,4,6) = geom_point (starting gometry)
>> line splitted geometry  (id =1,3,5)  = geom_line (starting gometry)
>>
>>
>> 2013/10/29 franco base <frenk.calza at gmail.com>
>>
>>> Hi.
>>> Yes the cause can be that every function has his own "tolerance"
>>>
>>> SELECT line,geom_line,point,geom_point,
>>> ST_ClosestPoint(geom_line,geom_point), ----- return geometry=geom_point
>>> ST_distance (geom_line,geom_point), ---- return 0
>>> ST_contains(geom_line,geom_point) ---- return false
>>>
>>>
>>> "line";"geom_line";"point";"geom_point";"st_closestpoint";"st_distance";"st_contains"
>>>
>>> 7646;"0102000020BB0B000006000000A4703D0A471F37412D211F04AF335341FAEDEBE0491F3741325530C2AE335341BD5296014F1F37418FC2F578AE3353414694F606521F3741D2DEE07BAE3353412D211F74541F37418FC2F578AE33534123B9FC675020374112143FF6BC335341";11764;"0101000020BB0B00005713362F611F37410D996234AF335341";"0101000020BB0B00005713362F611F37410D996234AF335341";0;f
>>>
>>> 7646;"0102000020BB0B000006000000A4703D0A471F37412D211F04AF335341FAEDEBE0491F3741325530C2AE335341BD5296014F1F37418FC2F578AE3353414694F606521F3741D2DEE07BAE3353412D211F74541F37418FC2F578AE33534123B9FC675020374112143FF6BC335341";11769;"0101000020BB0B00005EF0DD584620374139BF2762BC335341";"0101000020BB0B00005EF0DD584620374139BF2762BC335341";0;f
>>>
>>> 7646;"0102000020BB0B000006000000A4703D0A471F37412D211F04AF335341FAEDEBE0491F3741325530C2AE335341BD5296014F1F37418FC2F578AE3353414694F606521F3741D2DEE07BAE3353412D211F74541F37418FC2F578AE33534123B9FC675020374112143FF6BC335341";11762;"0101000020BB0B0000A5CBC785841F374156A2A33CB1335341";"0101000020BB0B0000A5CBC785841F374156A2A33CB1335341";0;f
>>>
>>> Remi I don't undesrtand very well your tip to translate date and use
>>> St_SnapToGrid
>>>
>>> I cannot snap (using St_Snap) line to point because I'm working on a
>>> road network and I cannot move the line versus point.
>>>
>>>
>>> Thanks
>>> fb
>>>
>>>
>>> 2013/10/28 Rémi Cura <remi.cura at gmail.com>
>>>
>>>> I had the same problem,
>>>> all function don't react the same way when hitting precision limit.
>>>>
>>>> You may want to translate your data to reduce digits, and/or use
>>>> ST_SnapToGrid on everything before using ST_ClosestPoint.
>>>>
>>>> Cheers,
>>>> Rémi-C
>>>>
>>>>
>>>> 2013/10/28 Nicolas Ribot <nicolas.ribot at gmail.com>
>>>>
>>>>> Hmm this is strange:
>>>>>
>>>>> Finding the closest point (st_closestPoint) or using
>>>>> st_lineLocatePoint to project point onto the line does not work either
>>>>> on the provided dataset.
>>>>> Though the st_distance(line, point) returns 0.
>>>>>
>>>>> Nicolas
>>>>>
>>>>>
>>>>>
>>>>> On 28 October 2013 18:42, Rémi Cura <remi.cura at gmail.com> wrote:
>>>>> > You may want to split not with point but with the projected point
>>>>> one line
>>>>> > (use http://postgis.refractions.net/docs/ST_ClosestPoint.html)
>>>>> > If it is not enough, you may want to translate all your geometries
>>>>> to reduce
>>>>> > the number of digits in coordinates.
>>>>> > Another possibility is to use ST_Snap to snap line to point (won't
>>>>> work the
>>>>> > other way)
>>>>> >
>>>>> > Cheers,
>>>>> > Rémi-C
>>>>> >
>>>>> >
>>>>> > 2013/10/28 Nicolas Ribot <nicolas.ribot at gmail.com>
>>>>> >>
>>>>> >> Hi,
>>>>> >>
>>>>> >> The points are not on the line, probably due to rounding errors.
>>>>> >>
>>>>> >> st_contains(line, point) returns false.
>>>>> >>
>>>>> >> Nicolas
>>>>> >>
>>>>> >> On 28 October 2013 18:07, franco base <frenk.calza at gmail.com>
>>>>> wrote:
>>>>> >> > Hi.
>>>>> >> > I have a set of linestring and point on linestring.
>>>>> >> > I want cut the linestring on the point.
>>>>> >> > I can have n points for one linestring,
>>>>> >> > so I use ST_Split
>>>>> >> > (insted of ST_Line_Interpolate_Point and ST_Line_Substring)
>>>>> >> > but it doesn't work.
>>>>> >> >
>>>>> >> > line;geom_line;point;geom_point
>>>>> >> >
>>>>> >> >
>>>>> 7646;"0102000020BB0B000006000000A4703D0A471F37412D211F04AF335341FAEDEBE0491F3741325530C2AE335341BD5296014F1F37418FC2F578AE3353414694F606521F3741D2DEE07BAE3353412D211F74541F37418FC2F578AE33534123B9FC675020374112143FF6BC335341";11764;"0101000020BB0B00005713362F611F37410D996234AF335341"
>>>>> >> >
>>>>> >> >
>>>>> 7646;"0102000020BB0B000006000000A4703D0A471F37412D211F04AF335341FAEDEBE0491F3741325530C2AE335341BD5296014F1F37418FC2F578AE3353414694F606521F3741D2DEE07BAE3353412D211F74541F37418FC2F578AE33534123B9FC675020374112143FF6BC335341";11769;"0101000020BB0B00005EF0DD584620374139BF2762BC335341"
>>>>> >> >
>>>>> >> >
>>>>> 7646;"0102000020BB0B000006000000A4703D0A471F37412D211F04AF335341FAEDEBE0491F3741325530C2AE335341BD5296014F1F37418FC2F578AE3353414694F606521F3741D2DEE07BAE3353412D211F74541F37418FC2F578AE33534123B9FC675020374112143FF6BC335341";11762;"0101000020BB0B0000A5CBC785841F374156A2A33CB1335341"
>>>>> >> >
>>>>> >> > ST_GeometryType(St_Split(geom_line, geom_point))
>>>>> >> > give "ST_GeometryCollection"
>>>>> >> >
>>>>> >> > but
>>>>> >> >
>>>>> >> > (ST_Dump(ST_Split(geom_line, geom_point))).geom
>>>>> >> >
>>>>> >> > return only 3 linestring (one for record) and the geometry is
>>>>> egual to
>>>>> >> > geom_line
>>>>> >> >
>>>>> >> >
>>>>> >> > thanks.
>>>>> >> >
>>>>> >> > fb
>>>>> >> >
>>>>> >> > _______________________________________________
>>>>> >> > postgis-users mailing list
>>>>> >> > postgis-users at lists.osgeo.org
>>>>> >> > http://lists.osgeo.org/cgi-bin/mailman/listinfo/postgis-users
>>>>> >> _______________________________________________
>>>>> >> postgis-users mailing list
>>>>> >> postgis-users at lists.osgeo.org
>>>>> >> http://lists.osgeo.org/cgi-bin/mailman/listinfo/postgis-users
>>>>> >
>>>>> >
>>>>> >
>>>>> > _______________________________________________
>>>>> > postgis-users mailing list
>>>>> > postgis-users at lists.osgeo.org
>>>>> > http://lists.osgeo.org/cgi-bin/mailman/listinfo/postgis-users
>>>>> _______________________________________________
>>>>> postgis-users mailing list
>>>>> postgis-users at lists.osgeo.org
>>>>> http://lists.osgeo.org/cgi-bin/mailman/listinfo/postgis-users
>>>>>
>>>>
>>>>
>>>> _______________________________________________
>>>> postgis-users mailing list
>>>> postgis-users at lists.osgeo.org
>>>> http://lists.osgeo.org/cgi-bin/mailman/listinfo/postgis-users
>>>>
>>>
>>>
>>
>> _______________________________________________
>> postgis-users mailing list
>> postgis-users at lists.osgeo.org
>> http://lists.osgeo.org/cgi-bin/mailman/listinfo/postgis-users
>>
>
>
> _______________________________________________
> postgis-users mailing list
> postgis-users at lists.osgeo.org
> http://lists.osgeo.org/cgi-bin/mailman/listinfo/postgis-users
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osgeo.org/pipermail/postgis-users/attachments/20131029/2e2c2b5a/attachment.html>


More information about the postgis-users mailing list