Photos aériennes IGN et cadastre dans Leaflet

Brancher les services WMTS/WMS de la Géoplateforme et un cadastre qui suit la commune au centre de l'écran.

La Géoplateforme de l'IGN diffuse gratuitement et sans clé les photographies aériennes, les limites administratives ou le parcellaire. Le cadastre de la DGFiP, lui, est publié commune par commune. Ce tutoriel montre comment brancher tout cela dans Leaflet, avec un cadastre qui suit automatiquement la commune au centre de l'écran, comme sur les cartes de ce site.

WMTS ou WMS ?

WMTSWMS
PrincipeTuiles pré-calculées, découpage fixeImage calculée à la demande pour chaque requête
VitesseTrès rapide, mise en cache facilePlus lent
SouplesseProjection et styles imposésProjection, styles et couches au choix
Dans LeafletL.tileLayer(url)L.tileLayer.wms(url, options)

Règle simple : WMTS pour les fonds (photos, plans), WMS pour les couches thématiques superposées et transparentes.

La photo aérienne en WMTS

La Géoplateforme publie l'ortho en tuiles Web Mercator (tilematrixset=PM). Les paramètres TileMatrix, TileCol et TileRow correspondent exactement aux {z}, {x} et {y} de Leaflet :

const map = L.map('map').setView([45.899, 6.129], 16);

const ortho = L.tileLayer(
  'https://data.geopf.fr/wmts?layer=ORTHOIMAGERY.ORTHOPHOTOS&style=normal&tilematrixset=PM' +
  '&Service=WMTS&Request=GetTile&Version=1.0.0&Format=image/jpeg' +
  '&TileMatrix={z}&TileCol={x}&TileRow={y}',
  { attribution: '© IGN', tileSize: 256, minZoom: 0, maxZoom: 19 }
).addTo(map);

Couches WMS superposées

Le point d'accès WMS « raster » de la Géoplateforme est https://data.geopf.fr/wms-r/wms. On choisit la couche avec layers, et transparent: true permet de la poser sur la photo :

const WMS = 'https://data.geopf.fr/wms-r/wms';

// Photographies anciennes (campagnes 2011-2015), utilisables comme fond alternatif
const orthoAncienne = L.tileLayer.wms(WMS, {
  layers: 'ORTHOIMAGERY.ORTHOPHOTOS2011-2015',
  format: 'image/png', styles: '', transparent: true, version: '1.3.0',
  maxZoom: 25, attribution: '© IGN'
});

// Parcellaire Express : le parcellaire cadastral diffusé par l'IGN
const parcellaire = L.tileLayer.wms(WMS, {
  layers: 'CADASTRALPARCELS.PARCELLAIRE_EXPRESS',
  format: 'image/png', styles: '', transparent: true, version: '1.3.0',
  minZoom: 12, maxZoom: 20, attribution: '© IGN'
});

// Limites communales, départementales et régionales
const limites = L.tileLayer.wms(WMS, {
  layers: 'ADMINEXPRESS-COG.2024',
  format: 'image/png', styles: '', transparent: true, version: '1.3.0',
  minZoom: 6, maxZoom: 16, attribution: '© IGN'
}).addTo(map);

minZoom et maxZoom évitent d'interroger le serveur à des échelles inutiles : le parcellaire n'a aucun intérêt vu de toute la France, et chaque requête WMS coûte un calcul côté serveur.

La liste complète des couches disponibles se trouve dans le GetCapabilities du service :

https://data.geopf.fr/wms-r/wms?SERVICE=WMS&REQUEST=GetCapabilities

Le sélecteur de couches

L.control.layers(
  { 'Photographies aériennes': ortho, 'Photos 2011-2015': orthoAncienne },  // fonds : un seul actif
  { 'Limites administratives': limites, 'Parcellaire Express': parcellaire } // surcouches cumulables
).addTo(map);

Le cadastre DGFiP, commune par commune

