SIG & Carto Guide

Leaflet, OpenLayers ou MapLibre : choisir son moteur de rendu carto

Trois bibliothèques, trois architectures de rendu — et c’est l’architecture qui décide de ce que votre carte saura faire.

Mattieu Pottier 10 min de lecture
Comparaison des moteurs de rendu cartographique web Leaflet, OpenLayers et MapLibre

La semaine dernière, nous avons choisi la donnée à afficher — Overture, OpenStreetMap ou IGN — en gardant MapLibre comme constante. Mais MapLibre n’est qu’un moteur de rendu parmi d’autres, et ce choix-là se fait trop souvent par habitude, ou au gré du premier tutoriel venu. C’est une erreur de cadrage : derrière Leaflet, OpenLayers et MapLibre se cachent trois architectures de rendu différentes, et c’est l’architecture — pas le logo — qui décide de ce que votre carte saura faire dans trois ans. Voici comment trancher.

Côté métier — ce que ça change
  • Le moteur de rendu est la brique qui transforme vos données en carte affichée — pas un détail d’implémentation.
  • Il fixe le plafond technique de l’application : nombre d’objets affichables, fluidité, 3D, mise à jour en temps réel.
  • En changer après coup revient à réécrire toute la couche cartographique — un coût caché qui se paie cher.
  • Le bon choix au départ, c’est une carte qui encaisse la montée en charge sans refonte.

On ne choisit pas un moteur, on choisit une architecture de rendu

« On part sur Leaflet, c’est le plus simple. » La phrase paraît raisonnable. Elle l’est, pour une carte avec trois marqueurs. Elle devient un piège dès que l’application grandit.
Parce que choisir Leaflet, OpenLayers ou MapLibre, ce n’est pas choisir entre trois marques équivalentes — c’est choisir entre trois façons de dessiner une carte, qui n’ont pas les mêmes limites.

Le point clé

Le vrai choix n’est pas « quelle librairie ». C’est « quelle architecture de rendu » — et chaque librairie en incarne une. Le logo se décide en dernier ; l’architecture, en premier.

Rendre une carte : du DOM au GPU

Il existe deux grandes manières de transformer de la donnée géographique en image à l’écran.

  • Raster / DOM on empile des images (les tuiles raster) et des éléments HTML/SVG pour les marqueurs. Universel, simple, supporté partout — mais le navigateur s’essouffle dès qu’on multiplie les objets.
  • Vectoriel / GPU on envoie les géométries elles-mêmes au processeur graphique, qui les redessine à chaque image via WebGL. Fluide même avec des dizaines de milliers d’objets, avec zoom continu, rotation et inclinaison.
Tuiles raster Découpage de la carte en petites images figées (souvent en PNG), une par niveau de zoom. Le navigateur ne fait que les assembler comme une mosaïque : rapide à afficher, mais impossible à restyler ou à incliner sans tout régénérer côté serveur.

Cette différence d’architecture n’est pas un détail technique : c’est elle qui sépare une carte qui plafonne d’une carte qui tient la charge. Le reste de l’article en découle.

Leaflet, OpenLayers, MapLibre : trois architectures

Avant de les départager, voici leur carte d’identité — année, architecture, et le terrain sur lequel chacun excelle.

Raster / DOM

Leaflet

2011 · BSD-2

Le vétéran léger. Tuiles raster et marqueurs DOM, immense écosystème de plugins.

LégerSimple
Hybride

OpenLayers

2006 · BSD

Le couteau suisse du SIG web. Raster et vectoriel, projections cartographiques poussées.

SIGProjections
Vectoriel / GPU

MapLibre

2020 · BSD-3

Le fork libre de Mapbox GL JS. Rendu vectoriel WebGL, sans jeton d’accès.

WebGLVectoriel

Leaflet — le vétéran raster, léger et plafonné

Sorti en 2011 et pesant à peine plus de 40 Ko, Leaflet a démocratisé la carte web. Son architecture est simple : des tuiles raster empilées, des marqueurs en éléments DOM, et un écosystème de plugins qui couvre presque tout. Pour une carte avec quelques points et popups, rien n’est plus rapide à mettre en ligne.

JavaScript
import L from 'leaflet';
import 'leaflet/dist/leaflet.css';

// Leaflet attend [latitude, longitude] — l'inverse de MapLibre
const carte = L.map('map').setView([4.92, -52.33], 12); // Cayenne

L.tileLayer('https://tile.openstreetmap.org/{z}/{x}/{y}.png', {
  attribution: '© OpenStreetMap'
}).addTo(carte);

L.marker([4.92, -52.33]).addTo(carte).bindPopup('Un actif');

