[postgis-users] Getting height profile from contour lines
Matthias Ludwig
kaotika at gmx.de
Mon Dec 20 02:43:12 PST 2010
Hello,
I want to calculate a height profile from contour lines. To do this I firstly calculate the intersection points between a profile line and the contour lines. This works good if there is only one line in the profile table. With more then one profile inside i get doubled points with different distance values. How can I prevent this? In other programming languages I would use a loop to calculate the intersection points for the first profile line then for the second... Is this also possible with one SQL query or only in combination with PL/pgSQL?
If someone see a point I can optimize please tell it too. *g*
profile line table (t_hoehenprofil_linie):
-------------------
gid | id | the_geom
-----+----+----------------------------------------
13 | | 0102000020E964000003000000687BB5B71C911
14 | | 0102000020E964000002000000589CEDA095911
part of contour line table(hoehenlinien_1m):
---------------------------
gid | ID | hoehe | the_geom
----+----+-------+----------------------------------------------------
1 | 0 | 86 | 0102000020E9640000090000008A3488A6ED9A1341CCEEFD1FE
2 | 1 | 87 | 0102000020E96400000B00000029EA729EDDF11341CCEEFD1FE
3 | 2 | 88 | 0102000020E96400000D000000DA26C90C53A11341CCEEFD1F
query:
------
DROP TABLE IF EXISTS t_schnittpunkte_hoehenprofil;
CREATE TABLE t_schnittpunkte_hoehenprofil AS
SELECT
nextval('id_number') AS gid,
t_hoehenprofil_linie.gid as profile_nr,
ergebnis.hoehe,
--Calculate point distance on profile line
round(
CAST(ST_Line_Locate_Point(t_hoehenprofil_linie.the_geom, ergebnis.the_geom) * ST_Length(t_hoehenprofil_linie.the_geom) AS numeric), 2
) AS dist,
ergebnis.the_geom
FROM
t_hoehenprofil_linie,
(SELECT
cut.gid, cut.hoehe,
(ST_Dump(
ST_Intersection(t_hoehenprofil_linie.the_geom, cut.the_geom)
)).geom as the_geom
FROM
t_hoehenprofil_linie,
(
SELECT
nextval('id_number') AS gid,
intersecting.hoehe,
--Dump it to prevent multilinestrings
(ST_Dump(
--cut contour lines with convex hull
ST_Intersection(
--generate convex hull from profile
--with 10m buffer
ST_Buffer(ST_ConvexHull(t_hoehenprofil_linie.the_geom), 10),
intersecting.the_geom
)
)).geom AS the_geom
FROM
--get intersecting contours with profile
(SELECT l.hoehe, l.the_geom
FROM t_hoehenprofil_linie, hoehenlinien_1m as l
WHERE ST_Intersects(l.the_geom, t_hoehenprofil_linie.the_geom)
) as intersecting,
t_hoehenprofil_linie
) as cut
) as ergebnis
output table:
-------------
SELECT gid, profile_nr, hoehe, dist, AsText(the_geom) FROM t_schnittpunkte_hoehenprofil;
gid | profile_nr | hoehe | dist | astext
-------+------------+-------+-------+------------------------
58023 | 15 | 160 | 0.00 | POINT(320624.965330361 5777867.98451583)
58007 | 16 | 160 | 0.00 | POINT(320586.767288447 5777830.54803155)
58010 | 15 | 160 | 0.00 | POINT(320624.965330361 5777867.98451583)
58020 | 16 | 160 | 0.00 | POINT(320586.767288447 5777830.54803155)
58028 | 15 | 159 | 2.30 | POINT(320649.710451749 5777853.53161307)
58011 | 16 | 160 | 6.24 | POINT(320624.965330361 5777867.98451583)
58024 | 16 | 160 | 6.24 | POINT(320624.965330361 5777867.98451583)
58006 | 15 | 160 | 10.32 | POINT(320586.767288447 5777830.54803155)
58019 | 15 | 160 | 10.32 | POINT(320586.767288447 5777830.54803155)
58015 | 16 | 160 | 14.56 | POINT(320594.200502687 5777798.8208976)
58029 | 16 | 159 | 34.90 | POINT(320649.710451749 5777853.53161307)
58014 | 15 | 160 | 42.91 | POINT(320594.200502687 5777798.8208976)
--
Mit freundlichen Grüßen
Matthias Ludwig
B.Eng. Geoinformation
Tel.: 0177/4913288
030/68329587
ICQ: 163168410
Neu: GMX De-Mail - Einfach wie E-Mail, sicher wie ein Brief!
Jetzt De-Mail-Adresse reservieren: http://portal.gmx.net/de/go/demail
More information about the postgis-users
mailing list