Makina Blog
Protomaps, stockez vos pyramides de tuiles plus simplement
Présentation d'un nouveau format de stockage de tuiles cartographiques
Si vous suivez l'actualité de la cartographie web, vous avez peut-être entendu parler d'un nouveau format révolutionnaire pour le stockage des tuiles : Protomaps. Nous allons tenter de vous expliquer son fonctionnement et les usages que nous lui voyons déjà.
Traditionnellement, une pyramide de tuiles
Le plus souvent aujourd'hui, pour présenter une carte dans un navigateur web, nous juxtaposons les unes aux autres des tuiles. Les tuiles correspondent à une zone carrée de 256 pixels de côté. Collées les unes aux autres, les tuiles permettent d'afficher une carte de n'importe quelle taille, à différents niveaux de zoom. Le navigateur web doit donc avant tout télécharger une à une les tuiles nécessaires.
Pour chaque tuile, le navigateur exécute donc une requête HTTP(S) avec les coordonnées de la tuile :
https://makinamaps.makina-corpus.net/tuiles/{Z}/{X}/{Y}.png
Le serveur peut répondre avec…
- Le résultat d'un traitement : requête à une base de données puis génération d'une image ou de données vectorielles
- Le contenu d'un cache : créé au moment d'une précédente requête identique
Ces deux premiers cas sont adaptés à des données qui changent souvent, ou bien couvrent une zone suffisamment étendue pour que (pré)générer l'ensemble des tuiles requiert un espace disque trop important. Cela nécessite ce qu'on appelle habituellement une "stack carto" complète, c'est à dire plusieurs applicatifs pour la base de données, les traitements à effectuer et la mise à disposition des tuiles.
Ou bien avec…
- Le résultat d'une requête de base de données : lorsque ce résultat est déjà une image ou des données vectorielles (mbtiles)
- Un simple fichier, image ou `pbf`, stocké sur le disque dur.
./Z/X/Y.jpg
Ces deux solutions sont généralement préférées lorsque les données vont peu ou pas changer, et/ou que la zone géographique à stocker reste raisonnable.
Dans le premier cas, nous hébergeons un simple fichier mbtiles
(qui est, techniquement, une base SQLite) et un applicatif léger/simple qui à chaque requête Z/X/Y depuis un navigateur, va interroger la base et renvoyer le résultat au navigateur.
Dans le second, à chaque requête depuis le navigateur, le serveur va simplement renvoyer le fichier correspondant : jpg, png, pbf, … Côté serveur, on n'a besoin de rien d'autre qu'un simple serveur HTTP.
Mais, si la surface à représenter est importante, cela fait beauuucoup de fichiers :
Représenter la terre entière implique la mise à disposition de plus de 366 milliards de fichiers : cumul des zooms 1 à 19. Le niveau de zoom 20 nécessiterait 4²⁰ tuiles, soit mille milliards, à lui tout seul.
Protomaps
Avec Protomaps, toutes les tuiles sont stockées dans un unique fichier !
Pour chaque tuile à afficher / télécharger, le navigateur appelle donc la même adresse :
https://makinamaps.makina-corpus.net/tuiles.pmtiles
Mais comment savoir quelle tuile envoyer ?
Le navigateur doit envoyer chaque requête de tuile en précisant au serveur quelle partie du fichier il souhaite obtenir, grâce à l'en-tête HTTP Range. Cette portion du fichier est alors tout simplement l'équivalent d'un fichier image ou d'un fichier pbf contenant les données d'une tuile unique.
Les bibliothèques d'affichage de cartes comme MapLibreGL, Leaflet ou OpenLayers ne savent initialement pas comment formuler cette entête Range, mais il est très simple de leur indiquer comment grâce à un complément JavaScript dédié.
Au sein du fichier pmtiles, les données sont organisées de manière à optimiser le temps d'accès.
Tout devient simple, basique
- Côté serveur, il n'y a alors besoin de rien d'autre qu'un simple serveur HTTP (Nginx, Apache, S3…), ou n'importe quel hébergement de fichiers statiques capable d’interpréter les entêtes Range.
- Pour chaque jeu de tuiles, plutôt qu'une arborescence de plusieurs milliers, millions ou milliards de fichiers, un unique fichier .pmtiles contient toute notre pyramide de tuiles.
- La conversion de mbtiles vers pmtiles est très simple.
Donc tous les flux de production de tuiles, fichiers ou mbtiles, peuvent très simplement aboutir à un pmtiles. - L'outillage disponible permet de travailler aussi bien en local qu'avec un serveur.
Les usages
Protomaps trouve sa place partout où l'on souhaite mettre à disposition un ensemble de données cartographiques vectorielles ou images en évitant le déploiement et l'hébergement d'une stack SIG. Nous économisons donc en terme de moyens - techniques, technologiques, énergétiques, etc. - à mettre en œuvre et donc également en coûts d'hébergement.
À Makina Corpus, nous avons par exemple mis en place Protomaps pour les tuiles de cartes historiques de Toulouse : tolosa1680.makina-corpus.com et tolosa.makina-corpus.com ainsi que pour dessine-moi-une-ville.makina-corpus.net. Cela nous permet de proposer simplement ces fonds de cartes tuilés, hébergés sur un simple serveur de contenus statiques.
Nous avons aussi récemment utilisé Protomaps sur le site Drupal d'un de nos clients : Il fallait afficher des logements à louer dans la région de Toulouse.
Pour disposer des ces données sous forme de tuiles vectorielles, il a suffit de déposer un fichier pmtiles sur le serveur. Le site étant déjà servi par Nginx, il n'y a rien eu de plus à ajouter. C'est utilisable directement.
Plus simplement, lorsqu'un site vitrine, par exemple d'un commerce, souhaite afficher un plan "local" (rue, quartier, villes, alentours), produire un fond de plan et le servir sous forme d'un fichier pmtiles permet de ne dépendre d'aucun service externe.
La dernière version de la spécification de Protomaps est relativement récente (v3 fin 2022, v3.4 fin 2023), mais semble suffisamment robuste et utile pour une utilisation en production.
Ce format rend un service important lorsqu'il s'agit de mettre en œuvre un fond tuilé ou des données vectorielles sur un carte à afficher dans un navigateur web.
Nous vous encourageons à expérimenter aussi bien la production de fichiers pmtiles que leur exploitation. Si vous avez des jeux de tuiles stockés en mbtiles et servis grâce à TileServer, Openmaptiles ou bien par un service comme Mapbox ou MapTiler, essayez de convertir votre fichier en pmtiles (pmtiles convert tileset.mbtiles tileset.pmtiles) !
On allait oublier de préciser, même si c'est presque une évidence : la spécification et les implémentations sont libres et open source.
Liens utiles
- Le site officiel protomaps.com et docs.protomaps.com
- L'outil protomaps.github.io/PMTiles : visualiser rapidement le contenu d'un fichier pmtiles, local ou distant.
- L'outil Tippecanoe : produire une pyramide de tuiles notamment en pmtiles à partir de diverses données vectorielles
- Le paquet JavaScript npmjs.com/package/pmtiles avec l'outillage pour MapLibre GL JS
Formations associées
Formations SIG / Cartographie
Formation Tuiles vectorielles
À distance (FOAD) Du 3 au 4 juin 2025
Voir la formationFormations SIG / Cartographie
Formation MapLibre
Aucune session de formation n'est prévue pour le moment.
Pour plus d'informations, n'hésitez pas à nous contacter.
Voir la formationFormations SIG / Cartographie
Formation QGIS
À distance (FOAD) Du 2 au 6 décembre 2024
Voir la formationActualités en lien
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.
SIG : Mettre en place des tuiles vectorielles
Pour les données images « rasters » comme pour les données vectorielles, des techniques de découpage appelées « tuiles » permettent d’améliorer les performances et la flexibilité de l’affichage. Cet article présente : comment créer et afficher des tuiles vectorielles ?
Cartes historiques de Toulouse avec TileMill
Présentation des outils et techniques utilisés pour représenter des données cartographiques historiques avec un style de l'époque.