Makina Blog

Le blog Makina-corpus

Protomaps, stockez vos pyramides de tuiles plus simplement


Présentation d'un nouveau format de stockage de tuiles cartographiques

Sommaire

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

Formations associées

Formations SIG / Cartographie

Formation Tuiles vectorielles

À distance (FOAD) Du 3 au 4 juin 2024

Voir la formation

Formations SIG / Cartographie

Formation MapLibre

Toulouse Du 17 au 18 octobre 2023

Voir la formation

Formations SIG / Cartographie

Formation QGIS

Nantes Du 2 au 4 avril 2024

Voir la formation

Actualités en lien

Image
Article : Servir sa couche raster QGIS en tuiles sans effort avec le format PMTiles
25/01/2024

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.

Voir l'article
Image
vignettes sig mettre en place des tuile vectorielles
20/11/2018

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 ?

Voir l'article
Image
cartes-historiques-tilemill
06/11/2013

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.

Voir l'article

Inscription à la newsletter

Nous vous avons convaincus