Introduction : Qu’est-ce que le format MBTiles ?
Le format MBTiles est un format de fichier permettant de stocker des tuiles cartographiques (raster ou vectorielles) dans une base de données SQLite, un moteur de base de données léger et autonome.
Conçu initialement par Mapbox, ce format a été largement adopté dans les communautés SIG, cartographiques et web mapping pour sa portabilité, sa simplicité d’utilisation et sa compatibilité avec de nombreux outils.
Concrètement, un fichier .mbtiles
est une base de données unique qui peut contenir des milliers, voire des millions de tuiles géographiques organisées par niveaux de zoom, colonnes et lignes. Il évite ainsi d’avoir une arborescence complexe de fichiers sur le disque, tout en facilitant la distribution (sur le web, via USB, ou en mode déconnecté).
Le format MBTiles peut contenir :
- Des tuiles raster (généralement PNG ou JPEG),
- Ou des tuiles vectorielles (au format MVT – Mapbox Vector Tiles),
- Et des métadonnées (description, attribution, format, etc.).
Grâce à son format SQLite, MBTiles peut être facilement lu avec des outils comme sqlite3
, DB Browser for SQLite
, ou exploité via des serveurs légers (comme Flask ou TileServer-PHP), ce qui le rend très adapté à la formation, aux démonstrations, ou à des usages hors-ligne.
Structure interne d’un fichier MBTiles
Un fichier MBTiles est une base de données SQLite structurée selon un schéma simple et normalisé, qui permet de stocker efficacement des tuiles cartographiques sous forme raster (PNG, JPEG) ou vectorielle (PBF).
1. Les tables principales
Selon la spécification officielle (https://github.com/mapbox/mbtiles-spec), un fichier .mbtiles
contient au minimum :
a) tiles
C’est la table centrale. Elle contient les tuiles encodées, chacune identifiée par ses coordonnées de zoom, colonne (x), et ligne (y) :
CREATE TABLE tiles (
zoom_level INTEGER,
tile_column INTEGER,
tile_row INTEGER,
tile_data BLOB
);
Note : Les tuiles MBTiles utilisent le système de coordonnées TMS (Tile Map Service), ce qui signifie que l’axe vertical (Y) est inversé par rapport au schéma XYZ utilisé par Leaflet. Certains serveurs ou viewers le corrigent automatiquement.
b) metadata
Cette table contient des informations générales sur le fichier et les tuiles qu’il contient, par exemple :
CREATE TABLE metadata (
name TEXT,
value TEXT
);
Quelques champs communs :
name
: nom du jeu de tuiles ;format
: format des tuiles (png
,jpg
,pbf
) ;minzoom
,maxzoom
: niveaux de zoom disponibles ;bounds
: étendue géographique (minlon,minlat,maxlon,maxlat
) ;center
: coordonnées du centre de la carte (lon,lat,zoom
) ;type
: type de carte (baselayer
,overlay
) ;description
: texte explicatif.
2. Indexation
Les fichiers MBTiles peuvent comporter des index pour accélérer l’accès aux tuiles, mais ce n’est pas obligatoire.
3. Autres vues et variantes
Certains outils (comme MapTiler ou TileMill) génèrent des vues supplémentaires ou des schémas alternatifs, comme la vue map
associée à une table images
dans un format optimisé (déduplication des tuiles).
Exemple :
CREATE TABLE images (
tile_id TEXT,
tile_data BLOB
);
CREATE TABLE map (
zoom_level INTEGER,
tile_column INTEGER,
tile_row INTEGER,
tile_id TEXT
);
Cela permet de stocker chaque image une seule fois, même si elle est utilisée à plusieurs coordonnées.
Voici une section comparative claire entre les deux types de contenus que peut stocker le format MBTiles :
Raster vs Vector : Deux types de tuiles dans les fichiers MBTiles
Le format MBTiles est polyvalent : il peut contenir des tuiles raster (images) ou vectorielles (données géographiques encodées). Chaque approche a ses avantages et convient à des cas d’usage différents.
1. MBTiles Raster
- Contenu : images en PNG ou JPEG (rarement WebP).
- Utilisation : fonds de carte pré-rendus, cartes statiques, cartes historiques, orthophotos, etc.
- Format déclaré : champ
format
=png
oujpg
dans la tablemetadata
. - Affichage : directement compatible avec la plupart des bibliothèques comme Leaflet, OpenLayers ou MapLibre, via un serveur de tuiles (local ou distant).
- Avantages :
- Très simple à mettre en œuvre.
- Rendu cohérent sur toutes les plateformes.
- Aucun traitement côté client.
- Limites :
- Pas d’interactivité native (pas de clic sur entité).
- Poids plus élevé : une image par tuile.
- Moins flexible en cas de changement de style.
2. MBTiles Vectoriels (VectorTiles)
- Contenu : données vectorielles encodées au format Mapbox Vector Tile (MVT,
.pbf
). - Utilisation : cartes dynamiques, interactives, multi-styles (OpenStreetMap, plans personnalisés).
- Format déclaré : champ
format
=pbf
dans la tablemetadata
. - Affichage : nécessite une bibliothèque supportant le rendu vectoriel (MapLibre GL, Mapbox GL JS, etc.).
- Avantages :
- Léger : un seul fichier peut contenir plusieurs styles.
- Très rapide à charger avec le bon moteur de rendu.
- Interactif : on peut interroger les entités à la volée.
- Limites :
- Nécessite un moteur de rendu côté client ou un serveur comme
tileserver-gl
. - Plus complexe à générer.
- Pas encore supporté par toutes les plateformes (par exemple Leaflet ne les supporte pas directement).
- Nécessite un moteur de rendu côté client ou un serveur comme
En résumé
Caractéristique | Raster | Vectoriel |
---|---|---|
Format des tuiles | PNG, JPEG | PBF (MVT) |
Rendu | Pré-rendu, fixe | Dynamique, stylable |
Interactivité | Non | Oui |
Compatibilité | Très large | Plus restreinte |
Taille | Plus lourd | Plus léger à grande échelle |
Besoin de style | Aucun (rendu inclus) | Nécessite un style JSON |
Générer des fichiers MBTiles : outils et workflows
1. MBTiles Raster (images)
Les tuiles raster sont généralement générées à partir d’une carte affichée dans un logiciel SIG ou un moteur de rendu cartographique. Voici les principaux outils :
Outil | Description | Type |
---|---|---|
QGIS | Plugin « Exporter en tuiles » (ou Processing → Generate XYZ tiles ) |
Interface graphique |
GDAL | gdal2tiles.py avec l’option --mbtiles (depuis GDAL 3.1) |
Ligne de commande |
TileMill (ancien) | Création de tuiles PNG via Mapnik | Interface graphique |
MapTiler Desktop | Interface complète pour créer des MBTiles (version gratuite limitée) | Interface graphique |
tippecanoe + rasterize | Workflow hybride : rasteriser en amont si besoin | Ligne de commande |
MapProxy | Génère dynamiquement et peut exporter vers MBTiles | Serveur/cache |
Cas d’usage typique : carte touristique, orthophoto, carte scannée.
2. MBTiles Vectoriels (Vector Tiles)
Les tuiles vectorielles demandent un encodage en PBF et un découpage en tuiles selon la norme MVT (Mapbox Vector Tile). Cela nécessite des outils spécialisés :
Outil | Description | Format MBTiles |
---|---|---|
tippecanoe (Mapbox) | Outil de référence pour convertir GeoJSON en tuiles PBF dans un MBTiles | Oui |
tilemaker | Génère directement des tuiles vectorielles depuis un extrait OSM PBF | Oui |
PostGIS + ST_AsMVT | Export manuel de tuiles avec scripts SQL → stockage dans MBTiles via mb-util |
Avec script |
OpenMapTiles | Chaîne complète avec Docker, fondée sur PostgreSQL/PostGIS + imposm3 + tippecanoe | Oui |
MapTiler Desktop | Permet aussi l’export vectoriel avec styles intégrés (version Pro) | Oui |
Cas d’usage typique : carte de ville interactive, fonds personnalisables, projets à forte interactivité.
Structure interne d’un fichier MBTiles
Un fichier .mbtiles
est une base SQLite contenant des tuiles géographiques organisées selon un schéma standardisé, qui varie légèrement entre les formats raster et vectoriel.
1. Tables principales
tiles
(ou map
+ images
pour vectoriels multi-part)
Champ | Type | Description |
---|---|---|
zoom_level |
INTEGER | Niveau de zoom de la tuile |
tile_column |
INTEGER | Colonne (x) de la tuile |
tile_row |
INTEGER | Ligne (y) de la tuile (inversée TMS ↔ XYZ) |
tile_data |
BLOB | Données binaires de l’image ou PBF |
Remarque : en format vectoriel, certaines implémentations comme
tilemaker
séparent les métadonnées d’image (images
) et les positions (map
). On crée alors une vuetiles
qui les combine.
metadata
Table clé-valeur (clé = texte, valeur = texte) qui contient des informations essentielles pour l’interprétation du fichier.
Clé | Exemple de valeur | Utilité |
---|---|---|
name |
"Rodrigues Map" |
Nom lisible |
format |
"png" , "jpg" , "pbf" |
Type de tuiles |
minzoom |
5 |
Niveau de zoom minimal |
maxzoom |
14 |
Niveau de zoom maximal |
bounds |
63.35,-19.9,63.5,-19.7 |
BBox (WGS84) |
center |
63.42,-19.8,12 |
Centre de la carte (lon, lat, z) |
type |
"baselayer" ou "overlay" |
Rôle du jeu de tuiles |
json |
JSON Mapbox (si vectoriel) | Style, couches, champs |
attribution |
Texte HTML | Source à afficher |
(optionnel) grids
, grid_data
, keymap
Utilisées pour le format UTFGrid, une forme obsolète d’interactivité dans les fonds raster.
Remarques importantes
- Les coordonnées
tile_row
sont souvent inversées selon le système de tuile :- TMS (Tile Map Service) : l’origine est en bas à gauche.
- XYZ (Web standard) : l’origine est en haut à gauche.
- La plupart des serveurs et viewers modernes utilisent XYZ.
- Le champ
tile_data
contient :- Une image compressée (
png
,jpg
) pour raster. - Un objet PBF zlib-compressé pour vectoriel.
- Une image compressée (
- Pour les tuiles vectorielles, le champ
json
dansmetadata
peut contenir :{ "vector_layers": [ { "id": "buildings", "description": "", "minzoom": 12, "maxzoom": 16, "fields": { "name": "String", "height": "Number" } } ] }
Utilisation des fichiers MBTiles avec Leaflet
Leaflet est une bibliothèque JavaScript populaire pour la création de cartes interactives. Elle prend en charge l’intégration de nombreux types de fonds de carte, y compris les fichiers MBTiles. Voici les étapes typiques et les cas d’usage pour intégrer des fichiers MBTiles dans une carte Leaflet.
1. Prérequis : Un serveur de tuiles
Avant d’utiliser des fichiers MBTiles avec Leaflet, il est nécessaire de mettre en place un serveur de tuiles, car Leaflet ne charge pas directement des fichiers MBTiles locaux. Ce serveur va servir les tuiles en tant qu’images ou en format vectoriel, accessibles via une URL.
Les options pour héberger les MBTiles sont variées :
- TileStache
- Tileserver-GL
- Flask + Flask-tile (pour une installation légère)
- Tileserver-php
Une fois le serveur configuré, il peut diffuser les tuiles via HTTP, que Leaflet peut appeler pour les afficher sur la carte.
2. Intégration de MBTiles avec Leaflet
Voici un exemple simple d’utilisation d’un serveur de tuiles avec Leaflet pour afficher des données provenant d’un fichier .mbtiles
:
Exemple avec tuiles raster
a)Lancer le serveur de tuiles
Positionnez-vous dans le répertoire contenant les tuiles raster.
php.exe -S localhost:8081
lancez le seveur de tuiles

