|
| 1 | +--- |
| 2 | +title: Optimiser vos rasters et générer des mosaïques au format COG avec GDAL |
| 3 | +subtitle: Des orthos grille en-tête |
| 4 | +authors: |
| 5 | + - Nicolas ROCHARD |
| 6 | +categories: |
| 7 | + - article |
| 8 | +comments: true |
| 9 | +date: 2025-02-11 |
| 10 | +description: Découvrez comment optimiser vos rasters et créer des mosaïques au format COG avec GDAL pour une gestion efficace des données raster géospatiales. |
| 11 | +icon: material/grid |
| 12 | +image: |
| 13 | +license: default |
| 14 | +robots: index, follow |
| 15 | +tags: |
| 16 | + - COG |
| 17 | + - GDAL |
| 18 | + - raster |
| 19 | +--- |
| 20 | + |
| 21 | +<!-- markdownlint-disable-file MD046 --> |
| 22 | + |
| 23 | +# Optimiser vos rasters et générer des mosaïques au format COG (Cloud Optimized GeoTIFF) avec GDAL |
| 24 | + |
| 25 | +:calendar: Date de publication initiale : {{ page.meta.date | date_localized }} |
| 26 | + |
| 27 | +## Introduction |
| 28 | + |
| 29 | +Les données Raster sont une composante majeure des référentiels de nos systèmes d'information géographique. Ces fichiers sont bien plus volumineux que des données vectorielles et sont parfois fragmentés en plusieurs dalles rendant son chargement laborieux. Lorsque ces données sont disponibles en flux WMS ou WMTS, alors leur consultation est plus aisée mais présente des limitations (pas de possibilité d'affiner la radiométrie, lenteur d'affichage, problème d'impression, etc.). Il est alors indispensable d'avoir une donnée en local ou sur le réseau de la structure. |
| 30 | + |
| 31 | +{: .img-thumbnail-left } |
| 32 | + |
| 33 | +C'est là que le COG (_Cloud Optimized GeoTIFF_) intervient pour simplifier la vie des géomaticiens. Ce type de GeoTIFF, optimisé par sa structure, facilite le traitement et la visualisation des données spatiales à grande échelle grâce à leur accessibilité rapide et leur structure efficiente. En effet, il ne va pas charger l'intégralité de l'image comme un GeoTiff classique mais "streamer" uniquement la partie qui vous intéresse. Sa compatibilité est excellente, si l'application n'est pas capable de tirer parti du pilote COG, le raster se comportera comme un GeoTIFF classique. C'est un vrai plus pour la portabilité et la diffusion des données. Pour en savoir plus, consultez le [site officiel du projet](https://cogeo.org/). Conçus spécifiquement pour le cloud, les COG offrent de nombreux avantages sur d'autres environnements : |
| 34 | + |
| 35 | +- **Performance améliorée** : affichage quasi-immédiat même sur des volumes importants évitant ainsi les frustrations liées aux lenteurs, que ce soit au bureau ou en télétravail. |
| 36 | +- **Données peu ou pas altérées**_(en fonction des options de compression choisies)_ : vous pouvez modifier la radiométrie, l'ordre des bandes, l'utiliser dans des processus de geotraitements, etc. |
| 37 | +- **Simplicité d'organisation** : une seule image à charger, éliminant le besoin de VRT peu performant, la génération de pyramides et réduisant la gestion de nombreux fichiers |
| 38 | + |
| 39 | +{: .img-center loading=lazy } |
| 40 | + |
| 41 | +Dans cet article, nous aborderons les meilleures pratiques pour générer des COG avec GDAL, un outil essentiel des SIG. Certaines options n'étant pas encore disponibles dans QGIS, nous utiliserons donc la ligne de commande. Pas d'inquiétude : il s'agit toujours de la même base avec quelques variations et, même sans être un expert, vous vous en sortirez très bien (j'ai pu tester sur mes collègues et ils ont survécu). |
| 42 | + |
| 43 | +[Commenter cet article :fontawesome-solid-comments:](#__comments "Aller aux commentaires"){: .md-button } |
| 44 | +{: align=middle } |
| 45 | + |
| 46 | +---- |
| 47 | + |
| 48 | +## Pré-requis |
| 49 | + |
| 50 | +Avant de commencer la génération de COG, assurez-vous de disposer des éléments suivants : |
| 51 | + |
| 52 | +- **GDAL Version 3.1 ou supérieure** : vérifiez que votre installation de GDAL est à jour pour bénéficier des dernières améliorations et fonctionnalités spécifiques aux COG. |
| 53 | +- **Types de Raster appropriés** : pour les données raster à une bande (comme les Modèles Numériques de Terrain - MNT ou d’Élévation - MNE), utilisez des fichiers au format TIF, ASC ou tout autre format compatible avec GDAL. Pour les rasters à trois bandes, les orthophotos sont particulièrement adaptées. |
| 54 | +- **Environnement Linux ou Windows** : les commandes abordées ici ont été testées sur ces deux systèmes d’exploitation. |
| 55 | + |
| 56 | +!!! info "Précaution d'usage pour Windows" |
| 57 | + Si votre terminal ne vous trouve pas les commandes GDAL, indiquez le chemin complet jusqu'au binaire GDAL. Exemple avec celui intégré à votre installation de QGIS : |
| 58 | + |
| 59 | + ```batch |
| 60 | + C:\Users\nom_utilisateur> C:\"Program Files"\"QGIS 3.34.8"\bin\gdalinfo --version |
| 61 | + ``` |
| 62 | + |
| 63 | + Sinon référez-vous à cet article [Python et GDAL sur Windows](../2013/2013-09-26_installer_python_gdal_sous_windows.md "Python et GDAL sur Windows") ou [à celui-ci](../2020/2020-10-28_gdal_windows_subsystem_linux_wsl.md "Utiliser GDAL sur Windows via WSL"). |
| 64 | + |
| 65 | +## Construction du VRT pour un raster à 1 bande |
| 66 | + |
| 67 | +Pour combiner plusieurs fichiers raster ASC en un VRT (Virtual Raster Tile), une étape nécessaire avant de générer le COG final, utilisez la commande suivante : |
| 68 | + |
| 69 | +=== ":penguin: Linux" |
| 70 | + |
| 71 | + ```bash |
| 72 | + gdalbuildvrt my_dsm.vrt -addalpha -a_srs EPSG:2154 /dsm_directory/*.asc |
| 73 | + ``` |
| 74 | + |
| 75 | +=== "🪟 Windows" |
| 76 | + |
| 77 | + ```batch |
| 78 | + gdalbuildvrt.exe C:\dsm\my_dsm.vrt C:\dsm_directory\*.asc -addalpha -a_srs EPSG:2154 |
| 79 | + ``` |
| 80 | +Détail des options : |
| 81 | + |
| 82 | +- `-addalpha` : ajoute un canal alpha. |
| 83 | +- `-a_srs EPSG:2154` : définit le système de référence spatiale à utiliser. |
| 84 | + |
| 85 | +## Conversion en COG pour un raster à 1 bande |
| 86 | + |
| 87 | +Une fois le VRT construit, transformez-le en COG avec cette commande : |
| 88 | + |
| 89 | +=== ":penguin: Linux" |
| 90 | + |
| 91 | + ```bash |
| 92 | + gdal_translate input_dsm.vrt my_dsm_output_cog.tif -of COG \ |
| 93 | + -co RESAMPLING=NEAREST \ |
| 94 | + -co OVERVIEW_RESAMPLING=NEAREST \ |
| 95 | + -co COMPRESS=DEFLATE \ |
| 96 | + -co PREDICTOR=2 \ |
| 97 | + -co NUM_THREADS=20 \ |
| 98 | + -co BIGTIFF=IF_NEEDED |
| 99 | + ``` |
| 100 | + |
| 101 | +=== "🪟 Windows" |
| 102 | + |
| 103 | + ```batch |
| 104 | + gdal_translate.exe C:\dsm\input_dsm.vrt C:\dsm\my_dsm_output_cog.tif -of COG ^ |
| 105 | + -co BLOCKSIZE=512 ^ |
| 106 | + -co OVERVIEW_RESAMPLING=NEAREST ^ |
| 107 | + -co COMPRESS=DEFLATE ^ |
| 108 | + -co PREDICTOR=2 ^ |
| 109 | + -co NUM_THREADS=20 ^ |
| 110 | + -co BIGTIFF=IF_NEEDED |
| 111 | + ``` |
| 112 | + |
| 113 | +Aperçu du RGE ALTI® 1m à l'échelle des Hauts-de-France |
| 114 | + |
| 115 | +{: .img-center loading=lazy } |
| 116 | + |
| 117 | +### Points clés |
| 118 | + |
| 119 | +- **Resampling** : utilisez `RESAMPLING=NEAREST` pour préserver l'intégrité des données. |
| 120 | +- **Optimisation des performances** : ajustez `NUM_THREADS` en fonction de la capacité de votre machine. |
| 121 | + |
| 122 | +### Volumétrie |
| 123 | + |
| 124 | +Mon COG sera plus léger que les données téléchargées, sauf si celles-ci sont déjà compressées. L'objectif est de préserver la donnée source tout en optimisant les performances d'affichage et de traitement. Voici quelques exemples de données assemblées et converties en COG pour la Région Hauts-de-France : |
| 125 | + |
| 126 | +| Données | Format source | Poids brut | Poids en COG | |
| 127 | +| :------ | :-----------: | :--------: | :----------: | |
| 128 | +| [MNS correlés](https://geoservices.ign.fr/modeles-numeriques-de-surfaces-correles) | TIF (compression LZW) | 241.4 Go | 235.5 Go | |
| 129 | +| [RGE ALTI®](https://geoservices.ign.fr/rgealti) | ASC | 206.3 Go | 48.2 Go | |
| 130 | + |
| 131 | +## Processus pour un raster à 3 bandes |
| 132 | + |
| 133 | +### Conversion de JP2 en TIF |
| 134 | + |
| 135 | +Commencez par convertir chaque fichier JP2 en TIF en utilisant une boucle bash. Assurez-vous d'avoir créé un répertoire dédié pour les fichiers TIF : |
| 136 | + |
| 137 | +=== ":penguin: Linux" |
| 138 | + |
| 139 | + ```bash |
| 140 | + for f in *.jp2; do |
| 141 | + gdal_translate -of GTiff \ |
| 142 | + -co TILED=YES \ |
| 143 | + -co BIGTIFF=YES \ |
| 144 | + -co BLOCKXSIZE=512 \ |
| 145 | + -co BLOCKYSIZE=512 \ |
| 146 | + -co NUM_THREADS=20 \ |
| 147 | + -co COMPRESS=ZSTD \ |
| 148 | + -co PREDICTOR=2 \ |
| 149 | + ${f} ../0_TIF/${f%.*}.tif |
| 150 | + done |
| 151 | + ``` |
| 152 | + |
| 153 | +=== "🪟 Windows" |
| 154 | + |
| 155 | + ```batch |
| 156 | + FOR %%F IN (C:\ortho\jpg2\*.jp2) DO ^ |
| 157 | + gdal_translate.exe -of GTiff ^ |
| 158 | + -co TILED=YES ^ |
| 159 | + -co BIGTIFF=YES ^ |
| 160 | + -co BLOCKXSIZE=512 ^ |
| 161 | + -co BLOCKYSIZE=512 ^ |
| 162 | + -co NUM_THREADS=20 ^ |
| 163 | + -co COMPRESS=ZSTD ^ |
| 164 | + -co PREDICTOR=2 ^ |
| 165 | + %%F C:\ortho\0_TIF\%%~nxF.tif |
| 166 | + ``` |
| 167 | + |
| 168 | +- **Taille des blocs** : `BLOCKXSIZE` et `BLOCKYSIZE` impactent les performances de lecture. |
| 169 | + |
| 170 | +### Construction du VRT pour un raster à 3 bandes |
| 171 | + |
| 172 | +Créez un VRT pour votre ensemble de données TIFF avec la commande suivante : |
| 173 | + |
| 174 | +=== ":penguin: Linux" |
| 175 | + |
| 176 | + ```bash |
| 177 | + gdalbuildvrt my_orthophotography.vrt 0_TIF/*.tif -addalpha -hidenodata -a_srs EPSG:2154 |
| 178 | + ``` |
| 179 | + |
| 180 | +=== "🪟 Windows" |
| 181 | + |
| 182 | + ```batch |
| 183 | + gdalbuildvrt.exe C:\ortho\my_orthophotography.vrt C:\ortho\0_TIF\*.tif -addalpha -hidenodata -a_srs EPSG:2154 |
| 184 | + ``` |
| 185 | + |
| 186 | +- `-hidenodata` : masque les cellules nodata, rendant les zones correspondantes transparentes. |
| 187 | + |
| 188 | +### Conversion du VRT en COG |
| 189 | + |
| 190 | +Générez le COG à partir du VRT : |
| 191 | + |
| 192 | +=== ":penguin: Linux" |
| 193 | + |
| 194 | + ```bash |
| 195 | + gdal_translate my_orthophotography.vrt my_orthophotography_output_cog.tif -of COG \ |
| 196 | + -co BLOCKSIZE=512 \ |
| 197 | + -co OVERVIEW_RESAMPLING=BILINEAR \ |
| 198 | + -co COMPRESS=JPEG \ |
| 199 | + -co QUALITY=85 \ |
| 200 | + -co NUM_THREADS=12 \ |
| 201 | + -co BIGTIFF=YES |
| 202 | + ``` |
| 203 | + |
| 204 | +=== "🪟 Windows" |
| 205 | + |
| 206 | + ```batch |
| 207 | + gdal_translate.exe C:\ortho\my_orthophotography.vrt C:\ortho\my_orthophotography_output_cog.tif -of COG ^ |
| 208 | + -co BLOCKSIZE=512 ^ |
| 209 | + -co OVERVIEW_RESAMPLING=BILINEAR ^ |
| 210 | + -co COMPRESS=JPEG ^ |
| 211 | + -co QUALITY=85 ^ |
| 212 | + -co NUM_THREADS=12 ^ |
| 213 | + -co BIGTIFF=YES |
| 214 | + ``` |
| 215 | + |
| 216 | +- **Compression JPEG** : un bon compromis entre taille de fichier et qualité avec une `QUALITY` de 85. |
| 217 | +- **Rééchantillonnage** : `BILINEAR` pour un rendu visuel optimal dans les visualisations géospatiales. |
| 218 | + |
| 219 | +Aperçu de la BD ORTHO® 2021 à l'échelle des Hauts-de-France : |
| 220 | + |
| 221 | +{: .img-center loading=lazy } |
| 222 | + |
| 223 | +### Volumétrie |
| 224 | + |
| 225 | +Le format JP2 offre une compression efficace mais requiert un codec propriétaire, limitant son utilisation. Une licence est nécessaire pour des applications serveur. La conversion en COG améliore les performances et la polyvalence d'utilisation (SIG desktop, flux, traitements d'images, etc.), bien qu'au détriment de la taille. |
| 226 | +La compression JPEG, bien que destructrice, convient parfaitement aux orthophotos. La qualité visuelle reste suffisante, même pour l'impression ou le traitement d'image. |
| 227 | + |
| 228 | +| Données | Format source | Poids brut | Poids en COG | |
| 229 | +| :------ | :-----------: | :--------: | :----------: | |
| 230 | +| [BD ORTHO®](https://geoservices.ign.fr/bdortho) | JP2 (format compressé) | 30.7 Go | 60.5 Go | |
| 231 | +| [PCRS Raster](https://www.geo2france.fr/datahub/dataset/94a69703-572f-463a-9cfc-6bca075384b8) | TIF (ZSTD) | 20.1 To | 3.1 Go | |
| 232 | + |
| 233 | +## Cas particuliers et bonnes pratiques |
| 234 | + |
| 235 | +### Découpe selon un contour |
| 236 | + |
| 237 | +Pour éliminer les pixels indésirables en bordure (non définis comme nodata), utilisez un shapefile d'emprise : |
| 238 | + |
| 239 | +=== ":penguin: Linux" |
| 240 | + |
| 241 | + ```bash |
| 242 | + gdalwarp -of GTiff \ |
| 243 | + -co TILED=YES \ |
| 244 | + -co BIGTIFF=YES \ |
| 245 | + -co BLOCKXSIZE=512 \ |
| 246 | + -co BLOCKYSIZE=512 \ |
| 247 | + -co NUM_THREADS=12 \ |
| 248 | + -co COMPRESS=ZSTD \ |
| 249 | + -co PREDICTOR=2 \ |
| 250 | + -s_srs EPSG:2154 \ |
| 251 | + -t_srs EPSG:2154 \ |
| 252 | + -dstalpha \ |
| 253 | + -cutline area_of_interest.shp \ |
| 254 | + input_image.jp2 \ |
| 255 | + image_output.tif |
| 256 | + ``` |
| 257 | + |
| 258 | +=== "🪟 Windows" |
| 259 | + |
| 260 | + ```batch |
| 261 | + gdalwarp.exe -of GTiff ^ |
| 262 | + -co TILED=YES ^ |
| 263 | + -co BIGTIFF=YES ^ |
| 264 | + -co BLOCKXSIZE=512 ^ |
| 265 | + -co BLOCKYSIZE=512 ^ |
| 266 | + -co COMPRESS=ZSTD ^ |
| 267 | + -co PREDICTOR=2 ^ |
| 268 | + -s_srs EPSG:2154 ^ |
| 269 | + -t_srs EPSG:2154 ^ |
| 270 | + -dstalpha ^ |
| 271 | + -cutline C:\data\area_of_interest.shp ^ |
| 272 | + C:\ortho\input_image.jp2 ^ |
| 273 | + C:\ortho\image_output.tif |
| 274 | + ``` |
| 275 | + |
| 276 | +### Conversion de JP2 en TIFF RVBA |
| 277 | + |
| 278 | +Pour convertir un JP2 en TIFF RVBA tout en préservant l’unité colorimétrique : |
| 279 | + |
| 280 | +=== ":penguin: Linux" |
| 281 | + |
| 282 | + ```bash |
| 283 | + gdal_translate -of GTiff \ |
| 284 | + -co BIGTIFF=YES \ |
| 285 | + -co TILED=YES \ |
| 286 | + -co BLOCKXSIZE=512 \ |
| 287 | + -co BLOCKYSIZE=512 \ |
| 288 | + -co NUM_THREADS=12 \ |
| 289 | + -co COMPRESS=ZSTD \ |
| 290 | + -co PREDICTOR=2 \ |
| 291 | + -b 1 -b 2 -b 3 -b mask \ |
| 292 | + -colorinterp red,green,blue,alpha \ |
| 293 | + -a_srs EPSG:2154 \ |
| 294 | + input_image.jp2 \ |
| 295 | + output_image.tif |
| 296 | + ``` |
| 297 | + |
| 298 | +=== "🪟 Windows" |
| 299 | + |
| 300 | + ```batch |
| 301 | + gdal_translate.exe -of GTiff ^ |
| 302 | + -co BIGTIFF=YES ^ |
| 303 | + -co TILED=YES ^ |
| 304 | + -co BLOCKXSIZE=512 ^ |
| 305 | + -co BLOCKYSIZE=512 ^ |
| 306 | + -co NUM_THREADS=12 ^ |
| 307 | + -co COMPRESS=ZSTD ^ |
| 308 | + -co PREDICTOR=2 ^ |
| 309 | + -b 1 -b 2 -b 3 -b mask ^ |
| 310 | + -colorinterp red,green,blue,alpha ^ |
| 311 | + -a_srs EPSG:2154 ^ |
| 312 | + C:\ortho\input_image.jp2 ^ |
| 313 | + C:\ortho\output_image.tif |
| 314 | + ``` |
| 315 | + |
| 316 | +## Considérations finales |
| 317 | + |
| 318 | +- **Compression** : |
| 319 | + - Utilisez `JPEG` pour les fichiers RVB (3 bandes). |
| 320 | + - Préférez `DEFLATE` ou `ZSTD` pour les fichiers avec plus de 3 bandes ou en 16 bits. |
| 321 | +- **Méthode de Rééchantillonnage** : |
| 322 | + - `BILINEAR` est idéal pour le rendu visuel. |
| 323 | + - `NEAREST` est recommandé pour les traitements analytiques afin de préserver l'intégrité des données. |
| 324 | + |
| 325 | +En suivant ces bonnes pratiques, vous assurerez une génération efficace de COG, améliorant ainsi la manipulation et la visualisation de vos données spatiales quel que soit votre environnement. |
| 326 | + |
| 327 | +Si vous souhaitez apporter votre expertise aux bonnes pratiques et astuces de GDAL et du COG, n'hésitez pas à contribuer à ce dépôt <https://github.com/geo2france/cog-tips>. Merci à [Benjamin Chartier](../../team/benjamin-chartier.md "Profil de Benjamin Chartier") pour avoir proposé les commandes Windows. |
| 328 | + |
| 329 | +## Affichage dans QGIS |
| 330 | + |
| 331 | +{: .img-thumbnail-left } |
| 332 | + |
| 333 | +Le format COG présente de nombreux avantages en termes de performance à l'affichage et, à l'instar de n'importe quel raster, il se consulte parfaitement dans QGIS. |
| 334 | + |
| 335 | +S'il est disponible en flux WMS ou WMTS, c'est transparent pour vous, vous ne saurez pas que vous chargez un COG. NDLR : nous avons remarqué, sur Geo2France, une meilleure performance dans les temps de réponse de flux en utilisant une mosaique COG. Cela évite de devoir générer du cache tuilé consommateur d'espace disque (utile pour la sobriété numérique). |
| 336 | + |
| 337 | +Un COG peut être publié via un simple serveur web HTTP(S), sans brique logicielle additionnelle comme MapServer, GeoServer ou QGIS Server. Il est disponible via une simple URL. |
| 338 | + |
| 339 | +Pour le charger dans QGIS, rendez-vous dans le menu _Raster_ , choisissez _"Protocole HTTP(S), cloud, etc."_ et coller l'URL dans le champ `URI` : |
| 340 | + |
| 341 | +{: .img-center loading=lazy } |
| 342 | + |
| 343 | +Envie de tester ? Collez l'URL suivante dans QGIS et chargez l'orthophoto IGN 2021 sur la région Hauts-de-France (~242.6 Go en quelques secondes :smile:) : |
| 344 | + |
| 345 | +```txt |
| 346 | +https://geo2france.fr/public/cog/ortho/2021_R32_Ortho_0m20_RVB_COG.tif |
| 347 | +``` |
| 348 | + |
| 349 | +Voici ce que cela donne dans QGIS : |
| 350 | + |
| 351 | +<video width="100%" controls> |
| 352 | + <!-- markdownlint-disable MD033 --> |
| 353 | + <source src="https://cdn.geotribu.fr/img/articles-blog-rdp/articles/2025/raster_cog_gdal/qgis_cog_live.webm" type="video/webm"> |
| 354 | + Votre navigateur ne supporte pas la balise video HTML 5. |
| 355 | + <!-- markdownlint-enable MD033 --> |
| 356 | +</video> |
| 357 | + |
| 358 | +## Affichage dans des clients Web |
| 359 | + |
| 360 | +Le format COG offre une intégration optimale avec vos clients web préférés. Pour l'intégrer, il faudra consulter la documentation détaillée du projet qui vous fournira le code adapté. |
| 361 | +Pour vous inspirer, voici quelques liens vers de la documentation et des démonstrateurs : |
| 362 | + |
| 363 | +- Les COG dans OpenLayers : [documentation et démo](https://openlayers.org/en/latest/examples/cog.html) |
| 364 | +- Les COG dans MapLibre : [documentation](https://github.com/geomatico/maplibre-cog-protocol?tab=readme-ov-file) et [démo](https://labs.geomatico.es/maplibre-cog-protocol/dem.html) |
| 365 | +- Les COG dans Cesium : [documentation](https://github.com/hongfaqiu/TIFFImageryProvider) et [démo](https://tiff-imagery-provider.opendde.com/?panel=layer) |
| 366 | +- Les COG dans Giro3D : [documentation](https://giro3d.org/latest/apidoc/classes/sources.GeoTIFFSource.html), [démo](https://giro3d.org/latest/examples/cog_color.html) et [démo](https://giro3d.org/latest/examples/cog_elevation.html) |
| 367 | + |
| 368 | +## Affichage dans ArcGIS Pro |
| 369 | + |
| 370 | +Le COG est supporté dans ArcGIS Pro d'après cette [documentation](https://pro.arcgis.com/en/pro-app/latest/help/data/imagery/supported-raster-dataset-file-formats.htm) ... |
| 371 | +... mais pas (encore ?) dans ArcGIS Online ([source](https://community.esri.com/t5/arcgis-pro-ideas/support-cloud-optimized-geotiff-cog-across-the/idi-p/938786)) |
| 372 | + |
| 373 | +---- |
| 374 | + |
| 375 | +<!-- geotribu:authors-block --> |
| 376 | + |
| 377 | +{% include "licenses/default.md" %} |
0 commit comments