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.<br><br>Rodrigo<br><br><div><span class="gmail_quote">On 12/11/06, <b class="gmail_sendername">Rodrigo Martín LÓPEZ GREGORIO</b> <<a href="mailto:rodrigomlg@yahoo.com.ar">rodrigomlg@yahoo.com.ar</a>> wrote:
</span><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">Thanks for all your replys.<br><br>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).<br>However this solution works fine for my needs right now (I'm open to any suggestion).
<br><br>Thanks all of you again.<br><br>Rodrigo.<br><br>Here is the code of my function:<br><br>CREATE OR REPLACE FUNCTION nearest_point(linestring1 geometry, linestring2 geometry) RETURNS geometry AS $BODY$<br>DECLARE<br>

    mindistance float8;<br>    i integer;<br>    j integer;<br>    segmentaux1 geometry;<br>    segmentaux2 geometry;<br>    segmentmindist1 geometry;<br>    segmentmindist2 geometry;<br>    point1 geometry;<br>BEGIN<br>
    mindistance := distance(linestring1,linestring2)+1;
<br>    /* I set mindistance to distance between linstrings plus 1 so at least there will be<br>    a case in wich the distance will be minor than this value */<br>    FOR i IN 1 .. NumPoints(linestring1) - 1 LOOP<br>        segmentaux1 :=MakeLine(PointN(linestring1, i), PointN(linestring1, i+1));
<br>        FOR j IN 1 .. NumPoints(linestring2) - 1 LOOP<br>            segmentaux2 :=MakeLine(PointN(linestring2, j), PointN(linestring2, j+1));<br>            IF Distance(segmentaux1,segmentaux2) < mindistance THEN
<br>
                       mindistance := Distance(segmentaux1,segmentaux2);<br>                       segmentmindist1:=segmentaux1;<br>                       segmentmindist2:=segmentaux2;<br>            END IF;<br>        END LOOP;
<br>    END LOOP;<br>    /* After this nested loops I have a pair of segments that are separated by the minimum<br>    distance between linestrings.<br><br>    Now I find the Start/EndPoint of this two segments that minimize the distance*/
<br><br>    IF distance(StartPoint(segmentmindist1), segmentmindist2) = mindistance THEN<br>        point1:=StartPoint(segmentmindist1);<br>    END IF;<br>    IF distance(EndPoint(segmentmindist1), segmentmindist2) = mindistance THEN
<br>        point1:=EndPoint(segmentmindist1);<br>    END IF;<br>    IF distance(StartPoint(segmentmindist2), segmentmindist1) = mindistance THEN<br>        point1:=StartPoint(segmentmindist2);<br>    END IF;<br>    IF distance(EndPoint(segmentmindist2), segmentmindist1) = mindistance THEN
<br>        point1:=EndPoint(segmentmindist2);<br>    END IF;<br><br>    /* Once I find a point I create and return a line that goes from the nearest point of linestring1<br>    to point1 to the nearest point of linestring2 to point1 so I can find then the coordinates of this points
<br>    using the StartPoint/EndPoint function with the x() and y() functions.*/<br><br>     RETURN makeline(line_interpolate_point(segmentmindist1, line_locate_point(segmentmindist1, point1)), line_interpolate_point(segmentmindist2, line_locate_point(segmentmindist2, point1)));
<br>END;<br>$BODY$ LANGUAGE plpgsql IMMUTABLE STRICT;

</blockquote></div><br>