Makina Blog

Le blog Makina-corpus

Servir sa couche raster QGIS en tuiles sans effort avec le format PMTiles


Cet article vous présente une approche permet­tant de tuiler et de publier une couche raster fabriquée avec QGIS.

Sommaire

Le format PMTiles est un format pour embarquer dans un fichier unique une pyra­mide de tuiles rasters ou vecto­rielles. Dans cet article, nous allons trans­for­mer une couche raster réali­sée avec QGIS en une pyra­mide de tuiles au format PMTiles que nous servi­rons avec un service de type S3.

À la fin de cet article, vous aurez mis en ligne votre couche raster et vous pour­rez l’in­té­grer avec votre outil de carto­gra­phie web favori : Leaflet, MapLibre, etc.

Voici le résul­tat avec un raster qui affiche la densité des nœuds OSM sur le terri­toire belge :

 

Pour savoir comment créer ce raster, suivez ce tuto­riel pas à pas : Fabriquer un raster de densité à partir d’un nuage de points avec Post­GIS.

Pour suivre cet article, vous aurez besoin d’ins­tal­la­tions de QGIS et de GDAL fonc­tion­nelles.

Pourquoi PMTiles ?

Le format PMTiles offre une distri­bu­tion de données géogra­phiques (SIG) facile : il est « très très bon marché » à servir. En effet, pour peu que vous ayez accès à un serveur web suppor­tant les HTTP Range request – c’est notam­ment le cas de certaines offres S3 – l’hé­ber­ge­ment de ces données se résume à servir un seul et unique fichier.

Par rapport aux approches tradi­tion­nelles qui impliquent de faire tour­ner un serveur de tuiles ou de passer par un service tiers pour servir un MBTiles – Mapbox, MapTi­ler, etc. – dans notre cas présent, vous ne payez que la bande passante et le stockage.

 

Méthode

Dans un premier temps, nous allons expor­ter la couche QGIS en GeoTIFF. Ensuite, il s’agit de géné­rer la pyra­mide de tuiles avec l’ou­til gdal2­tiles.

Nous fabrique­rons un MBTiles avec mb-util un outil de Mapbox, puis nous analy­se­rons le fichier MBTiles avec l’ou­til éponyme mbtiles de MapLibre.

Enfin, nous fabrique­rons le PMTiles avec l’ou­til offi­ciel de Proto­maps que nous uploa­de­rons sur un bucket S3 à l’aide de l’ou­til mcli.

 

Schéma du processus de fabrication du pmtiles
Schéma de l’ap­proche que nous allons suivre

 

Cet article a été écrit pour un système Linux, les outils utili­sés devraient être tous dispo­nibles sur Windows, mais vous devrez proba­ble­ment adap­ter les commandes.

1. Instal­la­tion des outils

1. Instal­lez mb-util via pip. De mon côté, je me suis fait un envi­ron­ne­ment virtuel Python et j’ai installé le paquet ainsi :

cd <dossier de travail>
python -m venv venv # On crée le venv
. ./venv/bin/activate # On active le venv
pip install mbutil # On install mb-util dans le venv

2. Télé­char­gez la release qui corres­pond à votre système depuis le GitHub de martin. Extra­yez la release dans votre dossier de travail. Seul l’ou­til mbtiles nous inté­resse.

Voici les commandes que j’ai tapé pour réali­ser cette opéra­tion :

wget https://github.com/maplibre/martin/releases/download/v0.13.0/martin-x86_64-unknown-linux-gnu.tar.gz # On télécharge la release 0.13.0
tar xf martin-x86_64-unknown-linux-gnu.tar.gz # On extrait l'archive
./mbtiles --version # On lance l'outil mbtiles

La dernière commande me renvoie :

mbtiles 0.9.1

3. Pour l’ou­til pmtiles, l’ap­proche est la même : nous allons télé­char­ger une release depuis le projet GitHub et nous utili­se­rons direc­te­ment le binaire.

wget https://github.com/protomaps/go-pmtiles/releases/download/v1.11.3/go-pmtiles_1.11.3_Linux_x86_64.tar.gz # On télécharge la release 1.11.3 de pmtiles
tar xf go-pmtiles_1.11.3_Linux_x86_64.tar.gz # On extrait la release
./pmtiles version # On affiche la version

