Makina Blog
Servir sa couche raster QGIS en tuiles sans effort avec le format PMTiles
Cet article vous présente une approche permettant de tuiler et de publier une couche raster fabriquée avec QGIS.
Le format PMTiles est un format pour embarquer dans un fichier unique une pyramide de tuiles rasters ou vectorielles. Dans cet article, nous allons transformer une couche raster réalisée avec QGIS en une pyramide de tuiles au format PMTiles que nous servirons avec un service de type S3.
À la fin de cet article, vous aurez mis en ligne votre couche raster et vous pourrez l’intégrer avec votre outil de cartographie web favori : Leaflet, MapLibre, etc.
Voici le résultat avec un raster qui affiche la densité des nœuds OSM sur le territoire belge :
Pour savoir comment créer ce raster, suivez ce tutoriel pas à pas : Fabriquer un raster de densité à partir d’un nuage de points avec PostGIS.
Pour suivre cet article, vous aurez besoin d’installations de QGIS et de GDAL fonctionnelles.
Pourquoi PMTiles ?
Le format PMTiles offre une distribution de données géographiques (SIG) facile : il est « très très bon marché » à servir. En effet, pour peu que vous ayez accès à un serveur web supportant les HTTP Range request – c’est notamment le cas de certaines offres S3 – l’hébergement de ces données se résume à servir un seul et unique fichier.
Par rapport aux approches traditionnelles qui impliquent de faire tourner un serveur de tuiles ou de passer par un service tiers pour servir un MBTiles – Mapbox, MapTiler, etc. – dans notre cas présent, vous ne payez que la bande passante et le stockage.
Méthode
Dans un premier temps, nous allons exporter la couche QGIS en GeoTIFF. Ensuite, il s’agit de générer la pyramide de tuiles avec l’outil gdal2tiles.
Nous fabriquerons un MBTiles avec mb-util un outil de Mapbox, puis nous analyserons le fichier MBTiles avec l’outil éponyme mbtiles de MapLibre.
Enfin, nous fabriquerons le PMTiles avec l’outil officiel de Protomaps que nous uploaderons sur un bucket S3 à l’aide de l’outil mcli.
Cet article a été écrit pour un système Linux, les outils utilisés devraient être tous disponibles sur Windows, mais vous devrez probablement adapter les commandes.
1. Installation des outils
1. Installez mb-util via pip. De mon côté, je me suis fait un environnement 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échargez la release qui correspond à votre système depuis le GitHub de martin. Extrayez la release dans votre dossier de travail. Seul l’outil mbtiles nous intéresse.
Voici les commandes que j’ai tapé pour réaliser cette opération :
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’outil pmtiles, l’approche est la même : nous allons télécharger une release depuis le projet GitHub et nous utiliserons directement 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
Optionnel : installation d’un client S3 en ligne de commande
Si votre fournisseur S3 ne propose pas d’interface graphique pour mettre en ligne des fichiers, vous pouvez utiliser "minio client". Référez-vous aux instructions d’installation de la documentation officielle.
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 PostGIS :
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éaliser une sorte de carte de chaleur. Exportons ce raster en GeoTIFF.
Faîtes un clic droit sur le nom de votre couche, et sélectionnez « Export > Save As ».
Dans le menu qui s’ouvre activez le mode de sortie « Rendered Image » afin d’exporter votre raster colorisé.
Choisissez la projection « WGS84 / Pseudo-Mercator » – EPSG 3857 – puis sélectionnez le fichier de sortie.
3. Fabrication de la pyramide de tuile
Maintenant, nous allons tuiler notre GeoTIFF pour les zoom 1 à 10 à l’aide d’un outil de la suite GDAL. Pour cela, exécutez la commande suivante :
. ./venv/bin/activate # On active le venv
gdal2tiles.py --zoom 1-10 <fichier>.tif # tuilage du geotif
Vous devriez obtenir un dossier portant le nom de votre fichier et contenant les tuiles pour les différents niveaux de zoom.
Pour paramétrer le format des tuiles JPG, PNG, WEBP ou le taux de compression des tuiles, référez-vous à la doc de gdal2tiles.
Maintenant, nous allons assembler ces tuiles individuelles en un fichier MBTiles.
4. Fabrication du fichier MBTiles
Pour assembler le MBTiles, nous utilisons l’outil mbutils, exécutez la commande suivante :
mb-util --scheme=tms <nom de votre dossier>/ article.mbtiles # assemblage du mbtiles
5. Analyse du fichier MBTiles
Afin de vérifier que notre MBTiles contient bien tous nos niveaux de zoom, nous utilisons un outil de la suite logicielle martin.
Exécutez la commande suivante :
./mbtiles summary article.mbtiles # analyse du mbtiles
J’obtiens 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. Fabrication 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 supportant les HTTP Range Request (attention, ce n’est pas le cas du service Object Storage d’OVH).
Je vais utiliser le service « Object Storage » de chez Scaleway.
Avec une interface graphique
Naviguez vers « Object Storage » :
Dans l’interface suivante, choisissez un bucket :
Enfin, cliquez sur le bouton upload pour envoyez votre fichier :
En ligne de commande avec minio-client
Commencez par configurer 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 maintenant uploader votre fichier ainsi :
mc cp ./article.pmtiles pmtiles/ # upload du fichier pmtiles avec minio-client
Conclusion
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éaliser l’intégration dans une page web à l’aide d’une librairie JavaScript !
Par exemple, pour utiliser cette source de données avec Leaflet, vous pouvez regarder du côté de PMTiles for Leaflet. L’URL de la source de données est à générer avec votre fournisseur S3 :
- Soit le bucket est public et vous pouvez utiliser le lien de la ressource
- Soit le bucket est privé et vous devez générer un lien d’accès.
Vous pouvez aussi regarder le code source de cet article pour avoir un exemple de code JS/HTML permettant de faire une telle carte (via les devtools de votre navigateur, f12 sur firefox).
Formations associées
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 formationActualités en lien
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.
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.
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.