Tuiles vectorielles avec MapLibre GL

Passer au rendu GPU : styles JSON, couches dynamiques, extrusion 3D et expressions data-driven.

Les tuiles raster sont des images figées. Les tuiles vectorielles transmettent la géométrie brute que le navigateur dessine lui-même en WebGL : rotation, inclinaison, changement de style instantané, étiquettes toujours droites, rendu net sur tous les écrans. MapLibre GL JS est la bibliothèque open source de référence pour les exploiter.

Raster vs vecteur

Tuiles rasterTuiles vectorielles
ContenuImages PNG/JPEGGéométries encodées (format MVT / PBF)
StyleFixé côté serveurDéfini côté client, modifiable à la volée
Rotation / 3DNonOui
PoidsPlus lourdSouvent 2 à 5× plus léger
InteractionAucune sur le fondSurvol et requêtes sur chaque objet

Première carte MapLibre

<link rel="stylesheet" href="https://unpkg.com/maplibre-gl@4.7.1/dist/maplibre-gl.css">
<script src="https://unpkg.com/maplibre-gl@4.7.1/dist/maplibre-gl.js"></script>
<div id="map" style="height:100vh"></div>
<script>
  const map = new maplibregl.Map({
    container: 'map',
    style: 'https://tiles.openfreemap.org/styles/liberty', // style public gratuit
    center: [2.35, 48.853],  // [lon, lat] — attention, inverse de Leaflet !
    zoom: 14,
    pitch: 50,
    bearing: -20
  });
  map.addControl(new maplibregl.NavigationControl());
</script>

Anatomie d'un style

Un style est un document JSON qui décrit les sources (d'où viennent les données) et les couches (comment les dessiner, dans quel ordre) :

{
  "version": 8,
  "sources": {
    "omt": { "type": "vector", "url": "https://exemple.org/tiles.json" }
  },
  "layers": [
    { "id": "fond", "type": "background", "paint": { "background-color": "#0b111d" } },
    {
      "id": "eau", "type": "fill", "source": "omt", "source-layer": "water",
      "paint": { "fill-color": "#16324f" }
    },
    {
      "id": "routes", "type": "line", "source": "omt", "source-layer": "transportation",
      "paint": { "line-color": "#2ee6c5", "line-width": ["interpolate", ["linear"], ["zoom"], 10, 0.5, 16, 4] }
    }
  ]
}

Pour éditer un style visuellement, utilisez Maputnik.

Expressions data-driven

Les expressions permettent de calculer un style à partir des attributs ou du zoom. Exemple : colorer des communes selon leur densité.

map.on('load', () => {
  map.addSource('communes', { type: 'geojson', data: 'communes.geojson' });
  map.addLayer({
    id: 'densite',
    type: 'fill',
    source: 'communes',
    paint: {
      'fill-color': [
        'step', ['get', 'densite'],
        '#f3edff', 50, '#c7b5ff', 200, '#8b6cff', 1000, '#5a35d6', 5000, '#2a0f7a'
      ],
      'fill-opacity': 0.8
    }
  });
});

Bâtiments en 3D

map.addLayer({
  id: 'batiments-3d',
  type: 'fill-extrusion',
  source: 'openmaptiles',
  'source-layer': 'building',
  minzoom: 14,
  paint: {
    'fill-extrusion-color': '#8b6cff',
    'fill-extrusion-height': ['coalesce', ['get', 'render_height'], 10],
    'fill-extrusion-opacity': 0.7
  }
});

Générer vos propres tuiles

  • Tippecanoe transforme un GeoJSON volumineux en tuiles vectorielles optimisées :
    tippecanoe -o communes.pmtiles -zg --drop-densest-as-needed communes.geojson
  • PMTiles est un format « une archive, zéro serveur » : un simple fichier statique lu par requêtes HTTP Range. Idéal pour héberger sur un serveur Apache classique.
  • Martin ou pg_tileserv servent des tuiles directement depuis PostGIS.

Avec le protocole PMTiles, une carte vectorielle complète tient dans un hébergement mutualisé : pas de base de données, pas de serveur de tuiles, juste un fichier.

Démonstration

Des tuiles vectorielles OpenMapTiles servies par OpenFreeMap, avec la couche de bâtiments 3D de ce tutoriel :

À essayer : changez de style (les mêmes données, redessinées instantanément), colorez les bâtiments selon leur hauteur (expression step), passez l'eau en violet (setPaintProperty), cliquez un bâtiment pour lire sa hauteur, et faites tourner ou incliner la carte (clic droit + glisser, ou deux doigts).