Hallo Forum,
nach einer etwas längeren Pause bin ich mal wieder dazu gekommen mich mit dem Thema zu beschäftigen.
Eine gut Angeregung fand ich im Thread http://www.pg-forum.de/postgis/2961-distanzberechnung.html.
Zur Interpolation der Höhe eines einzelnen Messpunkt gehe ich aktuell wie folgt vor:
- Bestimmung der Höhenlinien in einen definierten Puffer um den Messpunkt.
- Berechnung des auf der Höhenline zum Messpunkt nächsten Punkt (ST_Line_Interpolate_Point).
- Berechnung einer Schnittlinie durch die im Punkt 2 bestimmten Messpunkte aller Höhenlinien aus Punkt 1. (Hierbei entsteht allerdings das Problem der Sortierung.)
- Berechnung des zum Messpunkt nächsten Punkt auf der Schnittlinie.
- Ableiten der Höhe des Punktes aus Punkt 4.
Nach diesen Schritten entsteht das folgende SQL Statement:
(Kann mir mal einer sagen, wie ich die Darstellung des SQL Statements breiter bekommen?)
-- Interpolation der Höhe zum übergebenen Messpunkt (GPS Trackpoint) anhand der SRTM Höhenlinien
SELECT ST_Z(ST_Line_Interpolate_Point(interpolateLine.line, ST_Line_Locate_Point(interpolateLine.line, ST_GeometryFromText('POINT(10.445718 50.7201761)', 4326))))
FROM (
-- SubSelect berechnet die Schnittline die durch den jeweiligen, auf der Höhenlinien berechneten Punkt führt
SELECT St_MakeLine(interpolatePoint.point) as line
FROM (
-- Berechnet auf jeder Höhenlinie den zum übergebenen Messpunkt nächsten Punkt (ST_Line_Interpolate_Point)
SELECT ST_SetSRID(ST_MakePoint( X(interpolateContourLinePoint.point), Y(interpolateContourLinePoint.point), interpolateContourLinePoint.height), 4326) as point
FROM (
--
SELECT ST_Line_Interpolate_Point(contourLines.way, ST_Line_Locate_Point(contourLines.way, point)) as point, contourLines.height as height
FROM (
-- Sucht alle Höhenlinien, die in einen übergebenen Bereich (Puffer = 0.02) um den Messpunkt liegen
SELECT height,
ST_Distance(ST_GeometryFromText('POINT(10.445718 50.7201761)', 4326), way) as distance,
-- Tabelle contours enthält MULTILINES -> Umwandlung nach LINE
linemerge(way) as way
FROM contours
WHERE ST_DWithin(ST_GeometryFromText('POINT(10.445718 50.7201761)', 4326), way, 0.02)
) as contourLines,
ST_GeometryFromText('POINT(10.445718 50.7201761)', 4326) as point
) as interpolateContourLinePoint
) as interpolatePoint
) as interpolateLine
Ich habe allerdings noch ein Problem mit der Sortierung der gefunden Höhenlinien, welches die folgende Abbildung verdeutlicht.
Die gefundenen Höhenlinien werden wie sie aus der Datenbank kommen einfach miteinander verbunden. Ich benötige aber eine Sortierung so das benachbarte Höhenlinien miteinander verbunden werden.
Hat jemand eine Idee? Ich komme hier gedanklich einfach nicht weiter. Ein einfaches ORDER BY distance reicht nicht.
Gruß, Torsten