Evolution de la topographie d’une tourbière.
Exemples de réponses aux besoins de l’entreprise par des SIG open source
Une partie des tâches m’ont été attribuées en début de stage, puis, au fur et à mesure de leur achèvement, d’autres se sont ajoutées. Pour chacune, Philippe Grosvernier me décrivait ce qu’il voulait, nous discutions pour préciser l’objectif, puis je me lançais.
Programmation d’un outil de simulation de digues et de leurs inondations
LIN’eco travail à la réhabilitation de biotopes marécageux dont le principal problème est l’assèchement. Lorsque cet assèchement est du à des fossés de drainages ou à la modification de la topographie lors de l’extraction de la tourbe, il est utile de pouvoir simuler l’effet d’une ou plusieurs digues ou barrages sur le fonctionnement hydrologique du marais.
Pour cette raison un des objectifs du stage a été de créer une application qui permette de définir l’orientation et la longueur du barrage ou de la digue la plus courte à partir d’un point de coordonnées en fonction de l’altitude de l’inondation voulue puis de montrer l’étendu de l’inondation provoquée.
Ecriture du script
Pour l’écriture du script, j’ai travaillé en conceptualisant une structure théorique avec les différentes étapes/parties nécessaires à l’obtention du résultat, c’est-à-dire les longueurs et l’affichage des digues et inondations obtenues.
Puis j’ai cherché les outils dans Grass et les librairies fonctionnant avec pythons permettant d’effectuer ces étapes. Parallèlement, ma conception du script a évolué avec ma connaissance des librairies fonctionnant avec Python.
Dans les paragraphes qui suivent, je décris l’idée et la méthode utilisée pour les étapes principales (pour plus de détails voir le script « ProjetDigue.py » dans « réalisation_concrète.zip ».
En résumé : dans un premier temps, le script recherche les extrémités de digues en partant du point de coordonnées de départ, choisie la plus courte, puis l’incruste dans le MNT pour calculer l’inondation, cela en boucle pour les différentes altitudes choisies, puis il ouvre une fenêtre permettant la visualisation des digues et inondations obtenues sur un fond de carte choisi dans les options par l’utilisateur. Il permet aussi d’enregistrer les couches Grass et images créées.
Obtention des digues et des inondations
Pour la gestion des input, output et options, une fenêtre d’interaction entre l’utilisateur et le script est proposée par GRASS. Les coordonnées de la digue et de la source de l’inondation sont copiées sous GRASS (r.what) et collées dans les inputs.
Une première étape du script consiste à définir l’orientation pour obtenir la digue la plus courte à partir des coordonnées et de l’altitude des inondations voulues.
Pour cela mon idée est de vérifier la valeur des pixels, en avançant pixel par pixel dans plusieurs directions, en s’arrêtant lorsque la valeur du pixel dépasse la valeur d’altitude choisie pour l’inondation. Le problème avec cette méthode est que la digue peut être arrêtée par un seul pixel ou un petit groupe avec une altitude supérieure. Si cela se produit, l’inondation fait simplement le tour de ce pixel et la digue est inutile.
Figure 3: la digue s’est arrêtée sur un pixel dont la valeur est supérieure à l’altitude de l’inondation.
Pour remédier à cela j’ai ajouté une option qui permet de demander au script de continuer à tester la valeur des pixels tant que le nombre de pixels supérieurs à l’altitude désirée n’atteint pas le nombre fixé par l’utilisateur dans cette option. Si la valeur des pixels redevient inferieur à la valeur d’altitude de l’inondation voulue avant d’avoir atteint le nombre fixé dans cette option la recherche continue.
Si le nombre de pixels, dont la valeur est supérieure à l’altitude désirée, atteint le nombre fixé dans cette option l’extrémité de la digue sera située au premier de ces pixels. Ensuite le script choisit le segment le plus court.
Figure 4 : la digue ne s’est pas arrêtée sur un pixel dont la valeur est supérieure à l’altitude de l’inondation car l’option a autorisé le saut du pixel, l’orientation précédente n’est plus la digue la plus courte, une digue ayant une autre orientation est donc conservée.
On obtient ainsi les coordonnées des extrémités de la digue.
La longueur de la digue est calculée à partir de ces coordonnées.
Pour l’essai du programme, je travaillais seulement sur 4 orientations (nordest/sudouest ; nord/sud ; nordouest/sudest ; est/ouest). Et c’est resté car cela convenait à Philippe Grosvernier.
La librairie GDAL répond aux besoins de cette étape.
J’ai trouvé la méthode pour obtenir la valeur d’un pixel avec la librairie GDAL sur une page du site portailsig.org écrite par Martin Laloux.
Je n’ai pas réussi à faire fonctionner les fonctions GDAL avec le fichier raster déjà importé dans GRASS, par conséquent le script exporte le raster pour travailler avec GDAL.
Les coordonnées géoréférencées sont converties en coordonnées pixels pour le travail avec GDAL en dehors de GRASS, puis les coordonnées pixels des extrémités de la digue la plus courte sont converties en coordonnées géoréférencées.
L’étape suivante est d’importer la digue dans GRASS.
Pour pouvoir importer dans GRASS la digue qui n’est pour l’instant qu’une paire de coordonnées, je fais écrire au script (open,write,close) un fichier .asc qui est un vecteur sous forme de fichier texte assez simple :
VERTI
L 2 « coordonnées 1 » « coordonnées2 »
Dans la deuxième ligne, « L » signifie vecteur ligne, « 2 » pour 2 nœuds.
De cette manière, un vecteur de la digue la plus courte est obtenu et est importé dans GRASS.
Ensuite, avec les fonctions de GRASS, ce vecteur est rastérisé, la valeur d’altitude voulue est donnée aux pixels représentant la digue puis une couche raster est créée avec les valeurs du MNT sauf à l’emplacement de la digue, là on lui donne les valeurs de la digue.
Un MNT comprenant la digue est ainsi obtenu sur la base duquel on peut simuler une inondation.
Cela fonctionne en boucle et recommence pour chaque valeur d’altitude d’inondation que l’on veut simuler.
Les fichiers temporaires sont effacés à la fin de chaque boucle.
Les couches gardées pour chaque altitude d’inondation sont le raster représentant la digue et le raster représentant l’inondation. Ils sont exportés au format .png pour être affichés hors GRASS.
Affichage des résultats obtenus
Etant donné que les ordinateurs de l’entreprise fonctionnent sous Windows et que je ne pouvais pas décemment proposer de créer une machine virtuelle linux seulement pour faire tourner le script, plusieurs difficultés se sont imposées dès le départ. La plus grosse étant l’impossibilité d’afficher les couches dans GRASS sous Windows via une ligne de commande, et des problèmes d’interactivité (voir annexe 1 ou le paragraphe Known issues/won ‘t fix sur la page http://grasswiki.osgeo.org/wiki/WinGRASS_Current_Status ).
Ce qui veut dire que l’application ne pourra pas utiliser l’affichage de GRASS, il faudra qu’elle contienne sa propre fenêtre d’affichage.
Une fois les images des inondations créées, il faut pouvoir les afficher. Pour cela j’ai utilisé Wxpython qui est une boite à outil servant à construire une interface graphique.
La principale difficulté a été de superposer trois images (digue, inondation et image de fond) et de pouvoir les faire défiler (scroll) correctement ensemble. Après de nombreuses tentatives avec des méthodes différentes qui ne permettaient pas d’obtenir à la fois l’affichage des trois images et leur défilement correct, la solution a été de faire un masque sur la couleur noire représentant les valeurs NULL.
Les images contiennent dans leur nom l’altitude qui servira de références pour les appeler (ex : digue354.png, lac354.png).
Pour passer d’une image à l’autre j’ai écrit des fonctions, appelées par une interaction de l’utilisateur avec des boutons, qui changent la valeur d’un objet contenant la valeur d’altitude qui sert de référence puis lance l’affichage des images correspondantes.
Fonctionnement de l’outil
Les paramètres obligatoires sont:
Nom du raster dans Grass : nom du MNT dans grass à utiliser.
Coordonnées de départ de la digue : coordonnées du point de départ du calcule de la digue.
Altmin surface de l’inondation : altitude de l’inondation la plus basse.
Altmax surface de l’inondation : altitude de l’inondation la plus haute.
Saut d’altitude : saut d’altitude entre les inondations calculées.
Les inondations seront calculées aux altitudes : [Altmin inondation ; Altmin inondation +1x Saut d’altitude ; Altmin inondation +2x Saut d’altitude ; Altmin inondation +3x Saut d’altitude ; … ; Altmin inondation + n x Saut d’altitude ; Altmax inondation.
Coordonnées de remplissage : coordonnées de la source de l’inondation.
Les paramètres optionnels sont:
Nom du vecteur servant à délimiter la région : Pour limiter le temps de calcule on peut utiliser un polygone vecteur pour délimité la région calculée et affichée. Par défaut le programme utilise la région du MNT en imput.
Nom du raster servant d’image de fond : la digue et l’inondation doivent être calculées sur un MNT mais cette option permet de choisir l’image de fond sur laquelle les résultats seront affichés. (tout raster importé dans Grass peut être utilisé)
Résolution : résolution d’affichage en mètre, une résolution moins fine permet au programme d’aller plus vite dans les parties où il n’utilise pas la résolution originale. Par défaut le programme utilise la résolution du MNT en imput.
Choisir couleur de la carte : Choix de l’aspect de la carte de fond.
Taille d’affichage : ratio gérant la taille d’affichage initial (en %).
Suivant la résolution et la taille de la région, l’image affichée peut être petite ou grande.
Pour éviter de devoir zoomer ou dézoomer dès le début on peut régler ce paramètre.
Nom des inondations crées : nom des rasters représentant l’inondation (créés dans grass).
Nom rasters mnt avec digue crées : nom des rasters où la digue est ajouté au MNT (créés dans grass).
Nom ajouté au début du nom de l’image quand on veut l’enregistrer : l’application permet d’enregistrer le rendu (digue, et inondation sur image de fond) et de choisir le dossier, cette option permet de définir le nom de base des images enregistrées, sera ensuite ajouté leur altitudes.
Nbr pixels d’alt sup que la digue peut sauter :
Pour choisir la longueur de la digue le programme avance de pixel en pixel jusqu’à ce que la valeur du pixel soit supérieure à l’altitude désirée.
Le problème de cette approche est que s’il y a qu’une « île » d’altitude supérieure, la digue va s’arrêter là et l’inondation va faire le tour rendant la digue inutile.
Pour éviter ça on peut autoriser le programme tester si le nombre de pixel supérieur à l’altitude désirée ne dépasse pas le nombre fixé dans ce paramètre et à continuer s’il est inferieur.
|
Table des matières
Introduction
I. L’entreprise
A. Présentation
B. Besoins de l’entreprise
II. Exemples de réponses aux besoins de l’entreprise par des SIG open source
A. programmation d’un outil de simulation de digues et de leurs inondations
B. Organisation des données sous GRASS
C. Obtenir MNT et MNS à partir de LAS sol et LAS surface
D. Modifier la topographie sur un MNT
E. Evolution de la topographie d’une tourbière.
F. Créer une carte raster représentant la topographie du sous-sol sous une couche de tourbe
G. Numérisation d’un relevé topographique
H. Création d’un outil de profils dont les données sont facilement exportables dans Excel
I. Esquisse de projet pour lutter contre l’assèchement et l’érosion d’une tourbière
III. Logiciels utilisés
Discussion
Conclusion
Bibliographie
Annexe
Télécharger le rapport complet