La page html suivante affiche le contenu des tuiles du fichier countries.mbtiles situé dans le sous_dossier tiles/. Dans le navigateur vous devez rentrer l’adresse localhost:8081/nom_de_la_page.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Carte Mondiale</title>
<link rel="stylesheet" href="https://unpkg.com/leaflet/dist/leaflet.css" />
<style>
html, body, #map { height: 100%; margin: 0; }
</style>
</head>
<body>
<div id="map"></div>
<script src="https://unpkg.com/leaflet/dist/leaflet.js"></script>
<script>
var map = L.map('map').setView([45, 2], 5);
L.tileLayer('tileserver.php?file=tiles/countries.mbtiles&z={z}&x={x}&y={y}', {
tileSize: 256,
minZoom: 0,
maxZoom: 6,
attribution: '© OpenStreetMap contributors'
}).addTo(map);
</script>
</body>
</html>
Le résultat est le suivant:

3. Tuiles vectorielles (MBTiles PBF)
Si vous utilisez un fichier MBTiles vectoriel (par exemple, généré par MapTiler ou Mapbox), vous devrez configurer Leaflet avec un plugin qui peut interpréter les tuiles vectorielles. Leaflet.VectorGrid est l’un des plugins qui permet de gérer les tuiles vectorielles dans Leaflet.
Exemple avec tuiles vectorielles (PBF)
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Carte Vectorielle MBTiles avec Leaflet</title>
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.7.1/dist/leaflet.css" />
<script src="https://unpkg.com/leaflet@1.7.1/dist/leaflet.js"></script>
<script src="https://unpkg.com/leaflet.vectorgrid@1.1.0/dist/Leaflet.VectorGrid.js"></script>
</head>
<body>
<div id="map" style="height: 600px;"></div>
<script>
var map = L.map('map').setView([ -19.7, 63.35], 12); // Centré sur Rodrigues
// Charger les tuiles vectorielles MBTiles
L.vectorGrid.protobuf("http://localhost:8081/tileserver.php?file=tiles/map.mbtiles&z={z}&x={x}&y={y}", {
vectorTileLayerStyles: {
// Styles pour les tuiles vectorielles
building: {
fillColor: 'blue',
weight: 1,
fillOpacity: 0.6
},
park: {
fillColor: 'green',
weight: 1,
fillOpacity: 0.6
}
}
}).addTo(map);
</script>
</body>
</html>
Dans cet exemple, le serveur Flask ou Tileserver-GL est utilisé pour fournir les tuiles vectorielles, que Leaflet rend sous forme de vecteurs à l’aide de L.vectorGrid
.
Mais, attention, ce n’est pas aussi simple qu’avec les tuiles raster.
Symbologie
La première différence réside sur le fait que les tuiles vectorielles, contrairement aux tuiles raster, n’ont pas de symbologie associée au niveau du serveur. Vosu êtes alors obligés de définir la symbologie au niveau du client html. Vous pouvez le constater dans le code exemple ci-dessus:
vectorTileLayerStyles: {
// Styles pour les tuiles vectorielles
building: {
fillColor: 'blue',
weight: 1,
fillOpacity: 0.6
},
park: {
fillColor: 'green',
weight: 1,
fillOpacity: 0.6
}
}
Ce qu’il faut aussi savoir c’est qu’il n’y a pas de symbologie par défaut. Si une couche n’a pas de définition de symbologie au niveau du vectorTileLayerStyles, elle ne sera pas affihée. Dans notre exemple, seuls les bâtiments et les parcs seront affichés, toutes les autres couches (routes, etc.) seront ignorées.
Dépendances
Leaflet.VectorGrid possède plusieurs dépendance qui peuvent compliquer le fonctionnement du serveur de tuiles local. Quand on affiche un fichier .mbtiles
converti en .pbf
via tileserver.php
(par exemple), on fait appel à des tuiles vectorielles brutes depuis un serveur PHP local, sans les bons headers ou encodages. Or :
- Ces tuiles nécessitent
pbf.js
(ce qu’on peut ajouter: src= »https://unpkg.com/pbf@3.2.1/dist/pbf.js ») - Mais aussi
@mapbox/vector-tile
pour décoder les contenus.pbf
Or, cette dernière n’est pas disponible sous forme de fichier .js
utilisable directement dans une page HTML : elle est écrite pour Node.js ou pour un bundler moderne (Webpack, Vite, etc.).
Encodage
Le code PHP de tileserver.php
par défaut est configuré pour gérer des tuiles raster (image PNG), mais pas des tuiles vectorielles (.pbf
).
Il faudra donc ajuster le fichier tileserver.php pour servir des tuiles vectorielles (PBF):
Modification de l’en-tête Content-Type
:
Pour des tuiles vectorielles, il faut spécifier un en-tête Content-Type: application/x-protobuf
, car les tuiles vectorielles sont des fichiers au format Protobuf (.pbf
), et non des images PNG.
Exemple de Code PHP modifié pour servir des tuiles vectorielles (PBF) :
<?php
// Ouverture de la base de données SQLite
$db = new SQLite3($_GET['file']);
// Extraction des coordonnées de la tuile
$z = (int) $_GET['z'];
$x = (int) $_GET['x'];
$y = (int) $_GET['y'];
// Conversion du système de coordonnées TMS vers XYZ
$y = (1 << $z) - 1 - $y; // TMS flip
// Préparation de la requête pour extraire la tuile correspondante
$stmt = $db->prepare("SELECT tile_data FROM tiles WHERE zoom_level = :z AND tile_column = :x AND tile_row = :y");
$stmt->bindValue(':z', $z, SQLITE3_INTEGER);
$stmt->bindValue(':x', $x, SQLITE3_INTEGER);
$stmt->bindValue(':y', $y, SQLITE3_INTEGER);
$res = $stmt->execute();
// Si une tuile est trouvée
if ($row = $res->fetchArray()) {
// Définir l'en-tête approprié pour les tuiles vectorielles Protobuf
header('Content-Type: application/x-protobuf');
// Retourner les données de la tuile
echo $row['tile_data'];
} else {
// Si aucune tuile n'est trouvée, renvoyer une erreur 404
http_response_code(404);
}
?>
4. Scalabilité et autres utilisations
Les fichiers MBTiles sont particulièrement pratiques dans les scénarios où :
- La performance est un enjeu important, car les tuiles peuvent être diffusées efficacement grâce à un serveur de tuiles optimisé.
- Vous souhaitez distribuer un grand nombre de tuiles hors ligne ou dans un environnement sans connexion à Internet (tuiles pré-générées et stockées dans un seul fichier).
- Les tuiles sont générées à partir de données qui évoluent fréquemment, et vous avez la possibilité de les mettre à jour ou de les remplacer avec un minimum de perturbation pour les utilisateurs finaux.
Conclusion
Le format MBTiles est très bien adapté aux applications Leaflet, car il offre une solution simple et efficace pour servir des tuiles géospatiales, qu’elles soient raster ou vectorielles. Avec une installation légère et un serveur de tuiles bien configuré, il devient facile d’afficher des cartes de manière performante et de gérer une grande quantité de données géospatiales.