[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