[postgis-users] Extending Linestrings
Leticia
lgomez at itba.edu.ar
Mon Apr 16 22:12:00 PDT 2007
Julio, THANKS!
_____
From: postgis-users-bounces at postgis.refractions.net
[mailto:postgis-users-bounces at postgis.refractions.net] On Behalf Of Julio
Galindo
Sent: Tuesday, April 17, 2007 1:53 AM
To: PostGIS Users Discussion
Subject: Re: [postgis-users] Extending Linestrings
Hi Leticia,
I create the following function for your problem, please test it carefully,
I only made two test (at the end):
CREATE OR REPLACE FUNCTION ExtendLine(eje_ geometry, bound_ geometry)
RETURNS geometry AS $$
-- version: alfa , by Julio A. Galindo, April 17, 2007:
juliogalindoq at gmail.com <mailto:juliogalindoq at gmail.com>
DECLARE
b_ geometry = boundary(bound_);
dist float;
max_dist float = 0;
n_points int;
pto_1 geometry;
pto_2 geometry;
first_pto geometry;
last_pto geometry;
u_1 float;
u_2 float;
norm float;
result text = 'LINESTRING(';
BEGIN
IF GeometryType(eje_) NOT LIKE 'LINESTRING'
OR GeometryType(bound_) NOT LIKE 'POLYGON' THEN RETURN NULL; END IF;
-- First Search how far is the boundary: (worst case)
pto_1 := StartPoint(eje_);
pto_2 := EndPoint(eje_);
FOR i IN 0..NumPoints(b_)-1 LOOP
dist := distance(PointN(b_,i),pto_1);
IF dist > max_dist THEN max_dist := dist; END IF;
dist := distance(PointN(b_,i),pto_2);
IF dist > max_dist THEN max_dist := dist; END IF;
END LOOP;
-- Now extent the linestring:
pto_2 := PointN(eje_,2);
u_1 := X(pto_2)-X(pto_1);
u_2 := Y(pto_2)-Y(pto_1);
norm := sqrt(u_1^2 + u_2^2);
first_pto := MakePoint(X(pto_1)-u_1/norm*dist,Y(pto_1)-u_2/norm*dist);
n_points := nPoints(eje_);
IF n_points > 2 THEN
pto_1 := PointN(eje_,n_points-1);
pto_2 := PointN(eje_,n_points);
u_1 := X(pto_2)-X(pto_1);
u_2 := Y(pto_2)-Y(pto_1);
norm := sqrt(u_1^2 + u_2^2);
END IF;
last_pto := MakePoint(X(pto_2)+u_1/norm*dist,Y(pto_2)+u_2/norm*dist);
result := result || X(first_pto) || ' ' || Y(first_pto) || ',';
FOR i IN 1..NumPoints(eje_) LOOP
result := result || X(PointN(eje_,i)) || ' ' || Y(PointN(eje_,i)) || ',';
END LOOP;
result := result || X(last_pto) || ' ' || Y(last_pto) || ')';
-- Find the final Linestring:
b_ := intersection(GeomFromText(result,SRID(eje_)),bound_);
RETURN b_;
END $$
LANGUAGE plpgsql
STABLE
RETURNS NULL ON NULL INPUT;
Test 1:
select asText(extendLine(geomFromText('LINESTRING(5 5, 12
12)',-1),GeomFromText('POLYGON((0 0,15 0,15 20,0 20,0 0))',-1)));
astext
---------------------------------
LINESTRING(0 0,5 5,12 12,15 15)
The solution is good, because the line is at 45 degress
And the same function can work with a general linestring (many points):
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)));
astext
---------------------------------------
LINESTRING(0 0,5 5,12 12,13 12,15 12)
Let me know if you improve this simple function.
Regards,
Julio A. Galindo Q.
Topogen Ltda.
La Paz, Bolivia
On 4/16/07, Leticia <lgomez at itba.edu.ar> wrote:
Hi community,
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.
Is there a simple method to do this?
-------------
| |
| | |
| | |
| |
-------------
I need the other one:
-------|-----
| | |
| | |
| | |
| | |
-------|-----
The original linestring is not always vertical u horizontal.
Thanks in advance,
Leticia
_______________________________________________
postgis-users mailing list
postgis-users at postgis.refractions.net
http://postgis.refractions.net/mailman/listinfo/postgis-users
<http://postgis.refractions.net/mailman/listinfo/postgis-users>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osgeo.org/pipermail/postgis-users/attachments/20070417/2444c479/attachment.html>
More information about the postgis-users
mailing list