Guide pratique

PMTiles ou MBTiles, et où poser ses tuiles pour qu'elles coûtent peu

MBTiles range des tuiles dans une base SQLite qu'un serveur de tuiles lit pour vous. PMTiles les range dans un seul fichier que le navigateur lit lui-même, morceau par morceau, par des requêtes HTTP Range sur un stockage objet. Pour publier un fond de carte ou une couche sur un site, prenez PMTiles sur un stockage objet sans frais de sortie, avec un CDN devant. Gardez MBTiles quand un serveur doit de toute façon tourner : rendu raster côté serveur, tuiles produites depuis PostGIS, clients qui n'acceptent qu'une URL {z}/{x}/{y}.

Par Lucas Tesnier, co-fondateur de La Trace · Publié le 27 septembre 2026 · Lecture 10 minutes

  • 138 Gol'archive PMTiles du monde entier, zooms 0 à 15, build du 27 septembre 2026Mesure La Trace sur le build quotidien Protomaps, 27/09/2026
  • 33 Mola même carte découpée sur la Chartreuse, 3 058 tuiles, 71 requêtesMesure La Trace, pmtiles extract 1.31.2, 27/09/2026
  • 0 $de frais de sortie sur Cloudflare R2, contre 0,09 $ le Go sur AWS S3 à ParisGrilles officielles R2 et AWS, consultées le 27/09/2026

L'essentiel

  • PMTiles se sert sans serveur de tuiles : un fichier, un stockage objet qui accepte les requêtes Range, un en-tête CORS.
  • MBTiles demande un serveur (tileserver-gl, Martin), et reste le bon choix quand ce serveur fait autre chose que lire des tuiles.
  • pmtiles convert passe de l'un à l'autre, pmtiles extract découpe votre zone dans l'archive mondiale.
  • Le poste qui coûte, ce n'est pas le stockage : ce sont les frais de sortie et le nombre de requêtes.
  • Les données OpenStreetMap sont sous ODbL : l'attribution est une obligation, pas une politesse.

PMTiles ou MBTiles : deux façons de ranger les mêmes tuiles

Le 27 septembre 2026, nous avons ouvert le build quotidien de Protomaps : un fichier de 138 356 870 873 octets, le monde entier du zoom 0 au zoom 15. Son en-tête annonce 1 431 655 765 tuiles adressées, mais seulement 136 millions de contenus distincts. Les océans se ressemblent, le format ne les stocke qu'une fois.

Les deux formats rangent des tuiles vectorielles ou raster identiques. Ce qui change, c'est qui les lit.

MBTiles est une base SQLite. La spécification 1.3 de Mapbox impose deux tables, metadata et tiles, indexées sur le zoom, la colonne et la ligne. Un fichier MBTiles ne se lit pas depuis un navigateur : il faut un programme qui ouvre la base et répond à chaque URL de tuile.

PMTiles est une archive à plat. La spécification version 3 place au début un en-tête fixe de 127 octets, puis un répertoire racine qui doit tenir dans les 16 384 premiers octets. Les tuiles sont numérotées le long d'une courbe de Hilbert, ce qui garde voisines dans le fichier les tuiles voisines sur la carte. Le navigateur lit l'en-tête, trouve l'adresse de la tuile, et demande seulement ces octets-là.

Notre avis : pour une carte publiée sur un site, PMTiles. Un fichier sur un stockage objet ne tombe pas en panne à trois heures du matin.

Ce qu'un navigateur télécharge vraiment

Nous avons mesuré, le 27 septembre 2026 à 19 h, avec la bibliothèque pmtiles 4.5.0 en Node, ce que coûte l'affichage de la Chartreuse depuis l'archive mondiale de 138 Go.

