<div>Hi Leticia,</div>
<div> </div>
<div>I create the following function for your problem, please test it carefully, I only made two test (at the end):</div>
<div> </div>
<div>CREATE OR REPLACE FUNCTION ExtendLine(eje_ geometry, bound_ geometry) RETURNS geometry AS $$<br>-- version: alfa , by Julio A. Galindo, April 17, 2007: <a href="mailto:juliogalindoq@gmail.com">juliogalindoq@gmail.com
</a><br> DECLARE<br>     b_ geometry = boundary(bound_);<br>     dist float;<br>     max_dist float = 0;<br>     n_points int;<br>     pto_1 geometry;<br>     pto_2 geometry;<br>     first_pto geometry;<br>     last_pto geometry;
<br>     u_1 float;<br>     u_2 float;<br>     norm float;<br>     result text = 'LINESTRING(';<br> BEGIN<br>     IF GeometryType(eje_) NOT LIKE 'LINESTRING'<br>  OR GeometryType(bound_) NOT LIKE 'POLYGON' THEN RETURN NULL; END IF;
<br>     -- First Search how far is the boundary: (worst case)<br>     pto_1 := StartPoint(eje_);<br>     pto_2 := EndPoint(eje_);<br>     FOR i IN 0..NumPoints(b_)-1 LOOP<br>  dist := distance(PointN(b_,i),pto_1);<br>  IF dist > max_dist THEN max_dist := dist; END IF;
<br>  dist := distance(PointN(b_,i),pto_2);<br>  IF dist > max_dist THEN max_dist := dist; END IF;<br>     END LOOP;<br>     -- Now extent the linestring:<br>     pto_2 := PointN(eje_,2);<br>     u_1 := X(pto_2)-X(pto_1);
<br>     u_2 := Y(pto_2)-Y(pto_1);<br>     norm := sqrt(u_1^2 + u_2^2);<br>     first_pto := MakePoint(X(pto_1)-u_1/norm*dist,Y(pto_1)-u_2/norm*dist);<br>     n_points := nPoints(eje_);<br>     IF n_points > 2 THEN<br>
  pto_1 := PointN(eje_,n_points-1);<br>  pto_2 := PointN(eje_,n_points);<br>  u_1 := X(pto_2)-X(pto_1);<br>  u_2 := Y(pto_2)-Y(pto_1);<br>  norm := sqrt(u_1^2 + u_2^2);<br>     END IF;<br>     last_pto := MakePoint(X(pto_2)+u_1/norm*dist,Y(pto_2)+u_2/norm*dist);