La dernière commande me renvoie la sortie suivante :

pmtiles 1.11.3, commit 65e46f9237f64a3185190b99eef7d5ab3603aeb1, built at 2023-12-28T09:10:51Z

 

Option­nel : instal­la­tion d’un client S3 en ligne de commande

Si votre four­nis­seur S3 ne propose pas d’in­ter­face graphique pour mettre en ligne des fichiers, vous pouvez utili­ser "minio client". Réfé­rez-vous aux instruc­tions d’ins­tal­la­tion de la docu­men­ta­tion offi­cielle.

 

2. Export de la couche QGIS

J’ai chargé et stylé la couche raster suivante dans QGIS, ici il s’agit d’une table dans Post­GIS :

Entiereté de la couche raster
Le raster que nous allons tuiler couvre l’en­semble de la Belgique

 

 

Zoom proche des données raster
Zoom sur le raster

Le raster de base est en niveau de gris, et j’ai utilisé les outils de QGIS pour lui donner de la couleur afin de réali­ser une sorte de carte de chaleur. Expor­tons ce raster en GeoTIFF.

Faîtes un clic droit sur le nom de votre couche, et sélec­tion­nez «  Export > Save As  ».

Dans le menu qui s’ouvre acti­vez le mode de sortie «  Rende­red Image  » afin d’ex­por­ter votre raster colo­risé.

Choi­sis­sez la projec­tion «  WGS84 / Pseudo-Merca­tor  » – EPSG 3857 – puis sélec­tion­nez le fichier de sortie.

Capture d'écran de la configuration d'export en Geotiff de QGIS
Capture d’écran de la confi­gu­ra­tion d’ex­port en GeoTIFF de QGIS

3. Fabri­ca­tion de la pyra­mide de tuile

Main­te­nant, nous allons tuiler notre GeoTIFF pour les zoom 1 à 10 à l’aide d’un outil de la suite GDAL. Pour cela, exécu­tez la commande suivante :

. ./venv/bin/activate # On active le venv
gdal2tiles.py --zoom 1-10 <fichier>.tif # tuilage du geotif

Vous devriez obte­nir un dossier portant le nom de votre fichier et conte­nant les tuiles pour les diffé­rents niveaux de zoom.

Pour para­mé­trer le format des tuiles JPG, PNG, WEBP ou le taux de compres­sion des tuiles, réfé­rez-vous à la doc de gdal2­tiles.

Main­te­nant, nous allons assem­bler ces tuiles indi­vi­duelles en un fichier MBTiles.

4. Fabri­ca­tion du fichier MBTiles

Pour assem­bler le MBTiles, nous utili­sons l’ou­til mbutils, exécu­tez la commande suivante :

mb-util --scheme=tms <nom de votre dossier>/ article.mbtiles # assemblage du mbtiles

 

5. Analyse du fichier MBTiles

Afin de véri­fier que notre MBTiles contient bien tous nos niveaux de zoom, nous utili­sons un outil de la suite logi­cielle martin.

Exécu­tez la commande suivante :

./mbtiles summary article.mbtiles # analyse du mbtiles

J’ob­tiens la sortie suivante :

MBTiles file summary for article.mbtiles
Schema: flat
File size: 6.21MiB
Page size: 4.00KiB
Page count: 1592

 Zoom |   Count   | Smallest  |  Largest  |  Average  | Bounding Box
    1 |         1 |      528B |      528B |      528B | 0,0,180,85
    2 |         1 |      725B |      725B |      725B | 0,0,90,67
    3 |         1 |    1.2KiB |    1.2KiB |    1.2KiB | 0,41,45,67
    4 |         1 |    2.9KiB |    2.9KiB |    2.9KiB | 0,41,22,56
    5 |         1 |    8.5KiB |    8.5KiB |    8.5KiB | 0,49,11,56
    6 |         2 |    5.7KiB |   22.7KiB |   14.2KiB | 0,49,11,52
    7 |         6 |    1.4KiB |   42.7KiB |   16.5KiB | 0,49,8,52
    8 |        16 |      572B |   89.7KiB |   22.3KiB | 1,49,7,52
    9 |        56 |      430B |  121.3KiB |   23.2KiB | 1,49,7,52
   10 |       180 |      334B |  122.3KiB |   24.4KiB | 2,49,7,52
  all |       265 |      334B |  122.3KiB |   23.3KiB | 0,0,180,85