ÉtapeRequêtesOctets transférésTemps mesuré
En-tête et répertoire racine116 3840,62 s
Première tuile au zoom 14 (Saint-Pierre-de-Chartreuse)2122 356 de répertoire + 14 672 de tuile0,83 s
Tuile voisine au zoom 1415 809 à 8 6570,41 à 0,46 s
Première tuile au zoom 102134 953 + 155 6300,97 s

La première tuile d'un quartier coûte deux requêtes : un répertoire de feuille d'environ 120 Ko, puis la tuile. Les voisines n'en coûtent plus qu'une, parce que le répertoire est gardé en mémoire et que la courbe de Hilbert les a rangées dans la même feuille. Sur 138 Go, le navigateur en a lu moins de 300 Ko.

La limite de la mesure : ces temps sont pris sans CDN, depuis une connexion française, sur le bucket public de Protomaps. Avec un cache en bordure, les requêtes suivantes descendent à quelques dizaines de millisecondes. Nous n'avons pas de mesure publique à citer pour ce cas.

Le piège de la compression automatique

Certains serveurs web et certains CDN compressent à la volée les fichiers qu'ils servent. Une plage d'octets calculée sur le fichier d'origine ne correspond plus à ce qui arrive, et le lecteur PMTiles reçoit autre chose que ce qu'il attend. Vérifiez qu'une requête Range: bytes=0-16383 revient en 206 Partial Content avec un Content-Range exact, sans Content-Encoding. Les tuiles de l'archive sont déjà compressées à l'intérieur : les recompresser ne fait rien gagner.

Quand MBTiles et un serveur de tuiles restent le bon choix

Un serveur de tuiles se justifie quand il fait plus que lire un fichier. Trois cas reviennent.

  • Le rendu raster côté serveur. tileserver-gl, publié par MapTiler (version 5.6.0 en avril 2026), dessine des images PNG à partir de tuiles vectorielles et d'un style, avec MapLibre Native. Utile pour un client qui n'affiche que des images, un export PDF, un WMTS pour un logiciel SIG. Sa configuration accepte une source mbtiles comme une source pmtiles, locale, en URL ou en chemin S3.
  • Des tuiles fabriquées depuis la base. Martin, projet MapLibre écrit en Rust (version 1.16.1 le 9 septembre 2026), génère des tuiles à la volée depuis des tables PostGIS et sert aussi des fichiers PMTiles et MBTiles. Si vos sentiers changent chaque semaine dans PostGIS, c'est plus simple que de reconstruire une archive.
  • Une URL {z}/{x}/{y} imposée. Une appli native ancienne, un logiciel SIG : sans lecteur PMTiles, il leur faut des URL de tuiles classiques. pmtiles serve le fait aussi, et Protomaps publie un Worker Cloudflare qui expose une archive R2 en {z}/{x}/{y}.

Un détail de la spécification MBTiles qui coûte des heures : la colonne tile_row suit le schéma TMS, où l'axe vertical est inversé par rapport aux URL XYZ. La spécification donne l'exemple de la tuile 11/327/791 en XYZ, rangée en ligne 1256, soit 2^11 - 1 - 791. Un script maison qui lit la base sans ce calcul affiche la carte à l'envers, par bandes.

Servir un MBTiles ou un PMTiles avec un serveur

# tileserver-gl, avec rendu raster
docker run --rm -it -v $(pwd):/data -p 8080:8080 maptiler/tileserver-gl:latest --file chartreuse.mbtiles

# Martin, sert les fichiers comme les tables PostGIS
docker run --rm -p 3000:3000 -v $(pwd):/data ghcr.io/maplibre/martin /data/chartreuse.pmtiles

À emporter : la checklist de mise en production d'une carte web

Recevoir la checklist

Convertir, découper, publier : la méthode