Le service WMS du cadastre (inspire.cadastre.gouv.fr) est organisé par commune : l'adresse contient le code INSEE, par exemple …/scpc/74010.wms pour Annecy. Pour une carte qui se déplace, il faut donc trouver la commune au centre de l'écran et changer l'URL du WMS à la volée.

L'API publique geo.api.gouv.fr renvoie la commune correspondant à un point :

https://geo.api.gouv.fr/communes?lat=45.899&lon=6.129&fields=code,nom&format=json
→ [{"code":"74010","nom":"Annecy"}]

Il reste à écouter les déplacements de la carte :

const COMMUNE_LAYERS = 'AMORCES_CAD,LIEUDIT,CP.CadastralParcel,SUBFISCAL,CLOTURE,' +
                       'DETAIL_TOPO,HYDRO,VOIE_COMMUNICATION,BU.Building,BORNE_REPERE';
const cadastre = L.layerGroup();      // conteneur affiché dans le sélecteur de couches
let wmsCadastre = null, codeInsee = null, timer = null;

async function majCadastre() {
  if (!map.hasLayer(cadastre) || map.getZoom() < 13) return;
  const c = map.getCenter();
  const url = `https://geo.api.gouv.fr/communes?lat=${c.lat}&lon=${c.lng}&fields=code,nom&format=json`;
  let res = await (await fetch(url)).json();

  // Paris, Lyon et Marseille : le cadastre est publié par arrondissement
  if (res[0] && ['75056', '69123', '13055'].includes(res[0].code)) {
    res = await (await fetch(url + '&type=arrondissement-municipal')).json();
  }
  if (!res[0] || res[0].code === codeInsee) return;   // hors France ou commune inchangée
  codeInsee = res[0].code;

  const wmsUrl = 'https://inspire.cadastre.gouv.fr/scpc/' + codeInsee + '.wms';
  if (wmsCadastre) {
    wmsCadastre.setUrl(wmsUrl);                        // on recycle la couche existante
  } else {
    wmsCadastre = L.tileLayer.wms(wmsUrl, {
      layers: COMMUNE_LAYERS, format: 'image/png', transparent: true,
      version: '1.3.0', minZoom: 13, maxZoom: 20, attribution: '© DGFiP'
    });
    cadastre.addLayer(wmsCadastre);
  }
}

// On attend la fin du déplacement (350 ms) pour ne pas bombarder l'API
map.on('moveend', () => { clearTimeout(timer); timer = setTimeout(majCadastre, 350); });
cadastre.on('add', majCadastre);

Pourquoi un layerGroup ? Le sélecteur de couches a besoin d'un objet stable, alors que la couche WMS réelle n'existe qu'une fois la première commune connue. Le groupe sert d'enveloppe : on le coche dans le sélecteur, et il contient la couche WMS dont on change l'URL avec setUrl().

Seule la commune du centre est affichée : en bordure de commune, le cadastre voisin n'apparaît pas tant que le centre de l'écran n'a pas franchi la limite. Pour une couverture continue sur plusieurs communes, utilisez plutôt la couche Parcellaire Express de l'IGN.

Bonnes pratiques

  • Affichez toujours les attributions (« © IGN », « © DGFiP ») : c'est une condition de la licence.
  • Dans un sélecteur de couches, mémorisez le choix de l'utilisateur (baselayerchange, overlayadd) dans le localStorage.
  • Sur un site à fort trafic, consultez les conditions d'utilisation de la Géoplateforme (cartes.gouv.fr).

Les outils CartoForge utilisent les mêmes services et le même principe de cadastre qui suit la commune, adaptés à MapLibre (bouton 🗂️ en haut à droite des cartes).

Démonstration

Le code de ce tutoriel, assemblé et en fonctionnement, centré sur Annecy :

À essayer : déplacez la carte vers une commune voisine (Annecy-le-Vieux, Seynod…) et regardez la pastille en bas à gauche : le cadastre change de commune quand le centre de l'écran franchit la limite. Cochez Parcellaire Express pour comparer, passez aux Photos 2011-2015, et dézoomez sous le niveau 13 : le cadastre s'efface.