6. Fabri­ca­tion du fichier PMTiles

Pour fabriquer le PMTiles, rien de plus simple. Tapez la commande suivante :

./pmtiles convert article.mbtiles article.pmtiles # conversion du mbtiles en pmtiles

7. Upload du fichier PMTiles sur un S3

Il ne nous reste plus qu’à envoyer le PMTiles sur un stockage S3 suppor­tant les HTTP Range Request (atten­tion, ce n’est pas le cas du service Object Storage d’OVH).

Je vais utili­ser le service «  Object Storage  » de chez Scale­way.

Avec une inter­face graphique

Navi­guez vers «  Object Storage  » :

Capture d'écran du menu de navigation de scaleway

 

Dans l’in­ter­face suivante, choi­sis­sez un bucket :

Capture d'écran du menu de gestion des bucket S3 de scaleway

Enfin, cliquez sur le bouton upload pour envoyez votre fichier :

Capture d'écran du menu de gestion des fichiers d'un bucket S3 de scaleway

En ligne de commande avec minio-client

Commen­cez par confi­gu­rer votre alias S3 avec la commande suivante :

mc alias set pmtiles https://s3.mon_provider.cloud <ACCESS_KEY> <SECRET_KEY> # ajout d'un alias avec minio client

Vous pouvez main­te­nant uploa­der votre fichier ainsi :

mc cp ./article.pmtiles pmtiles/ # upload du fichier pmtiles avec minio-client

 

Conclu­sion

Et voilà, si vous avez suivi cet article jusqu’au bout, vous avez réussi à tuiler et mettre en ligne votre donnée raster. Il ne vous reste plus qu’à réali­ser l’in­té­gra­tion dans une page web à l’aide d’une librai­rie JavaS­cript !

Par exemple, pour utili­ser cette source de données avec Leaflet, vous pouvez regar­der du côté de PMTiles for Leaflet. L’URL de la source de données est à géné­rer avec votre four­nis­seur S3 :

  • Soit le bucket est public et vous pouvez utili­ser le lien de la ressource
  • Soit le bucket est privé et vous devez géné­rer un lien d’ac­cès.

Vous pouvez aussi regar­der le code source de cet article pour avoir un exemple de code JS/HTML permet­tant de faire une telle carte (via les devtools de votre navi­ga­teur, f12 sur fire­fox).

Formations associées

Formations SIG / Cartographie

Formation QGIS

À distance (FOAD) Du 2 au 6 décembre 2024

Voir la formation

Formations SIG / Cartographie

Formation Leaflet

Toulouse Du 4 au 5 décembre 2024

Voir la formation

Formations SIG / Cartographie

Formation Développer avec l'écosystème d'OpenStreetMap

Aucune session de formation n'est prévue pour le moment.

Pour plus d'informations, n'hésitez pas à nous contacter.

Voir la formation

Actualités en lien

Image
carte bitmap-vectorielle
12/05/2021

Tour d’horizon des serveurs de tuiles vectorielles pour fond de carte

Parcours des différentes étapes et composants de piles logicielles existantes pour la production de tuiles vectorielles.

Voir l'article
Image
SIG_QGIS_tuiles
20/07/2020

QGIS : le nouveau support des tuiles rasters et vectorielles

La dernière version de QGIS 3.14 apporte deux nouveaux types de calques : les tuiles rasters et les tuiles vectorielles.

Voir l'article
Image
SIG_tuiles_vecto
03/07/2020

Web mapping : comparaison des serveurs de tuiles vectorielles depuis Postgres / PostGIS

Un ensemble de serveurs de tuiles vectorielles basés sur la fonction ST_AsMVT() de PostGIS sont disponibles. Makina Corpus vous propose un tour d’horizon des spécificités des différentes solutions.

Voir l'article

Inscription à la newsletter

Nous vous avons convaincus