{"id":201,"date":"2018-11-12T16:30:33","date_gmt":"2018-11-12T15:30:33","guid":{"rendered":"https:\/\/sigeo.cerege.fr\/?p=201"},"modified":"2018-11-13T14:14:22","modified_gmt":"2018-11-13T13:14:22","slug":"lidar-filtrage-du-sol-et-creation-de-mnt","status":"publish","type":"post","link":"https:\/\/sigeo.cerege.fr\/?p=201","title":{"rendered":"Lidar : Filtrage du sol et Cr\u00e9ation de MNT"},"content":{"rendered":"<h1>Workflow pour filtrer les points du sol dans des donn\u00e9es Lidar et cr\u00e9er un MNT<\/h1>\n<p>Ce workflow est un exemple de cas d&#8217;\u00e9tude que nous avons eu \u00e0 traiter, il est \u00e0 adapter en fonction des donn\u00e9es utilis\u00e9es<\/p>\n<p>Nous allons utiliser LibLAS, PDAL et Points2Grid<\/p>\n<h2>Donn\u00e9es en entr\u00e9e<\/h2>\n<p>Nous avons des nuages de points Lidar au format LAS, avec des coordonn\u00e9es en WGS84 pour le X et Y, et en m\u00e8tres pour le Z<\/p>\n<p>Affichage des m\u00e9tadonn\u00e9es (avec libLAS):<\/p>\n<p><code>lasinfo input.las<\/code><\/p>\n<p>Affichage des m\u00e9tadonn\u00e9es (avecPDAL):<\/p>\n<p><code>$ pdal info input.las<\/code><\/p>\n<p>il faut v\u00e9rifier si le syst\u00e8me de coordonn\u00e9es est d\u00e9finit, s&#8217;il y a un facteur d&#8217;\u00e9chelle selon X, Y ou Z, et toutes autres informations<\/p>\n<p>Supposons que le syst\u00e8me de coordonn\u00e9es n&#8217;est pas d\u00e9finit ou mal d\u00e9finit dans les m\u00e9tadonn\u00e9es du LAS, cela va causer des probl\u00e8mes dans la suite du traitement<\/p>\n<h2>D\u00e9finition du syst\u00e8me de coordonn\u00e9es<\/h2>\n<p>Cr\u00e9er un fichier JSON pour le traitement PDAL, nomm\u00e9 par exemple &#8220;assign_scr.json&#8221; :<\/p>\n<pre><span class=\"p\">{<\/span>\r\n    <span class=\"nt\">\"pipeline\"<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span>\r\n        <span class=\"p\">{<\/span>\r\n            <span class=\"nt\">\"type\"<\/span> <span class=\"p\">:<\/span> <span class=\"s2\">\"readers.las\"<\/span><span class=\"p\">,<\/span>\r\n            <span class=\"nt\">\"filename\"<\/span> <span class=\"p\">:<\/span> <span class=\"s2\">\"input.las\"<\/span>\r\n        <span class=\"p\">},<\/span>\r\n        <span class=\"p\">{<\/span>\r\n            <span class=\"nt\">\"type\"<\/span> <span class=\"p\">:<\/span> <span class=\"s2\">\"writers.las\"<\/span><span class=\"p\">,<\/span>\r\n<span class=\"hll\">            <span class=\"nt\">\"a_srs\"<\/span><span class=\"p\">:<\/span> <span class=\"s2\">\"EPSG:4326\"<\/span><span class=\"p\">,<\/span>\r\n<\/span>            <span class=\"nt\">\"filename\"<\/span> <span class=\"p\">:<\/span> <span class=\"s2\">\"output.las\"<\/span>\r\n        <span class=\"p\">}<\/span>\r\n    <span class=\"p\">]<\/span>\r\n<span class=\"p\">}\r\n<\/span><\/pre>\n<p>Puis lancer la commande:<\/p>\n<p><code>pdal pipeline assign_scr.json<\/code><\/p>\n<p>Maintenant la d\u00e9finition est correcte, mais il est pr\u00e9f\u00e9rable pour les interpolations et les traitements sur les MNT d&#8217;\u00eatre en projection avec les m\u00eames unit\u00e9s en horizontal qu&#8217;en vertical, nous allons donc reprojeter en UTM<\/p>\n<h2>Reprojection<\/h2>\n<p>cr\u00e9er un pipeline JSON comme suit, nomm\u00e9 par exemple &#8220;reproject.json&#8221; :<\/p>\n<pre><span class=\"p\">{<\/span>\r\n  <span class=\"nt\">\"pipeline\"<\/span><span class=\"p\">:[<\/span>\r\n    <span class=\"p\">{<\/span> \r\n        <span class=\"nt\">\"type\"<\/span><span class=\"p\">:<\/span><span class=\"s2\">\"writers.las\"<\/span><span class=\"p\">,<\/span> \r\n        <span class=\"nt\">\"filename\"<\/span><span class=\"p\">:<\/span><span class=\"s2\">\"input.las\"<\/span> \r\n    <span class=\"p\">}<\/span>\r\n    <span class=\"p\">{<\/span>\r\n        <span class=\"nt\">\"type\"<\/span><span class=\"p\">:<\/span><span class=\"s2\">\"filters.<span class=\"highlighted\">reprojection<\/span>\"<\/span><span class=\"p\">,<\/span>\r\n        <span class=\"nt\">\"out_srs\"<\/span><span class=\"p\">:<\/span><span class=\"s2\">\"EPSG:32633\"<\/span>\r\n    <span class=\"p\">},<\/span>\r\n    <span class=\"p\">{<\/span>\r\n      <span class=\"nt\">\"type\"<\/span><span class=\"p\">:<\/span><span class=\"s2\">\"writers.las\"<\/span><span class=\"p\">,<\/span>\r\n      <span class=\"nt\">\"filename\"<\/span><span class=\"p\">:<\/span><span class=\"s2\">\"output.las\"<\/span>\r\n    <span class=\"p\">}<\/span>\r\n  <span class=\"p\">]<\/span>\r\n<span class=\"p\">}<\/span><\/pre>\n<p>Puis lancer la commande:<\/p>\n<p><code>pdal pipeline reproject.json<\/code><\/p>\n<p>Il faut ensuite faire une classification sur les points<\/p>\n<h2>Classification du sol<\/h2>\n<p>cr\u00e9er un pipeline JSON comme suit, nomm\u00e9 par exemple &#8220;ground_classif.json&#8221; :<\/p>\n<pre>{\r\n  \"pipeline\":[\r\n    {\r\n         \"type\":\"filters.assign\",\r\n         \"assignment\":\"Classification[:]=0\"\r\n    },\r\n    {\r\n         \"type\":\"filters.elm\"\r\n    },\r\n   {\r\n         \"type\":\"filters.outlier\",\r\n         \"mean_k\":8,\r\n         \"multiplier\":3 \r\n   },\r\n   {\r\n         \"type\":\"filters.smrf\",\r\n         \"ignore\":\"Classification[7:7]\",\r\n         \"slope\":0.2,\r\n         \"window\":16,\r\n         \"threshold\":0.45,\r\n         \"scalar\":1.2\r\n    },\r\n    {\r\n         \"type\":\"filters.range\",\r\n         \"limits\":\"Classification[2:2]\"\r\n     }\r\n  ]\r\n}<\/pre>\n<p>Ce pipeline est bien d\u00e9crit dans les aides de PDAL, les \u00e9tapes en sont les suivantes :<\/p>\n<ol>\n<li>r\u00e9assigner tous les points \u00e0 la classe 0 car on suppose que la classification d&#8217;origine n&#8217;est pas bonne<\/li>\n<li>utilisation de l&#8217;algo ELM pour assigner les points consid\u00e9r\u00e9s comme du bruit \u00e0 la classe 7<\/li>\n<li>faire un filtrage statistique pour les points abb\u00e9rants<\/li>\n<li>utiliser le filtre SMRF sur les points restants pour classer les points<\/li>\n<li>ne r\u00e9cup\u00e9rer que les points class\u00e9s comme ground<\/li>\n<\/ol>\n<p>Puis lancer la commande:<\/p>\n<p><code>pdal pipeline ground_classif.json<\/code><\/p>\n<p>on r\u00e9cup\u00e8re donc un fichier las ne contenant que les points class\u00e9s comme sol (classe 2)<\/p>\n<p>il est maintenant possible d&#8217;interpoler les points pour cr\u00e9er un MNT<\/p>\n<h2>G\u00e9n\u00e9ration du MNT<\/h2>\n<p>l&#8217;interpolation peut se faire avec PDAL ou avec Points2Grid (outil utilis\u00e9 par OpenTopography pour g\u00e9n\u00e9rer des MNT). L&#8217;impl\u00e9mentation de PDAL est bas\u00e9e sur celle de Points2Grid, donc au final c&#8217;est \u00e9quivalent je pense.<\/p>\n<p>La version de points2grid que nous utilisons est celle de d\u00e9veloppement <a href=\"https:\/\/github.com\/CRREL\/points2grid\/\">ici<\/a><\/p>\n<p><code>points2grid -i ground.las -o dtm.tif -r 1 --output_format grid --input_format las --interpolation_mode incore --idw --resolution 1 --fill --fill_window_size 5<\/code><\/p>\n<p>pour des explications sur les param\u00e8tres taper : <code>points2grid -h<\/code><\/p>\n<h2>R\u00e9f\u00e9rences:<\/h2>\n<ul>\n<li><a href=\"https:\/\/pdal.io\/tutorial\/ground-filters.html\">https:\/\/pdal.io\/tutorial\/ground-filters.html<\/a> : filtrage sol sur PDAL, avec d&#8217;autres exemples encore sur ce site<\/li>\n<li><a href=\"https:\/\/opentopography.org\/otsoftware\/points2grid\">https:\/\/opentopography.org\/otsoftware\/points2grid<\/a> : pr\u00e9sentation g\u00e9n\u00e9rale de points2grid sur le site d&#8217;OpenTopography<\/li>\n<li><a href=\"https:\/\/github.com\/CRREL\/points2grid\/\">https:\/\/github.com\/CRREL\/points2grid\/<\/a> : version de d\u00e9veloppement de points2grid<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Workflow pour filtrer les points du sol dans des donn\u00e9es Lidar et cr\u00e9er un MNT Ce workflow est un exemple de cas d&#8217;\u00e9tude que nous avons eu \u00e0 traiter, il est \u00e0 adapter en fonction des donn\u00e9es utilis\u00e9es Nous allons utiliser LibLAS, PDAL et Points2Grid Donn\u00e9es en entr\u00e9e Nous avons des nuages de points Lidar &hellip; <a href=\"https:\/\/sigeo.cerege.fr\/?p=201\" class=\"more-link\">Continue reading<span class=\"screen-reader-text\"> &#8220;Lidar : Filtrage du sol et Cr\u00e9ation de MNT&#8221;<\/span><\/a><\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7,9],"tags":[],"class_list":["post-201","post","type-post","status-publish","format-standard","hentry","category-geo-traitements","category-lidar"],"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/sigeo.cerege.fr\/index.php?rest_route=\/wp\/v2\/posts\/201","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/sigeo.cerege.fr\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sigeo.cerege.fr\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sigeo.cerege.fr\/index.php?rest_route=\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/sigeo.cerege.fr\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=201"}],"version-history":[{"count":5,"href":"https:\/\/sigeo.cerege.fr\/index.php?rest_route=\/wp\/v2\/posts\/201\/revisions"}],"predecessor-version":[{"id":206,"href":"https:\/\/sigeo.cerege.fr\/index.php?rest_route=\/wp\/v2\/posts\/201\/revisions\/206"}],"wp:attachment":[{"href":"https:\/\/sigeo.cerege.fr\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=201"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sigeo.cerege.fr\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=201"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sigeo.cerege.fr\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=201"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}