<br>     result := result || X(first_pto) || ' ' || Y(first_pto) || ',';<br>     FOR i IN 1..NumPoints(eje_) LOOP<br>  result := result || X(PointN(eje_,i)) || ' ' || Y(PointN(eje_,i)) || ',';
<br>     END LOOP;<br>     result := result || X(last_pto) || ' ' || Y(last_pto) || ')';<br>     -- Find the final Linestring:<br>     b_ := intersection(GeomFromText(result,SRID(eje_)),bound_);<br>     RETURN b_;
<br> END $$<br> LANGUAGE plpgsql<br> STABLE<br> RETURNS NULL ON NULL INPUT;<br> </div>
<div> </div>
<div>Test 1:</div>
<div> </div>
<div>select asText(extendLine(geomFromText('LINESTRING(5 5, 12 12)',-1),GeomFromText('POLYGON((0 0,15 0,15 20,0 20,0 0))',-1)));</div>
<div> </div>
<div>             astext              <br>---------------------------------<br> LINESTRING(0 0,5 5,12 12,15 15)<br> </div>
<div>The solution is good, because the line is at 45 degress </div>
<div> </div>
<div>And the same function can work with a general linestring (many points):</div>
<div> </div>
<div>select asText(extendLine(geomFromText('LINESTRING(5 5, 12 12, 13 12)',-1),GeomFromText('POLYGON((0 0,15 0,15 20,0 20,0 0))',-1)));<br>                astext                 <br>---------------------------------------
<br> LINESTRING(0 0,5 5,12 12,13 12,15 12)</div>
<div> </div>
<div>Let me know if you improve this simple function.</div>
<div> </div>
<div>Regards,</div>
<div> </div>
<div>Julio A. Galindo Q.</div>
<div>Topogen Ltda.</div>
<div>La Paz, Bolivia<br><br> </div>
<div><span class="gmail_quote">On 4/16/07, <b class="gmail_sendername">Leticia</b> <<a href="mailto:lgomez@itba.edu.ar">lgomez@itba.edu.ar</a>> wrote:</span>
<blockquote class="gmail_quote" style="PADDING-LEFT: 1ex; MARGIN: 0px 0px 0px 0.8ex; BORDER-LEFT: #ccc 1px solid">
<div lang="EN-US" vlink="purple" link="blue">
<div>
<p><font face="Courier New" size="2"><span style="FONT-SIZE: 10pt"> </span></font></p>
<p><font face="Courier New" size="2"><span style="FONT-SIZE: 10pt">Hi community,</span></font></p>
<p><font face="Courier New" size="2"><span style="FONT-SIZE: 10pt"> </span></font></p>
<p style="TEXT-INDENT: 0.5in"><font face="Courier New" size="2"><span style="FONT-SIZE: 10pt">I need to "extend" a linestring in another one. The new linestring must be obtained such as their new extremes are the intersection of it with a polygon that contains it. The original linestring is composed of only a linear segment.
</span></font></p>
<p style="TEXT-INDENT: 0.5in"><font face="Courier New" size="2"><span style="FONT-SIZE: 10pt"> </span></font></p>
<p style="TEXT-INDENT: 0.5in"><font face="Courier New" size="2"><span style="FONT-SIZE: 10pt">Is there a simple method to do this?</span></font></p>
<p style="TEXT-INDENT: 0.5in"><font face="Courier New" size="2"><span style="FONT-SIZE: 10pt"> </span></font></p>
<p style="TEXT-INDENT: 0.5in"><font face="Courier New" size="2"><span style="FONT-SIZE: 10pt"> </span></font></p>
<p style="TEXT-INDENT: 0.5in"><font face="Courier New" size="2"><span style="FONT-SIZE: 10pt">-------------</span></font></p>
<p style="TEXT-INDENT: 0.5in"><font face="Courier New" size="2"><span style="FONT-SIZE: 10pt">|           |</span></font></p>
<p><font face="Courier New" size="2"><span style="FONT-SIZE: 10pt">      |     |    |</span></font></p>
<p><font face="Courier New" size="2"><span style="FONT-SIZE: 10pt">      |     |    |</span></font></p>
<p><font face="Courier New" size="2"><span style="FONT-SIZE: 10pt">      |           |</span></font></p>
<p style="TEXT-INDENT: 0.5in"><font face="Courier New" size="2"><span style="FONT-SIZE: 10pt">-------------</span></font></p>
<p><font face="Courier New" size="2"><span style="FONT-SIZE: 10pt"> </span></font></p>
<p><font face="Courier New" size="2"><span style="FONT-SIZE: 10pt"> </span></font></p>
<p><font face="Courier New" size="2"><span style="FONT-SIZE: 10pt">I need the other one:</span></font></p>
<p><font face="Courier New" size="2"><span style="FONT-SIZE: 10pt"> </span></font></p>
<p><font face="Courier New" size="2"><span style="FONT-SIZE: 10pt"> </span></font></p>
<p style="TEXT-INDENT: 0.5in"><font face="Courier New" size="2"><span style="FONT-SIZE: 10pt">-------|-----</span></font></p>
<p style="TEXT-INDENT: 0.5in"><font face="Courier New" size="2"><span style="FONT-SIZE: 10pt">|     |    |</span></font></p>
<p><font face="Courier New" size="2"><span style="FONT-SIZE: 10pt">      |     |    |</span></font></p>
<p><font face="Courier New" size="2"><span style="FONT-SIZE: 10pt">      |     |    |</span></font></p>
<p><font face="Courier New" size="2"><span style="FONT-SIZE: 10pt">      |     |    |</span></font></p>
<p style="TEXT-INDENT: 0.5in"><font face="Courier New" size="2"><span style="FONT-SIZE: 10pt">-------|-----</span></font></p>
<p><font face="Courier New" size="2"><span style="FONT-SIZE: 10pt"> </span></font></p>
<p><font face="Courier New" size="2"><span style="FONT-SIZE: 10pt">The original linestring is not always vertical u horizontal.</span></font></p>
<p><font face="Courier New" size="2"><span style="FONT-SIZE: 10pt"> </span></font></p>
<p><font face="Courier New" size="2"><span style="FONT-SIZE: 10pt"> </span></font></p>
<p><font face="Courier New" size="2"><span style="FONT-SIZE: 10pt">Thanks in advance,</span></font></p>
<p><font face="Courier New" size="2"><span style="FONT-SIZE: 10pt">Leticia</span></font></p>
<p><font face="Courier New" size="2"><span style="FONT-SIZE: 10pt"> </span></font></p>
<p><font face="Courier New" size="2"><span style="FONT-SIZE: 10pt"> </span></font></p>
<p><font face="Arial" size="2"><span style="FONT-SIZE: 10pt; FONT-FAMILY: Arial"> </span></font></p></div></div><br>_______________________________________________<br>postgis-users mailing list<br><a onclick="return top.js.OpenExtLink(window,event,this)" href="mailto:postgis-users@postgis.refractions.net">
postgis-users@postgis.refractions.net</a><br><a onclick="return top.js.OpenExtLink(window,event,this)" href="http://postgis.refractions.net/mailman/listinfo/postgis-users" target="_blank">http://postgis.refractions.net/mailman/listinfo/postgis-users
</a><br><br></blockquote></div><br>