LiDAR HD brut - Distinguer sol et sursol avec pdal#
Date de publication initiale : 24 juin 2024
Prérequis#
Intro#
Le relevé LiDAR (Light Detection and Ranging) est une technique de plus en plus utilisée pour la création de modèles numériques de précision. Cependant, les données LiDAR de part leur volumétrie et leurs spécificités, peuvent être difficiles à manipuler et à interpréter, en particulier lorsqu'il s'agit de distinguer le sol et le sursol.
Mais dis-moi Jamy
Le LiDAR envoie des impulsions dont les échos constituent un nuage de points bruts. Ce nuage de points bruts, donc indistincts, permet de construire un MNE (modèle numérique d'élévation). En différenciant ces échos, il s'agit d'extraire les échos du sol dans un MNT (modèle numérique de terrain) et ce qui en dépasse (le cas échéant) dans un MNS (modèle numérique de surface).
Heureusement, des outils tels que PDAL (Point Data Abstraction Library) et GDAL (Geospatial Data Abstraction Library) aident à traiter et à analyser les données LiDAR pour créer des MNT ou des MNS.
Dans cet article, je vais vous expliquer comment j'ai utilisé ces deux outils pour distinguer le sol et le sursol à partir des données LiDAR brutes de l'IGN, et fournir des exemples de code pour vous aider à démarrer dans la manipulation de ces données.
Info
La rédaction de cette article a été réalisée avant la livraison des données LiDAR HD classifiées par l'IGN. Toutefois, si vous souhaitez vous mettre en condition "données brutes" pour vous amuser, vous pouvez prendre les fichiers classifiés en attribuant la valeur de classification à 0
.
Processus global#
Voici un schéma récapitulatif de la procédure mise en place.
graph TD
A[LiDAR HD] -->G(Décompression)
G --> C(Colorisation)
B[Ortho] --> C
C --> R(Filtrer le bâti)
R --> D(Sol)
R --> E(Sursol)
D --> F(Raster)
Un environnement de travail : config.env#
Avant de se lancer, il est bon de vous parler du fichier de configuration que vous devrez adapter à votre organisation et qui sera utilisé par la suite pour télécharger et traiter les images. On y définit le répertoire de travail et différentes variables nécessaires à la bonne exécution des scripts.
Voici le fichier config.env
à adapter :
Environnement de travail | |
---|---|
Consulter le fichier de configuration
Un script pour orchestrer les différentes étapes#
Maintenant, entrons dans le vif du sujet avec la présentation des différentes étapes qui me permettent de traiter les données LiDAR brutes et de distinguer le sol et le sursol. Je vais décrire ici chaque étape et fournir des exemples de code pour vous aider à comprendre le processus de traitement global.
La décompression#
Les fichiers bruts ayant été livrés au format 7-zip, la première étape consiste à extraire les 4 dalles contenues dans chaque fichier 7z.
# Installation de p7zip : sudo apt install p7zip
7z x "$REPER/data_in/$base.7z" -o$REPER'/data_tmp/un7z'
Colorisation des images#
Dans cette étape, nous allons utiliser pdal pour affecter les informations colorimétriques de l'image aérienne sur chaque point LiDAR car cela facilite l'interprétation et améliore le rendu.
Warning
Il est important de noter que l'image aérienne utilisée n'est pas réalisée au même moment que le levé LiDAR, ce qui aura des conséquences sur la justesse de la colorisation. Par exemple : On peut voir le relief d'une voiture mais pas sa couleur, ou l'inverse.
Pour arriver au résultat, nous devons créer un pipeline de traitement pdal (enchainement des étapes à réaliser) au format json
que l'on pourra ensuite appeler pour lancer une commande pdal pipeline
.
Ici on définit :
- une variable d'entrée générique :
input.laz
- le filtre de colorisation qui va nous permettre de récupérer la valeur RGB des pixels sur chacun des points du nuage : filters.colorization auquel on va ajouter la variable de l'image à utiliser
- une variable de sortie
output.laz
Pipeline de colorisation | |
---|---|
Ensuite dans le script "maître", je vais appeler mon pipeline au format json
pour lancer la commande en définissant les variables correspondant aux fichiers à utiliser :
readers.las.filename
: correspond au fichier en entrée qui est associé auinput.laz
du pipelinefilters.colorization.raster
: correspond à l'image à utiliser pour la colorisation qui est associée auortho.jp2
du pipelinewriters.las.filename
: correspond au fichier en sortie qui est associé auoutput.laz
du pipeline
Info
Le résultat de la colorisation est stocké dans l'attribut rgb
des points LiDAR.
Distinguer le sol et le sursol#
Dans l'étape suivante, nous allons procéder à l'identification du sol et du sursol. Nous allons utiliser pdal pour filtrer les points LiDAR en utilisant une donnée vectorielle des bâtiments et différents filtres mathématiques pour isoler le sol et le reste des éléments de sursol.
Info
Nous allons stocker les résultats de la classification dans l'attribut de classification
des points LiDAR.
Identifier les bâtiments#
Pour me "faciliter le travail" et pour vous présenter comment l'utilisation d'une donnée vectorielle peut être mobilisée pour classifier un nuage de points, j'ai décidé d'utiliser une couche vectorielle des bâtiments sur laquelle je vais ajouter une colonne où je vais attribuer un attribut de classification pour les distinguer (ici j'ai utilisé la valeur 7).
Warning
La méthode est perfectible car les bâtiments ne sont pas nécessairement bien calés sur le relevé LiDAR, il est donc possible que certains points de sol ou de sursol périphériques au bâtiment soient classifiés comme tels et inversement.
Voici comment j'utilise gdal pour créer la colonne que j'ai nommé classif
:
Ensuite le même principe que pour la colorisation, on va créer un pipeline de traitement :
- une variable d'entrée :
input.laz
- on va assigner la valeur 0 à l'attribut
classification
de l'ensemble des points du nuage pour s'assurer qu'il n'y ait pas eu d'affectation antérieure - on va utiliser un filtre permettant de travailler sur la superposition d'une donnée vectorielle avec des données LiDAR : filters.overlay
- en définissant notre volonté de classifier
"dimension":"Classification"
- en définissant le fichier à utiliser
- la colonne stockant la valeur de classification à attribuer préalablement définie
- une variable de sortie
output.laz
Pipeline de classification des bâtiments | |
---|---|
On exécute le pipeline en définissant nos données colorisées en entrée sur laquelle devra se faire la classification.
Classification des bâtiments | |
---|---|
Info
L'argument verbose
: permet d'afficher explicitement toutes les opérations effectuées par la commande pdal. Valeur autorisée de 0 à 8.
Identifier le sol#
On va maintenant utiliser l'algorithme de classification Simple Morphological Filter (SMRF) pour distinguer le sol en excluant les points préalablement classifiés comme "bâtiment".
Le pipeline de traitement est défini par :
- une variable d'entrée :
input.laz
- un filtre d'exclusion : filters.range pour ignorer les points dont l'attribut classification est différent de 7 afin d'ignorer les bâtiments
- un filtre de classification filters.smrf pour isoler les éléments du sol
- un filtre de sélection filters.range pour conserver tous les points ayant été classifiés comme du sol par l'algorithme SMRF avec la valeur 2 (valeur conventionnelle utilisée pour le sol)
- une variable en sortie
output.laz
Toujours sur le même principe, on définit les variables d'entrée et de sortie pour la bonne exécution :
Extraction du sol | |
---|---|
Identifier le sursol#
Ensuite, on relance l'algorithme de classification Simple Morphological Filter (SMRF) en ajustant les paramètres pour isoler le sursol.
Le pipeline de traitement est défini ainsi :
- une variable d'entrée :
input.laz
- un filtre d'assignation de la valeur 6 pour les bâtiments (valeur conventionnelle utilisée pour les bâtiments)
- un filtre de classification filters.smrf pour isoler les éléments du sursol en ignorant les points classés 6
- un filtre d'exclusion : filters.range pour ignorer les points dont l'attribut classification est 2 (points correspondant au sol)
- un filtre d'assignation de la valeur 1 pour les éléments du sursol (valeur conventionnelle utilisée pour les éléments non classifiés)
- une variable en sortie
output.laz
On appelle le pipeline et on définit les variables :
Extraction du sursol | |
---|---|
Combinaison sol/sursol#
Voici le résultat après avoir chargé mon fichier de sol et mon fichier de sursol en leur attribuant une couleur par classe d'affectation ou en jouant avec les valeurs RGB.
Fusionner les dalles#
Maintenant que toutes les dalles ont été traitées (4 dalles dans un fichier 7zip), je décide de fusionner séparément les dalles de sol et les dalles de sursol afin de couvrir une zone plus grande et d'avoir deux fichiers distincts.
Pipeline de fusion | |
---|---|
On paramètre maintenant la fusion des différentes dalles.
fusion_sol | |
---|---|
Créer un raster du sol (MNT)#
La dernière étape consiste à générer un raster à partir du nuage de points classifié comme du sol en définissant :
- une variable d'entrée :
input.laz
- les paramètres de création du raster à l'aide de gdal :
- Format :
GTiff
- La méthode d'interpolation
- La résolution
- le fichier en sortie
output.tif
- Format :
Pipeline de création d'un raster | |
---|---|
On appelle le pipeline et on définit les variables :
Génération d'un raster | |
---|---|
Conclusion#
Cet article a vocation à montrer les possibilités et le fonctionnement global de PDAL.
La méthode proposée pour distinguer le sol et le sursol à partir de données LIDAR est à repositionner dans le contexte de la livraison des fichiers bruts. Celle-ci est perfectible si on compare aux fichiers classifiés livrés par l'IGN mais elle a l'avantage d'être facilement adaptable dans un autre contexte et suffisamment robuste pour pouvoir traiter de vastes emprises.
Auteur·ice#
Florian Boret#
Géomaticien/cartographe, je suis arrivé dans le monde de la géomatique en suivant un cursus « professionnalisant » (BTS Géomètre-Topographe, Licence pro GGAT, Master SIGAT). J’ai ensuite travaillé dans un bureau d’études spécialisé dans la production de données d’occupation du sol et puis pour des raisons personnelles je me suis expatrié quelques années au Sénégal où je me suis lancé comme géomaticien indépendant (DATA\WAX).
Depuis mon retour en France, je suis en charge du SIG de la communauté d'agglomération Lunel Agglo.
En dehors de ces expériences, j'ai aussi régulièrement initié de petits projets personnels iGeo-Topo, GIS-Blog.fr, osm2igeo, osm2igeotopo. Aujourd'hui, c’est avec plaisir que j’interviens également comme contributeur de GeoTribu.
Licence Beerware #
Ce contenu est sous licence Beerware (Révision 42).
Les médias d'illustration sont potentiellement soumis à d'autres conditions d'utilisation.
Réutiliser, citer l'article
Tant que vous conservez cette licence :
- vous pouvez faire ce que vous voulez de ce contenu
- si vous rencontrez l'auteur/e un jour et que vous pensez que ce contenu vaut le coup, vous pouvez lui payer un coup en retour
Citer cet article :
"LiDAR HD brut - Distinguer sol et sursol avec pdal" publié par Florian Boret sur Geotribu - Source : https://geotribu.fr/articles/2024/2024-06-24_lidar_hd_avec_pdal/
Commentaires
Une version minimale de la syntaxe markdown est acceptée pour la mise en forme des commentaires.
Propulsé par Isso.
Ce contenu est sous licence Beerware