Nous avons fait l'exercice le 27 septembre 2026 avec la ligne de commande pmtiles 1.31.2, un binaire unique sans dépendance, sur l'emprise de la Chartreuse (longitude 5,60 à 6,05, latitude 45,15 à 45,55). L'extraction a lu 35 Mo dans l'archive distante en 71 requêtes et 15 secondes, pour un fichier de 33 Mo.

  1. 1

    Partir de la bonne archive

    Soit vous avez déjà un MBTiles (produit par tippecanoe, planetiler ou un fournisseur), soit vous partez d'une archive mondiale PMTiles. Protomaps publie un build quotidien de la planète et garde les builds de la dernière semaine. Ne liez jamais votre site directement à ces fichiers : la documentation prévient que leurs URL changent.

  2. 2

    Convertir un MBTiles

    pmtiles convert entree.mbtiles sortie.pmtiles. La commande déduplique les tuiles identiques ; l'option --no-deduplication accélère la conversion quand vous savez qu'il n'y en a pas.

  3. 3

    Découper votre zone

    pmtiles extract prend une emprise (--bbox) ou un polygone GeoJSON (--region), et un zoom maximal (--maxzoom). Chaque niveau de zoom supplémentaire double à peu près la taille du fichier : un fond de carte de département s'arrête souvent au zoom 14 ou 15.

  4. 4

    Vérifier l'archive

    pmtiles verify contrôle l'ordre et l'en-tête, pmtiles show affiche le type de tuile, la compression et les zooms, avant le téléversement.

  5. 5

    Téléverser et ouvrir les en-têtes

    Au-delà de 300 Mo, l'interface web de R2 refuse le fichier : passez par rclone ou pmtiles upload. Puis posez la règle CORS : méthodes GET et HEAD, en-têtes range et if-match autorisés, etag exposé.

  6. 6

    Brancher la carte

    Côté navigateur, la bibliothèque pmtiles ajoute un protocole pmtiles:// à MapLibre GL JS. Déclarez-le une seule fois dans la vie de l'application, puis pointez la source dessus.

La règle CORS, format S3 (AWS, et à adapter pour R2)

[
  {
    "AllowedOrigins": ["https://www.votre-site.fr"],
    "AllowedMethods": ["GET", "HEAD"],
    "AllowedHeaders": ["range", "if-match"],
    "ExposeHeaders": ["etag"],
    "MaxAgeSeconds": 3000
  }
]

MapLibre GL JS lit l'archive directement

import maplibregl from 'maplibre-gl';
import { Protocol } from 'pmtiles';

const protocol = new Protocol();
maplibregl.addProtocol('pmtiles', protocol.tile);

const map = new maplibregl.Map({
  container: 'carte',
  style: {
    version: 8,
    sources: {
      fond: { type: 'vector', url: 'pmtiles://https://tuiles.votre-site.fr/chartreuse.pmtiles' }
    },
    layers: []
  }
});

Avant de mettre l'archive en production

  • curl -r 0-16383 sur l'URL publique revient en 206 avec un Content-Range exact
  • Aucune compression à la volée sur les fichiers .pmtiles
  • La règle CORS liste vos domaines, pas *, en production
  • Le nom du fichier change à chaque nouvelle version, pour ne pas servir un cache mélangé
  • L'attribution OpenStreetMap est visible sur la carte

Héberger : stockage objet, CDN et ce que ça coûte

La documentation de Protomaps le dit sans détour : les stockages objet facturent au nombre de requêtes GET et au volume stocké, et chaque tuile lue par une requête Range compte pour un GET. Sur une archive PMTiles, votre facture suit donc le nombre de tuiles affichées, pas la taille du fichier.

Nous avons relevé le 27 septembre 2026 les grilles officielles de trois stockages, et calculé un mois type : l'archive mondiale de 138 Go, 10 millions de tuiles lues, environ 200 Go sortis (20 Ko par tuile en moyenne, l'ordre de grandeur de nos mesures au zoom 14).

