Suite

Comment extraire les valeurs d'altitude aux points de début et de fin de ligne d'un DEM ?


Je suis nouveau dans l'ensemble de l'expérience gis et j'ai besoin de votre aide pour travailler avec QGIS.

J'ai:

  • Raster DEM avec des hauteurs (3d)
  • line-shapefile qui contient les rivières (2d)

J'ai besoin de: hauteurs pour "début" et "fin" dans les lignes (pour les obtenir en 3d) puis comparez ces hauteurs avec la "direction d'écoulement" des lignes

qgis-help ne m'aide pas vraiment. J'ai essayé de chercher sur google, rien d'utile trouvé. Je suis à peu près sûr qu'il peut s'agir d'un "outil standard" très simple qui peut faire ce que je veux. Cependant je ne l'ai pas encore trouvé.

Éditer:

Eh bien, je cherche une solution, pas important de quelle façon. Je n'ai aucune expérience avec python.

Je travaillais sur ce problème et je pense que je suis presque prêt, mais il semble y avoir un problème :

j'ai extrait les nœuds des lignes, ils ont obtenu les hauteurs de la dem-grille. J'ai même réussi à ajouter les valeurs des points aux lignes, mais lorsque je vérifie les valeurs, la "hauteur minimale" (ou maximale) n'a pas toujours les coordonnées x et y appropriées du point.

exemple : il y a une ligne (colonnes : name, id, start_x, start_y, end_x, end_y). J'ai importé les valeurs ponctuelles (coordonnées x, y, z) dans la ligne. obtenu 6 nouvelles colonnes dans la table : min_x, min_y, min_z, max_x, max_y, max_z

maintenant, les coordonnées min et max sont mélangées et ne se comparent pas à celles des points.

mes pensées sont maintenant:

  • je supprime les min_x, min_y, max_x, max_y
  • renommer "max_z" et "min_z" en "up" et "down"
  • en quelque sorte, j'ai besoin d'obtenir les up_x, up_y et down_x, down_y à partir des points. peut-être y a-t-il un moyen de le faire dans la calculatrice de champ comme : (pour up_x dans le tableau "lignes") value = "x" FROM "points" WHERE "up.lines" = "z.points"

Je ne sais pas si cela peut fonctionner dans qgis ou à quoi devrait ressembler le code. peut-être qu'il existe un moyen de gérer cela en python, mais comme je l'ai dit, je n'ai aucune idée de python.


L'un des moyens les plus simples de le faire est d'utiliser une base de données spatiale telle que PostGIS. Chargez votre raster dans la base de données à l'aide de raster2pgsql (installé avec PostGIS), puis chargez vos rivières avec shp2pgsql (également installé avec PostGIS).

Ensuite, vous pouvez exécuter une requête simple qui échantillonne le modèle d'altitude aux extrémités de toutes vos lignes :

sélectionnez st_value(r.rast, st_startpoint(geom)) comme a, st_value(s.rast, st_endpoint(geom)) comme b des rivières, dem r, dem s où st_contains(st_convexhull(r.rast), st_startpoint(geom) ) et st_contains(st_convexhull(s.rast), st_endpoint(geom));

J'ai nommé le DEM deux fois dans la clause from car les extrémités de la ligne peuvent être contenues par deux tuiles différentes dans le raster, et chaque tuile devra être mise en correspondance indépendamment. C'est pourquoi il y a deux appels st_contains.

L'avantage de PostGIS est que vous pouvez automatiser ce type de traitement sur des millions d'enregistrements avec un minimum d'effort.

Notez que cela fonctionne si la géométrie de la ligne est LineString. S'il s'agit de MultiLineStrings, vous devrez affiner la requête ou utiliser st_dump pour les transformer en LineStrings.


Si vous cherchez uniquement à obtenir l'emplacement du point le plus bas ou le plus haut de la ligne, voici comment je procéderais. Configurez votre fichier de points et obtenez les valeurs z du dem. Extrayez votre table attributaire dans Excel et utilisez une recherche pour faire correspondre votre valeur z max/min (celle que vous recherchez) pour chaque ligne avec les valeurs x et y appropriées. Vous pouvez ensuite enregistrer votre fichier au format csv et utiliser une jointure pour ajouter les attributs à vos lignes.

Il est important de noter que vous aurez besoin d'avoir l'identifiant de ligne inclus dans les attributs du fichier de formes de points afin que vous puissiez obtenir vos valeurs max/min d'Excel et ainsi vous pouvez joindre votre csv au fichier de formes de ligne.