<font size=2 face="sans-serif">Thanks for the code Simon. After a few
tweaks I got it working perfectly in PostGIS2.</font><br><br><font size=2 face="sans-serif">Here's the updated code.</font><br><br><font size=2 face="sans-serif">Adrian</font><br><br><font size=2 face="sans-serif">CREATE OR REPLACE FUNCTION ST_Extend(eje_
geometry, bound_ geometry)</font><br><font size=2 face="sans-serif">RETURNS geometry</font><br><font size=2 face="sans-serif">AS $$</font><br><font size=2 face="sans-serif">-- Use Case: I need to "extend"
a linestring in another one. The new linestring must be</font><br><font size=2 face="sans-serif">-- obtained such as their new extremes
are the intersection of it with a</font><br><font size=2 face="sans-serif">-- polygon that contains it. The original
linestring is composed of only a</font><br><font size=2 face="sans-serif">-- linear segment.</font><br><font size=2 face="sans-serif">-- version: alfa , by Julio A. Galindo,
April 17, 2007: juliogalindoq at gmail.com</font><br><font size=2 face="sans-serif">DECLARE</font><br><font size=2 face="sans-serif">      b_ geometry = st_boundary(bound_);</font><br><font size=2 face="sans-serif">      dist float;</font><br><font size=2 face="sans-serif">      max_dist float
= 0;</font><br><font size=2 face="sans-serif">      n_points int;</font><br><font size=2 face="sans-serif">      pto_1 geometry;</font><br><font size=2 face="sans-serif">      pto_2 geometry;</font><br><font size=2 face="sans-serif">      first_pto geometry;</font><br><font size=2 face="sans-serif">      last_pto geometry;</font><br><font size=2 face="sans-serif">      u_1 float;</font><br><font size=2 face="sans-serif">      u_2 float;</font><br><font size=2 face="sans-serif">      norm float;</font><br><font size=2 face="sans-serif">      result text = 'LINESTRING(';</font><br><font size=2 face="sans-serif">BEGIN</font><br><font size=2 face="sans-serif">      IF  st_GeometryType(eje_)
  NOT LIKE 'ST_LineString' OR</font><br><font size=2 face="sans-serif">           st_GeometryType(bound_)
NOT LIKE 'ST_Polygon' THEN</font><br><font size=2 face="sans-serif">         RETURN
NULL;</font><br><font size=2 face="sans-serif">      END IF;</font><br><font size=2 face="sans-serif">      -- First Search
how far is the boundary: (worst case)</font><br><font size=2 face="sans-serif">      pto_1 := st_StartPoint(eje_);</font><br><font size=2 face="sans-serif">      pto_2 := st_EndPoint(eje_);</font><br><font size=2 face="sans-serif">      FOR i IN 1..st_NumPoints(b_)-1
LOOP</font><br><font size=2 face="sans-serif">         dist
:= st_distance(st_PointN(b_,i),pto_1);</font><br><font size=2 face="sans-serif">         IF
dist > max_dist THEN max_dist := dist; --END IF;</font><br><font size=2 face="sans-serif">           
max_dist := dist;</font><br><font size=2 face="sans-serif">         END
IF;</font><br><font size=2 face="sans-serif">         dist
:= st_distance(st_PointN(b_,i),pto_2);</font><br><font size=2 face="sans-serif">         IF
dist > max_dist THEN max_dist := dist; --END IF;</font><br><font size=2 face="sans-serif">           
max_dist := dist;</font><br><font size=2 face="sans-serif">         END
IF;</font><br><font size=2 face="sans-serif">      END LOOP;</font><br><font size=2 face="sans-serif">      -- Now extent the
linestring:</font><br><font size=2 face="sans-serif">      pto_2 := st_PointN(eje_,2);</font><br><font size=2 face="sans-serif">      u_1 := st_X(pto_2)-st_X(pto_1);</font><br><font size=2 face="sans-serif">      u_2 := st_Y(pto_2)-st_Y(pto_1);</font><br><font size=2 face="sans-serif">      norm := sqrt(u_1^2
+ u_2^2);</font><br><font size=2 face="sans-serif">      first_pto := st_MakePoint(st_X(pto_1)-u_1/norm*dist,st_Y(pto_1)-u_2/norm*dist);</font><br><font size=2 face="sans-serif">      n_points := st_nPoints(eje_);</font><br><font size=2 face="sans-serif">      IF n_points >
2 THEN</font><br><font size=2 face="sans-serif">         pto_1
:= st_PointN(eje_,n_points-1);</font><br><font size=2 face="sans-serif">         pto_2
:= st_PointN(eje_,n_points);</font><br><font size=2 face="sans-serif">         u_1
  := st_X(pto_2)-st_X(pto_1);</font><br><font size=2 face="sans-serif">         u_2
  := st_Y(pto_2)-st_Y(pto_1);</font><br><font size=2 face="sans-serif">         norm
 := sqrt(u_1^2 + u_2^2);</font><br><font size=2 face="sans-serif">      END IF;</font><br><font size=2 face="sans-serif">      last_pto := st_MakePoint(st_X(pto_2)+u_1/norm*dist,st_Y(pto_2)+u_2/norm*dist);</font><br><font size=2 face="sans-serif">      result   :=
result || st_X(first_pto) || ' ' || st_Y(first_pto) || ',';</font><br><font size=2 face="sans-serif">      FOR i IN 1..st_NumPoints(eje_)
LOOP</font><br><font size=2 face="sans-serif">          result
:= result || st_X(st_PointN(eje_,i)) || ' ' || st_Y(st_PointN(eje_,i))
|| ',';</font><br><font size=2 face="sans-serif">      END LOOP;</font><br><font size=2 face="sans-serif">      result := result
|| st_X(last_pto) || ' ' || st_Y(last_pto) || ')';</font><br><font size=2 face="sans-serif">      -- Find the final
Linestring:</font><br><font size=2 face="sans-serif">      b_ := st_intersection(st_GeomFromText(result,st_SRID(eje_)),bound_);</font><br><font size=2 face="sans-serif">      RETURN b_;</font><br><font size=2 face="sans-serif">  END $$</font><br><font size=2 face="sans-serif">  LANGUAGE plpgsql</font><br><font size=2 face="sans-serif">  STABLE</font><br><font size=2 face="sans-serif">  RETURNS NULL ON NULL INPUT;</font><br><font size=3><br></font><font size=1 face="Verdana"><br></font><BR>

<P>Notice:<BR>This email and any attachments may contain information that is 
personal, confidential,<BR>legally privileged and/or copyright. No part of it 
should be reproduced, adapted or communicated without the prior written consent 
of the copyright owner. </P>
<P>It is the responsibility of the recipient to check for and remove 
viruses.</P>
<P>If you have received this email in error, please notify the sender by return 
email, delete it from your system and destroy any copies. You are not authorised 
to use, communicate or rely on the information contained in this email.</P>
<P>Please consider the environment before printing this email.</P>