PosteCloudflare R2 (Standard)AWS S3 Standard, ParisScaleway Multi-AZ, Paris
Stockage0,015 $ le Go-mois, 10 Go offerts0,024 $ le Go-mois0,01606 € le Go-mois
Lectures0,36 $ le million, 10 millions offerts0,0042 $ les 10 000 GETincluses
Sortie vers Internetgratuite0,09 $ le Go au-delà de 100 Go offerts par mois (tous services AWS)75 Go offerts, puis 0,01 € le Go
Mois type calculé1,92 $16,51 $3,47 €

Sur la Chartreuse seule, 33 Mo, le stockage ne se voit plus dans aucune de ces grilles : tout se joue sur les requêtes et la sortie.

Deux nuances, écrites par Protomaps lui-même. R2 a une latence plus élevée que d'autres stockages, 500 ms ou plus, d'où l'intérêt d'un cache devant. Et le Worker Cloudflare qui expose une archive R2 en {z}/{x}/{y} coûte 5 $ par mois avec 10 millions de requêtes incluses ; le cache n'y fonctionne que sur un domaine à vous, pas sur workers.dev.

Notre avis : un stockage sans frais de sortie, ou avec un gros forfait gratuit, et un CDN devant. Sur S3 sans CDN, la sortie pèse plus que tout le reste réuni dès que la carte a du trafic.

La carte du Parc naturel régional de Chartreuse, telle qu'elle s'intègre sur un site : fond de carte, itinéraires et lieux servis ensemble, sans archive à héberger ni règle CORS à poser.

Le même contenu, à imprimer : la checklist de mise en production d'une carte web

Recevoir la checklist

Les données : Protomaps, OpenMapTiles et l'ODbL

Une archive de tuiles n'est pas libre de droits parce qu'elle est téléchargeable. Le build Protomaps est distribué comme œuvre produite sous Open Database License, avec attribution OpenStreetMap obligatoire.

La page de droits d'auteur d'OpenStreetMap pose deux obligations : créditer OpenStreetMap et ses contributeurs, et indiquer que les données sont sous ODbL. Si vous modifiez la base elle-même et la redistribuez, le résultat reste sous la même licence. Sur une carte web, cela se règle par un contrôle d'attribution visible, « © OpenStreetMap », avec un lien vers la page de droits.

OpenMapTiles ajoute une couche. Son schéma de tuiles est sous BSD pour le code, et sous licence CC-BY 4.0 pour la cartographie et le rendu visuel : un service qui utilise des cartes dérivées de ce schéma doit afficher visiblement « OpenMapTiles » avec un lien, en plus de l'attribution OpenStreetMap. Protomaps publie son code sous BSD, ses données restant sous ODbL.

Ces règles s'appliquent à votre archive comme à toute carte en ligne. Faites relire l'attribution avant la mise en ligne : c'est la seule partie de ce chantier qui engage juridiquement votre structure. Nous ne donnons pas ici de conseil juridique sur un cas particulier.

FAQ

Quelle différence entre PMTiles et MBTiles ?

MBTiles est une base SQLite qu'un serveur de tuiles lit pour répondre à des URL {z}/{x}/{y}. PMTiles est une archive à plat que le navigateur lit directement par requêtes HTTP Range sur un stockage objet. Les tuiles contenues sont les mêmes, seul le mode de lecture change.

Comment convertir un MBTiles en PMTiles ?

Avec la ligne de commande pmtiles, un binaire sans dépendance : pmtiles convert entree.mbtiles sortie.pmtiles. Une image Docker officielle existe aussi. Vérifiez le résultat avec pmtiles verify avant de le téléverser.

Faut-il un serveur pour servir des PMTiles ?

Non. Un stockage objet qui accepte les requêtes Range et une règle CORS suffisent, avec la bibliothèque pmtiles côté navigateur. Un serveur ou un Worker n'est utile que pour exposer des URL {z}/{x}/{y} à des clients qui ne savent pas lire PMTiles.

Combien coûte l'hébergement de ses propres tuiles ?

