[FOSSGIS-Talk] RE Stützpunkte interpolieren

bmarcus at giswana.de bmarcus at giswana.de
Di Apr 25 11:34:05 CEST 2023


Hallo Lisa,

das zur Verfügung gestellte Linien-SHP weist an Start- und Endpunkt keine
Z-Werte auf, wie folgendes SQL-Skript zu Tage bringt, welches Dank des
DB-Managers auch auf SHPs ausführbar ist:

-- Db-Manager
--- Provider: Virtual Layers
with recursive
init (geom) as (
	-- Geometrie von [...]
	select geometry 
	--- [...] Project Layers: <LAYER_NAME>
	from fluss_centerline
)
-- Vertices mit Distanz vom Startknoten auslesen
, cte1 (n, dist, geom) as (
	values(0, NULL, NULL)
	union
	select a.n+1
		-- Distanz vom Startknoten
		, st_Line_Locate_Point(b.geom, st_PointN(b.geom,
a.n+1))*st_length(b.geom) as dist
		-- Vertex2Point
		, st_PointN(b.geom, a.n+1)
	from init as b, cte1 as a
	-- Rekursion endet auf Endknoten
	where a.n < (
		select NumPoints(b.geom) from init
	) 
)
-- x,y,z-Werte
select n as vertex_num
	-- x-Wert Vertex
	, st_x(a.geom) as x
	-- y-Wert Vertex
	, st_y(a.geom) as y
	-- z-Wert Vertex
	, st_z(a.geom) as z
	-- Distanz
	, dist
	-- WellKnownText
	, asText(geom) as wkt
	, geom
from cte1 as a
where geom not NULL
;

Hier mal das abgespeckte Ergebnis nur mit Vertex-Nr, Z-Wert und
Vertex-Distanz vom Startpunkt der Linie: 

| vertex_num |   z   |       dist       |
|------------|-------|------------------|
| 1          | 0.0   | 0.0              |
| 2          | 0.0   | 31.8761593355873 |
| 3          | 0.0   | 50.8954840088664 |
| 4          | 45.05 | 65.1508864161536 |
| 5          | 0.0   | 122.818016300315 |
| 6          | 0.0   | 169.842156341097 |
| 7          | 0.0   | 195.634979955355 |
| 8          | 46.25 | 222.625843339259 |
| 9          | 0.0   | 244.025804556239 |
| 10         | 0.0   | 266.554114257698 |
| 11         | 0.0   | 289.869470228696 |
| 12         | 0.0   | 315.455907801369 |
| 13         | 46.35 | 420.027095184314 |
| 14         | 0.0   | 429.621139709655 |
| 15         | 0.0   | 440.019572151889 |

Der Umstand fehlender Z-Werte auf Start- und Endpunkt erfordert neben einer
Interpolation auch eine Extrapolation für fehlende Höhenwerte, was die Sache
nicht unbedingt einfacher macht. Da sich der Flussabschnitt in NRW befindet,
würde ich, wie Christian vorgeschlagen, die Höhen des Flussverlaufs über das
frei verfügbare DGM1 des Landes abgreifen und die Z-Werte ggf. auf deine
vorliegenden Informationen nivellieren. 
Falls du dennoch eine Inter-/Extrapolation abseits von Excel durchführen
möchtest, so würde ich dem obigen SQL-Skript eine Window-Funktion
nachschalten, in der die Vertices mit Höhenwerten mit ihren nachfolgenden
Vertices ohne Höhenwerte zu einem Frame zusammengefasst werden. Für die
Extrapolation brauchst du dann noch einen weiteren Frame mit den Höhen
bestückten Vertices und ihren vorherigen Vertices ohne Z-Wert. Über die
Frames kannst du anschließend eine Distanz gewichtete Inter-/Extrapolation
der Z-Werte durchführen. 

Leider versteht der DB-Manager es nicht, in einem bestehenden Layer die
Z-Werte zu aktualisieren, noch aus einem bestehenden 3D-Punkte Layer eine
3D-Linie zu erstellen. Hier bietet es sich an, einen WKT-String zu
generieren und hierüber eine neue Linie mit Höhenwerten zu erzeugen.

Beschriebene Vorgehensweise stellt kein leichtes Unterfangen dar. Da du
jedoch immer häufiger vor gleicher Fragestellung mit unterschiedlichen
Eingangsdaten stehst, hat die Automation der Arbeitsschritte den Vorteil,
dass du nicht immer wieder sehr zeitaufwendig und umständlich mit
Excel-Dateien und nachfolgenden QGIS-Werkzeugen rumdoktern musst. 

Viele Grüße

Bernd




Mehr Informationen über die Mailingliste FOSSGIS-Talk-Liste