Produit des transitions douces d'une position à l'autre, sur les fonds de la Géoplateforme IGN, et les exporte en vidéo. Pensé pour le montage d'un sujet TV.
Tout tient dans index.html : pas de build, pas de dépendance, pas de clé d'API.
Ouvrez le fichier dans un navigateur, ou servez-le en statique.
En mode « Un point », déposez un .geojson sur la carte ou passez par le champ
prévu. Sont acceptés FeatureCollection, Feature et géométries nues, en
Point, LineString, Polygon, leurs variantes Multi et GeometryCollection.
- La caméra se recentre sur le tracé, et le cadrage d'arrivée est élargi pour que rien ne soit coupé — une marge de 30 % est laissée autour de l'emprise. Le réglage « cadre d'arrivée » reste une valeur plancher, jamais un plafond.
- Le tracé se dessine entre 55 % et 90 % du mouvement, avec une tête lumineuse en progression, puis reste posé pendant la pause finale.
- La spécification GeoJSON impose le WGS84, mais beaucoup de fichiers français circulent en Lambert-93. Azimut le détecte et convertit. L'inverse est validé contre pyproj : écart maximal 0,013 cm sur la France.
- Le nom vient de
properties.name,nom,labeloutitle, et sert de titre incrusté. Les Point nommés portent leur étiquette à côté du repère.
Un point — descente verticale depuis un cadre large jusqu'au point visé.
D'un point à l'autre — on décolle du départ, on monte, on traverse, on redescend sur l'arrivée. La trajectoire suit van Wijk et Nuij (2003), l'unique chemin où la vitesse perçue reste constante : sans lui, la traversée au sommet paraît glisser trop vite et la descente traîne.
La largeur au sommet vaut w0·cosh(r0), relation qui s'inverse — « cadre de
départ » fixe donc directement l'altitude du survol, et le paramètre ρ s'en
déduit. Il est borné à 3, si bien qu'un trajet court ne part pas dans l'espace :
deux quartiers de Lyon culminent à 9 km de large, Nantes–Rennes à 452 km.
Le rythme « Départ et arrivée doux » atteint trois fois la vitesse moyenne à mi-parcours — exactement là où se fait la traversée. Le mode trajet bascule donc sur « Survol régulier », qui monte en vitesse sur les premiers 22 % du temps, la maintient constante, puis redescend : pointe à 1,28 fois la moyenne seulement.
La largeur des rampes se règle par la constante EASE_ENDS en tête de script.
EASE_ENDS |
vitesse à mi-parcours |
|---|---|
| 0.10 | ×1,11 — traversée très posée, départ plus sec |
| 0.22 | ×1,28 — réglage livré |
| 0.40 | ×1,67 — départ moelleux, traversée plus vive |
Deux autres leviers calment le mouvement : allonger la durée, ou augmenter « cadre de départ ». Monter plus haut réduit la distance parcourue en nombre d'écrans, donc la vitesse perçue.
Un trajet coûte environ 1,6 à 1,8 fois les tuiles d'un zoom simple sur longue distance, et moins qu'un zoom simple en deçà de quelques kilomètres.
À l'ouverture, la photo aérienne de la France s'affiche, au niveau le plus fin utile à cette échelle. Si l'ortho n'est pas servie à cette altitude, l'écran retombe de lui-même sur le plan IGN. Cliquez dessus pour viser un point : Azimut interroge le géocodage inverse pour en retrouver le nom.
- Choisissez le mouvement en haut du panneau.
- Cliquez sur la carte, ou saisissez une adresse, un lieu-dit, ou
48.8584, 2.2945. En mode trajet, le clic renseigne le point encadré, et passe à l'arrivée une fois le départ posé. - Réglez la durée, le cadre de départ et d'arrivée, le rythme.
- Lancer l'animation précharge les tuiles puis joue le plan.
- Enregistrer la vidéo rejoue le plan et télécharge un WebM.
| Qualité | Débit en 1080p25 | Usage |
|---|---|---|
| Standard | ~8 Mb/s | diffusion web, repérage |
| Haute | ~18 Mb/s | montage courant |
| Maximale | ~34 Mb/s | plan large ou très détaillé |
| Images PNG | sans perte | master de diffusion |
Le débit est calculé à partir du format et de la cadence : un zoom plein cadre n'offre aucune zone statique à l'encodeur, il lui faut bien plus de bits par pixel qu'une scène ordinaire.
La cadence par défaut est 25 i/s, celle de la diffusion française. Elle compte
double : à débit égal, 25 i/s laisse deux fois plus de bits par image que 50,
et laisse à l'encodeur VP9 deux fois plus de temps, celui-ci travaillant en
temps réel dans MediaRecorder.
Pour un master sans aucune perte, choisissez « Images PNG » : le rendu devient déterministe, image par image, sans contrainte de temps réel. L'archive s'importe comme suite d'images dans n'importe quel logiciel de montage, ou se convertit :
ffmpeg -framerate 25 -i %05d.png -c:v prores_ks -profile:v 3 plan.mov
Pour convertir un WebM :
ffmpeg -i azimut-mont-saint-michel.webm -c:v prores_ks -profile:v 3 plan.mov
Flux WMTS ouverts de la Géoplateforme, sans clé :
| Couche | Identifiant | Zoom max |
|---|---|---|
| Photographies aériennes | ORTHOIMAGERY.ORTHOPHOTOS |
20 |
| Plan IGN v2 | GEOGRAPHICALGRIDSYSTEMS.PLANIGNV2 |
19 |
Géocodage via data.geopf.fr/geocodage, avec repli sur la Base Adresse Nationale.
Toute image produite doit porter la mention « © IGN — Géoplateforme ». Elle est incrustée automatiquement et n'est pas désactivable.
Le rendu est un pipeline WebGL de tuiles Web Mercator.
- Préchargement intégral. Avant lecture, la trajectoire complète est simulée et l'union exacte des tuiles nécessaires est téléchargée. Aucune requête réseau pendant l'animation, donc aucun à-coup à l'enregistrement.
- Fondu entre niveaux. Le niveau courant est dessiné opaque, le niveau suivant en fondu par-dessus. Le passage d'un niveau à l'autre est une opération neutre, ce qui rend le changement de résolution invisible.
- Rotation d'arrivée. Optionnelle, elle ne joue pas pendant la descente : la
vitesse monte en douceur à partir de 72 % du mouvement et se maintient pendant
la pause finale, pour que l'image posée ne soit pas parfaitement figée. Environ
3° sur un plan de 14 s. C'est l'intégrale d'une vitesse qui démarre à zéro,
donc sans à-coup, et fonction du temps seul : chaque relecture est identique.
Réglages dans la constante
ROT. - Netteté à l'arrivée. Sur les derniers 14 % du mouvement, le niveau affiché devient celui dont la résolution native est la plus proche de celle de l'écran, et non celui que dicte le réglage de finesse. Les tuiles concernées sont presque toujours déjà chargées, donc le gain est gratuit.
- Chargement borné. Chaque tuile est demandée par
fetch, avec abandon à 5 s et deux nouvelles tentatives. Un code 4xx n'est jamais retenté : la donnée n'existe pas là, insister coûte trois requêtes pour rien. Huit requêtes en parallèle, au-delà HTTP/2 commence à réinitialiser des flux. - Couverture détectée, pas supposée. Si la photo aérienne répond majoritairement 404 sur un niveau, ce niveau est rebasculé sur le plan IGN et rechargé. La bascule est constatée à l'exécution, donc elle suit l'évolution des pyramides IGN sans qu'on ait à coder une limite en dur.
- Tolérance aux trous. Une tuile qui n'a pas répondu est retentée deux fois, puis remplacée à l'affichage par le quartier correspondant de sa tuile parente. Un échec réseau se traduit par une zone légèrement floue, jamais par un carré vide.
- Précision. La conversion mercator vers coordonnées écran se fait en double précision côté JS ; seul le rectangle NDC est transmis au GPU. En float32 dans le shader, l'image se mettrait à cranter au-delà du zoom 15.
- Rendu accentué. Passe d'étalonnage optionnelle en shader : masque flou à
seuil doux, saturation, contraste. Le seuil est essentiel — sans lui,
l'accentuation amplifierait autant le blocking JPEG des tuiles que les vrais
contours. Réglages dans la constante
BOOSTen tête de script. L'étalonnage s'applique à l'image cartographique seule, jamais au cartouche ni à l'échelle, qui sont composés ensuite en 2D. - Composition 2D. Le WebGL rend hors écran, un canvas 2D ajoute le vignettage, le repère, le cartouche et l'échelle. C'est ce canvas qui est capturé.
- L'export sort en WebM (VP9). Safari n'enregistre pas ; utilisez Chrome, Edge ou Firefox.
- L'ortho plafonne au zoom 20. En deçà de ~150 m de large, l'image est agrandie.
- Les tuiles restent en VRAM sans éviction. Une longue session multiplie les lieux et peut dépasser 300 Mo ; recharger la page suffit.
- Aux zooms faibles, l'ortho ne couvre que la France. Pour un cadre de départ large, préférez « Photo aérienne puis plan IGN », qui bascule sur le plan à partir du niveau 16, soit environ 3 km de large.
index.html toute l'application, sans dépendance ni build
assets/ign_logo.png logo incrusté dans le cartouche vidéo
assets/azimut-*.svg identité Azimut : lockup blanc, encre, adaptatif, icône
tools/embed-logo.py produit une version à fichier unique, logo en base64
Le logo est chargé depuis assets/. Ouvrir index.html en double-cliquant place la
page en origine file://, ce qui altère le canvas et ferait échouer l'export vidéo :
l'application le détecte, prévient, et retombe sur un bloc IGN dessiné.
Passez donc par un serveur :
python -m http.server 8000
puis http://localhost:8000/. La version publiée sur GitHub Pages n'a pas ce problème.
Pour un fichier unique distribuable, qui fonctionne même en double-clic :
python tools/embed-logo.py # ecrit azimut-autonome.html
L'interface utilise Public Sans (SIL Open Font License), la police du US Web Design System : même squelette dérivé du Franklin Gothic que Marianne, proportions étroites et grande hauteur d'x, sans restriction d'usage.
Marianne est volontairement écartée : sa licence réserve son emploi à la communication de l'État. Le mot « Azimut » du logo est en Barlow Condensed, déjà vectorisé dans les SVG livrés, donc sans dépendance au chargement d'une police.