Le stockage coûte peu : 138 Go valent environ 2 $ par mois sur R2. Le poste qui compte est la sortie vers Internet et le nombre de requêtes : sur notre mois type de 10 millions de tuiles, le calcul va de 1,92 $ sur R2 à 16,51 $ sur S3 à Paris, aux tarifs du 27 septembre 2026.

Peut-on utiliser les tuiles OpenStreetMap gratuitement sur un site commercial ?

Les données sont réutilisables, y compris commercialement, sous ODbL, à condition de créditer OpenStreetMap et de mentionner la licence. Si le style dérive du schéma OpenMapTiles, son crédit s'ajoute. L'usage des serveurs de tuiles publics d'OpenStreetMap relève d'une autre règle, plus stricte, que cette page ne traite pas.

Sources

  1. Spécification PMTiles version 3, dépôt protomaps/PMTiles, consultée le 27 septembre 2026
  2. Documentation Protomaps, ligne de commande pmtiles (convert, extract, verify, serve), consultée le 27 septembre 2026
  3. Documentation Protomaps, PMTiles sur stockage objet (CORS, Range, facturation des GET), consultée le 27 septembre 2026
  4. Documentation Protomaps, PMTiles dans MapLibre GL, consultée le 27 septembre 2026
  5. Documentation Protomaps, déploiement sur Cloudflare (latence R2, coût du Worker), consultée le 27 septembre 2026
  6. Documentation Protomaps, téléchargement du fond de carte et licence ODbL, consultée le 27 septembre 2026
  7. Versions de go-pmtiles (1.31.2, 22 juillet 2026), consultées le 27 septembre 2026
  8. Spécification MBTiles 1.3, dépôt mapbox/mbtiles-spec, consultée le 27 septembre 2026
  9. tileserver-gl, dépôt et configuration des sources mbtiles et pmtiles, version 5.6.0, consulté le 27 septembre 2026
  10. Martin, serveur de tuiles MapLibre, version 1.16.1, consulté le 27 septembre 2026
  11. Tarifs Cloudflare R2, mis à jour le 7 août 2026, consultés le 27 septembre 2026
  12. Tarifs Amazon S3, région Europe (Paris), grille publiée le 26 septembre 2026, consultés le 27 septembre 2026
  13. Tarifs Scaleway Object Storage, région Paris, consultés le 27 septembre 2026
  14. OpenStreetMap, droits d'auteur et licence ODbL, consulté le 27 septembre 2026
  15. Licence du schéma OpenMapTiles (BSD et CC-BY 4.0), consultée le 27 septembre 2026
  16. Mesures La Trace du 27 septembre 2026 : lecture de tuiles avec pmtiles 4.5.0 et extraction avec pmtiles 1.31.2 sur le build Protomaps 20260927.pmtiles
Lucas Tesnier

Lucas Tesnier

Co-fondateur de La Trace

Lucas Tesnier a cofondé La Trace en 2023 et en dirige le produit et la technique. Il écrit sur ce qu'il voit chez les offices, les parcs et les hébergeurs qui publient leurs itinéraires : l'intégration, les données, les marchés publics.

Tous ses guides · Comment nous écrivons

À emporter

La checklist de mise en production d'une carte sur un site

Consentement et cookies, clés et quotas, tuiles, géocodage, accessibilité et performance : les points à vérifier avant de mettre une carte en ligne, avec une case par point.

Merci, la checklist part dans votre boîte mail.

Ouvrir la checklist

Vous voulez une carte en ligne, pas un chantier de tuiles ?

Une démonstration de trente minutes, sur votre territoire, pour voir le fond de carte, vos itinéraires et vos lieux servis ensemble dans un bloc à coller.

Demander une démonstration
Thank you! Your submission has been received!
L'envoi n'a pas abouti. Réessayez, ou écrivez-nous à contact@latrace.com.
Les VéloroutesPour les prosMes enregistrementsMes informationsBlogNous contacterAidez-nous à nous améliorer