Mehr

Wie extrahiert man Höhenwerte an Linienstart- und Endpunkten aus einem DEM?


Ich bin neu in der gesamten gis-Erfahrung und brauche Ihre Hilfe bei der Arbeit mit QGIS.

Ich habe:

  • DEM-Raster mit Höhen (3d)
  • Linienformdatei, die die Flüsse enthält (2d)

Ich brauche: Höhen für "Start" und "Ende" in Linien (um sie 3d zu erhalten) dann vergleiche diese Höhen mit "Flussrichtung" der Linien

qgis-help hilft mir nicht wirklich weiter. Habe versucht bei Google zu suchen, nichts brauchbares gefunden. Ich bin mir ziemlich sicher, dass es ein wirklich einfaches "Standard-Tool" sein kann, das tun kann, was ich will. Allerdings habe ich es noch nicht gefunden.

Bearbeiten:

naja, ich suche nach einer lösung, egal wie. habe keine erfahrung mit python.

Ich habe an diesem Problem gearbeitet und denke, ich bin fast fertig, aber es scheint ein Problem zu geben:

Ich habe die Knoten der Linien extrahiert, sie haben die Höhen aus dem Dem-Gitter. ich habe es sogar geschafft, die werte der punkte wieder zu den linien hinzuzufügen, aber wenn ich die werte überprüfe, hat die "minimale höhe" (oder maximal) nicht immer die passenden x- und y-koordinaten des punktes.

Beispiel: es gibt eine Zeile (Spalten: name, id, start_x, start_y, end_x, end_y). Ich habe die Punktwerte (x, y, z Koordinaten) in die Linie importiert. habe 6 neue Spalten in der Tabelle: min_x, min_y, min_z, max_x, max_y, max_z

Jetzt werden die Min- und Max-Koordinaten verwechselt und nicht mit denen der Punkte verglichen.

meine gedanken sind jetzt:

  • Ich lösche die min_x, min_y, max_x, max_y
  • benennen Sie "max_z" und "min_z" in "up" und "down" um
  • irgendwie muss ich die up_x, up_y und down_x, down_y von den Punkten bekommen. vielleicht gibt es eine Möglichkeit, dies im Feldrechner zu tun: (für up_x in der Tabelle "lines") value = "x" FROM "points" WHERE "up.lines" = "z.points"

Ich weiß nicht, ob das in qgis funktionieren kann oder wie der Code aussehen sollte. Vielleicht gibt es eine Möglichkeit, dies in Python zu verwalten, aber wie gesagt, ich habe keine Ahnung von Python.


Eine der einfacheren Möglichkeiten, dies zu tun, ist eine räumliche Datenbank wie PostGIS. Laden Sie Ihr Raster mit raster2pgsql (wird mit PostGIS installiert) in die Datenbank und laden Sie dann Ihre Flüsse mit shp2pgsql (ebenfalls mit PostGIS installiert).

Anschließend können Sie eine einfache Abfrage ausführen, die das Höhenmodell an den Endpunkten aller Ihrer Linien abtastet:

select st_value(r.rast, st_startpoint(geom)) as a, st_value(s.rast, st_endpoint(geom)) as b from rivers, dem r, dem s where st_contains(st_convexhull(r.rast), st_startpoint(geom) ) und st_contains(st_convexhull(s.rast), st_endpoint(geom));

Ich habe das DEM in der from-Klausel zweimal benannt, da die Enden der Linie von zwei verschiedenen Kacheln im Raster enthalten sein können und jede Kachel unabhängig abgeglichen werden muss. Deshalb gibt es zwei st_contains-Aufrufe.

Das Tolle an PostGIS ist, dass Sie diese Art der Verarbeitung über Millionen von Datensätzen mit minimalem Aufwand automatisieren können.

Beachten Sie, dass dies funktioniert, wenn die Liniengeometrie LineString ist. Wenn es sich um MultiLineStrings handelt, müssen Sie die Abfrage verfeinern oder mit st_dump in LineStrings umwandeln.


Wenn Sie nur nach der Position des niedrigsten oder höchsten Punkts auf der Linie suchen, würde ich es so machen. Richten Sie Ihre Punktdatei ein und erhalten Sie Z-Werte von dem. Extrahieren Sie Ihre Attributtabelle für Excel und verwenden Sie eine Suche, um Ihren max/min z-Wert (je nachdem, wonach Sie suchen) für jede Zeile mit den entsprechenden x- und y-Werten abzugleichen. Sie können Ihre Datei dann als CSV-Datei speichern und mithilfe eines Joins die Attribute zu Ihren Zeilen hinzufügen.

Es ist wichtig zu beachten, dass Sie die Linien-ID in den Punkt-Shapefile-Attributen enthalten müssen, damit Sie Ihre Max/Min-Werte aus Excel abrufen und Ihre CSV-Datei mit dem Linien-Shapefile verbinden können.