[postgis-users] Re: Obtaining nearest points between two linestrings

Rodrigo Martín LÓPEZ GREGORIO rodrigomlg at yahoo.com.ar
Mon Dec 11 08:24:21 PST 2006


I have found some problems when the nearest segments of both linestrings
crosses one each other. The function doesn't work in that cases so I will
make some modifications and then post the new version of the function.

Rodrigo

On 12/11/06, Rodrigo Martín LÓPEZ GREGORIO <rodrigomlg at yahoo.com.ar> wrote:
>
> Thanks for all your replys.
>
> I finally make this work. Using your suggestions, I create my own function
> that works fine. The function will return a line pointing from linestring1
> to linestring2 at minimum distance points. Maybe there will be some
> improvements to my function, like considering different posibles situations
> ( e.g. parallel linestrings segments, etc.) and giving more suitable
> result (i.e. taking into consideration all the points at the minimum
> distance and not just one).
> However this solution works fine for my needs right now (I'm open to any
> suggestion).
>
> Thanks all of you again.
>
> Rodrigo.
>
> Here is the code of my function:
>
> CREATE OR REPLACE FUNCTION nearest_point(linestring1 geometry, linestring2
> geometry) RETURNS geometry AS $BODY$
> DECLARE
>     mindistance float8;
>     i integer;
>     j integer;
>     segmentaux1 geometry;
>     segmentaux2 geometry;
>     segmentmindist1 geometry;
>     segmentmindist2 geometry;
>     point1 geometry;
> BEGIN
>     mindistance := distance(linestring1,linestring2)+1;
>     /* I set mindistance to distance between linstrings plus 1 so at least
> there will be
>     a case in wich the distance will be minor than this value */
>     FOR i IN 1 .. NumPoints(linestring1) - 1 LOOP
>         segmentaux1 :=MakeLine(PointN(linestring1, i), PointN(linestring1,
> i+1));
>         FOR j IN 1 .. NumPoints(linestring2) - 1 LOOP
>             segmentaux2 :=MakeLine(PointN(linestring2, j),
> PointN(linestring2, j+1));
>             IF Distance(segmentaux1,segmentaux2) < mindistance THEN
>                        mindistance := Distance(segmentaux1,segmentaux2);
>                        segmentmindist1:=segmentaux1;
>                        segmentmindist2:=segmentaux2;
>             END IF;
>         END LOOP;
>     END LOOP;
>     /* After this nested loops I have a pair of segments that are
> separated by the minimum
>     distance between linestrings.
>
>     Now I find the Start/EndPoint of this two segments that minimize the
> distance*/
>
>     IF distance(StartPoint(segmentmindist1), segmentmindist2) =
> mindistance THEN
>         point1:=StartPoint(segmentmindist1);
>     END IF;
>     IF distance(EndPoint(segmentmindist1), segmentmindist2) = mindistance
> THEN
>         point1:=EndPoint(segmentmindist1);
>     END IF;
>     IF distance(StartPoint(segmentmindist2), segmentmindist1) =
> mindistance THEN
>         point1:=StartPoint(segmentmindist2);
>     END IF;
>     IF distance(EndPoint(segmentmindist2), segmentmindist1) = mindistance
> THEN
>         point1:=EndPoint(segmentmindist2);
>     END IF;
>
>     /* Once I find a point I create and return a line that goes from the
> nearest point of linestring1
>     to point1 to the nearest point of linestring2 to point1 so I can find
> then the coordinates of this points
>     using the StartPoint/EndPoint function with the x() and y()
> functions.*/
>
>      RETURN makeline(line_interpolate_point(segmentmindist1,
> line_locate_point(segmentmindist1, point1)),
> line_interpolate_point(segmentmindist2, line_locate_point(segmentmindist2,
> point1)));
> END;
> $BODY$ LANGUAGE plpgsql IMMUTABLE STRICT;
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osgeo.org/pipermail/postgis-users/attachments/20061211/44feb0c2/attachment.html>


More information about the postgis-users mailing list