Générer d'avance toute la pyramide jusqu'au natif, plafonner la carte au zoom 19 et reprendre les dalles refusées par la file pleine

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Antoine Jacquin
2026-09-27 13:00:49 +02:00
parent 34152269aa
commit 3d415de86c
7 changed files with 149 additions and 43 deletions

View File

@ -79,17 +79,22 @@ Découverte : `/tiles/{couche}.json` (TileJSON 3.0.0), `/tiles/wmts.xml`
Le bouton **« Utiliser dans JOSM / QGIS »** de la carte affiche et copie ces
URL pour la couche choisie.
## Stockage réduit de la pyramide
## Pyramide complète générée d'avance
Pour une petite machine (Raspberry Pi 5), la pyramide n'écrit sur disque que
les niveaux **pairs** en numérotation OSM standard, jusqu'à
`LIDAR_TILE_CACHE_MAX_Z` (16), en AVIF. Les autres niveaux, dont le plus fin
qui pèse à lui seul environ 75 % de la pyramide, sont rendus à la volée
depuis les sous-tuiles, avec un cache mémoire (`LIDAR_TILE_MEMORY_CACHE_MB`,
64 Mo), y compris en mode cache seule. L'interface ne demande que les niveaux
pairs : à un zoom impair, elle réduit les tuiles du niveau supérieur (nettes).
Mesuré sur 8 dalles : environ 24 Mo de pyramide avant, 1,2 Mo après.
`LIDAR_TILE_EVEN_LEVELS=0` rétablit le stockage de tous les niveaux.
Par défaut, **tous** les niveaux jusqu'au natif (19 en numérotation OSM
standard = 0,2 m/px, servi en `18@2x` par l'interface) sont écrits sur
disque en AVIF et générés d'avance par la maintenance de fond (sur une carte
alimentée par l'amont : téléchargés depuis `LIDAR_MAPS_URL`). Aucun niveau
n'est rendu à la volée : le rendu à la demande d'un Raspberry Pi (~170 ms par
tuile, 3 à la fois) donnait 1,5 à 6 s par écran aux zooms 17–19. L'interface
est plafonnée au zoom 19 (1 px écran = 1 px LiDAR) : jamais de tuile
agrandie. Ordre de grandeur mesuré : ~110 000 tuiles @2x pour 3 240 dalles,
dont 81 000 au niveau natif, ~5 Go.
Stockage réduit (disque compté) : `LIDAR_TILE_CACHE_MAX_Z` plus bas et/ou
`LIDAR_TILE_EVEN_LEVELS=1` (niveaux pairs seuls ; l'interface réduit alors
les tuiles du niveau supérieur aux zooms impairs, les autres niveaux sont
rendus à la volée avec un cache mémoire `LIDAR_TILE_MEMORY_CACHE_MB`).
Une carte alimentée par un serveur de dalles amont (`LIDAR_SOURCE_URL`, cas
du Pi) rapatrie et **garde localement** les sources de chaque dalle dès
@ -261,8 +266,7 @@ environment:
transparente avec `X-Tile-Pending: 1` et `Cache-Control: no-store` (le
navigateur la redemande : dès que la maintenance l'a rendue, elle apparaît).
Plus aucun rendu local sur le chemin des requêtes ; avec `LIDAR_MAPS_URL`,
une tuile manquante (ex. zoom au-delà de `LIDAR_TILE_BACKGROUND_MAX_Z`)
y est rapatriée — un téléchargement de quelques dizaines de Ko, mis en
une tuile manquante (pas encore passée par la maintenance) y est rapatriée — un téléchargement de quelques dizaines de Ko, mis en
cache — puis servie : la navigation couvre tous les zooms sans jamais
calculer sur la petite machine.
- **`LIDAR_TILE_BACKGROUND=1`** — un sondeur rescane les dalles à intervalle
@ -277,12 +281,12 @@ environment:
| Variable | Défaut | Rôle |
|---|---|---|
| `LIDAR_TILE_BACKGROUND_MAX_Z` | `16` | niveau maximal entretenu en fond (le natif 17–19 reste au pré-chauffage manuel) |
| `LIDAR_TILE_BACKGROUND_MAX_Z` | natif (`18` en @2x, `19` en 256 px) | niveau maximal entretenu en fond, numérotation des URL |
| `LIDAR_TILE_BACKGROUND_SCALE` | `2` | tuiles entretenues : 2 = 512 px (celles de l'interface) |
| `LIDAR_TILE_BACKGROUND_FMT` | `webp` | format des tuiles entretenues (celui de l'interface) |
| `LIDAR_TILE_BACKGROUND_PAUSE` | `1.0` | pause (s) entre deux rendus — le levier de la discrétion |
| `LIDAR_TILE_BACKGROUND_INTERVAL` | `120` | secondes entre deux scans des dalles |
| `LIDAR_TILE_BACKGROUND_QUEUE_MAX` | `65536` | file d'attente bornée (au-delà : ignoré jusqu'au prochain scan) — une entrée ne coûte que quelques octets |
| `LIDAR_TILE_BACKGROUND_QUEUE_MAX` | `65536` | file d'attente bornée — chaque dalle mémorise la première tuile refusée faute de place et reprend de là aux scans suivants, jusqu'à ce que toute sa pyramide soit passée |
Pilotage : `GET /api/map/background` (état, compteurs, file), `POST
/api/map/background` (scan immédiat), `POST /api/map/warm` (pré-calcul manuel