Quelques lignes, une carte fonctionnelle : c’est sa force et c’est honnête. La limite apparaît avec l’échelle : empiler des milliers d’objets vectoriels fait ramer le DOM, il n’y a pas de tuiles vectorielles natives, pas de 3D, pas de rotation fluide. Leaflet fait parfaitement le simple — et s’arrête là.

OpenLayers — le couteau suisse du SIG exigeant

Plus ancien encore (2006, projet de l’OSGeo depuis 2007), OpenLayers est l’outil des cas SIG sérieux. Son architecture hybride combine raster et vectoriel, et sa vraie force est ailleurs : la gestion des projections cartographiques. Reprojection à la volée, services WMS/WFS, systèmes de coordonnées officiels — là où les autres calent, OpenLayers répond.

JavaScript
import Map from 'ol/Map.js';
import View from 'ol/View.js';
import TileLayer from 'ol/layer/Tile.js';
import OSM from 'ol/source/OSM.js';
import proj4 from 'proj4';
import { register } from 'ol/proj/proj4.js';
import { get as getProjection, transformExtent } from 'ol/proj.js';

// Déclarer une projection officielle non native — ici Lambert-93 (EPSG:2154)
proj4.defs('EPSG:2154',
  '+proj=lcc +lat_1=49 +lat_2=44 +lat_0=46.5 +lon_0=3 ' +
  '+x_0=700000 +y_0=6600000 +ellps=GRS80 +units=m +no_defs');
register(proj4);

// Étendue de validité (dérivée des bornes WGS84 officielles de la France)
getProjection('EPSG:2154').setExtent(
  transformExtent([-9.86, 41.15, 10.38, 51.56], 'EPSG:4326', 'EPSG:2154')
);

const carte = new Map({
  target: 'map',
  // OpenLayers reprojette les tuiles OSM (EPSG:3857) vers le Lambert-93 à la volée
  layers: [new TileLayer({ source: new OSM() })],
  view: new View({ projection: 'EPSG:2154', center: [700000, 6600000], zoom: 8 })
});

Cette capacité à parler couramment les projections est inégalée — c’est l’outil du géomaticien. Le coût est visible dans le code même : OpenLayers est verbeux, sa courbe d’apprentissage est raide, et il est surdimensionné pour une simple carte web grand public.

MapLibre — le vectoriel GPU, libre et sans jeton

Né fin 2020 du fork de la dernière version libre de Mapbox GL JS (passé propriétaire), MapLibre rend la donnée vectorielle en WebGL, consomme la Style Specification JSON et ne réclame aucun jeton d’accès. Sa signature : un style appliqué côté navigateur, qui peut réagir à la donnée elle-même.

JavaScript
import maplibregl from 'maplibre-gl';
import 'maplibre-gl/dist/maplibre-gl.css';

const map = new maplibregl.Map({
  container: 'map',
  style: 'https://demotiles.maplibre.org/style.json', // fond de démo libre, sans jeton
  center: [-52.33, 4.92], // Cayenne — MapLibre attend [lng, lat]
  zoom: 12
});

map.on('load', () => {
  // Source des équipements (ici en GeoJSON pour l'exemple)
  map.addSource('reseau', {
    type: 'geojson',
    data: {
      type: 'FeatureCollection',
      features: [
        { type: 'Feature', properties: { etat: 'ok' },     geometry: { type: 'Point', coordinates: [-52.33, 4.92] } },
        { type: 'Feature', properties: { etat: 'alerte' }, geometry: { type: 'Point', coordinates: [-52.30, 4.94] } },
        { type: 'Feature', properties: { etat: 'panne' },  geometry: { type: 'Point', coordinates: [-52.35, 4.90] } }
      ]
    }
  });

  // Colorer chaque actif selon un attribut métier — hors de portée du raster
  map.addLayer({
    id: 'actifs',
    type: 'circle',
    source: 'reseau',
    paint: {
      'circle-radius': 6,
      // la couleur dépend du champ "etat" de chaque objet, calculée par le GPU
      'circle-color': [
        'match', ['get', 'etat'],
        'ok', '#2D5F3F',
        'alerte', '#E97423',
        'panne', '#C0392B',
        /* défaut */ '#999999'
      ]
    }
  });
});

Ce data-driven styling — la carte se colore selon l’état réel de chaque équipement, recalculé en continu par le GPU — est typiquement ce que le raster ne sait pas faire. Pour la documentation de référence, voir le guide MapLibre GL JS. Ici les points sont en GeoJSON pour l’exemple ; en production, ces données arrivent plutôt sous forme de tuiles vectorielles — c’est tout le sujet de Exposer la donnée géospatiale sur le web, dont le livre blanc détaille serveurs, PMTiles et architectures de diffusion.

L’architecture fixe le plafond de votre carte

Une fois posées les trois architectures, le choix se clarifie : chacune autorise certaines choses et en interdit d’autres. Le tableau ci-dessous n’oppose pas trois marques — il oppose trois manières de dessiner.

Ce que chaque architecture de rendu permet
CapacitéRaster / DOM — LeafletHybride — OpenLayersVectoriel / GPU — MapLibre
Carte simple, quelques marqueursExcellentBonBon
Densité — milliers d’objetsLimitéCorrectExcellent
Zoom continu, rotation, inclinaisonNonPartielNatif
Style réactif à la donnéeNonPartielNatif
Projections SIG exotiquesLimitéRéférenceLimité
3D, terrain, extrusionsNonLimitéNatif
Légèreté, prise en mainLégerLourdMoyen

Densité, fluidité, interactivité : ce que le GPU débloque

Le GPU change la nature même de la carte. Là où le raster fige une image par niveau de zoom, le vectoriel recompose la scène en continu : des dizaines de milliers de géométries dessinées à 60 images par seconde, un zoom sans paliers, la rotation, l’inclinaison 3D, les étiquettes qui se replacent toutes seules.

Et puisque le style est calculé dans le navigateur, vous le modifiez à chaud — couleur selon un seuil d’alerte, épaisseur selon un débit, filtrage selon une date — sans jamais régénérer la donnée côté serveur. C’est exactement ce que montrait l’exemple de code précédent.

La bonne pratique

Pour une application de production amenée à grossir — plus d’actifs, plus d’utilisateurs, besoins 3D ou temps réel à venir — partez d’emblée sur une architecture vectorielle / GPU. Vous vous épargnez la réécriture que le raster vous imposera tôt ou tard.

Le cap suivant : de WebGL 2 à WebGPU

Soyons honnêtes sur un raccourci courant : WebGL 2 n’est pas le futur, c’est le présent. Disponible dans les navigateurs depuis 2017, c’est la technologie sur laquelle MapLibre s’appuie aujourd’hui. Le véritable horizon porte un autre nom — WebGPU.

WebGPU Nouvelle API graphique du web, plus moderne et plus proche du matériel que WebGL (architecture alignée sur Metal et Vulkan). Elle promet davantage de performance et de fidélité visuelle. Active par défaut dans Chrome depuis 2023, en cours d’implémentation dans Safari.

Côté navigateur, WebGPU avance vite. Côté MapLibre GL JS, le rendu reste en WebGL aujourd’hui et une API WebGPU est en cours de développement, annoncée par le projet comme la prochaine étape pour des cartes encore plus performantes. Pour les détails techniques, la documentation MDN sur WebGPU fait référence.

La conséquence pour votre décision est simple : miser aujourd’hui sur le vectoriel / GPU, ce n’est pas suivre une mode, c’est s’aligner sur la trajectoire du rendu web. Le raster, lui, a déjà donné son maximum.

Quel moteur pour quel projet

Aucun de ces trois moteurs n’est « le meilleur » dans l’absolu — chacun a son terrain. Le bon réflexe n’est pas de chercher le plus populaire, mais de partir du besoin dominant de votre projet et de remonter jusqu’à l’architecture qui le sert.

Dit autrement : Leaflet quand la simplicité prime et que la carte restera modeste ; OpenLayers quand le SIG et les projections sont au cœur du besoin ; MapLibre quand l’application est vouée à grossir, à devenir interactive, ou à passer à la 3D.

Coût, risque, bénéfice
  • Coût — L’effort d’intégration croît de Leaflet (quelques lignes) à OpenLayers (verbeux, courbe raide) ; MapLibre se situe entre les deux.
  • Risque — Choisir le raster pour une application vouée à grossir, c’est s’exposer à une réécriture complète de la couche cartographique le jour où le volume ou la 3D deviennent nécessaires.
  • Bénéfice — Le bon moteur choisi au départ, c’est une carte qui absorbe la montée en charge sans refonte, et une dette technique évitée.

Ce qu’il faut retenir

Choisir un moteur de rendu cartographique, ce n’est pas comparer trois logos : c’est choisir une architecture qui fixe le plafond de votre application. Leaflet pour la carte simple et légère, OpenLayers pour les besoins SIG et de projection exigeants, MapLibre pour le vectoriel de production amené à grossir. Et la trajectoire du web — du WebGL au WebGPU — confirme que le pari du GPU n’en est pas vraiment un. Le bon moteur n’est pas le plus connu : c’est celui dont l’architecture colle à ce que votre carte devra faire demain, pas seulement aujourd’hui.

Un moteur de rendu ne se choisit pas sur sa popularité, mais sur le plafond qu’il vous laisse — celui que vous toucherez dans trois ans, pas aujourd’hui.

— Mattieu Pottier, MP-i