Commit Graph

199 Commits

Author SHA1 Message Date
2d5a9b2a46 Assombrir les tuiles OSM pour supprimer les cadres blancs au dézoom
Les tuiles OpenStreetMap standard ont un fond blanc : au dézoom, les zones
sans données LiDAR laissent apparaître ce blanc à travers l'opacité du pane
(45 %), créant des cadres blancs autour des tuiles. Un filtre CSS
(brightness 0.35 + contrast 1.1 + saturate 0.7) assombrit le fond OSM pour
le fondre dans le thème sombre de la carte.
2026-09-20 17:29:11 +02:00
e0173e0b39 Rendre les tuiles jointives sur la carte et supprimer le cadre blanc au dézoom
Les sous-tuiles voisines ne partageaient pas leurs bords (interpolation
bilinéaire évaluée deux fois sur des fractions différentes), créant une ligne
claire entre images au zoom moyen. Les points de bord sont désormais calculés
une fois par dalle et partagés entre sous-tuiles adjacentes.

Le cadre blanc autour des tuiles au dézoom venait du outline CSS dessiné
par-dessus les bords d'images non jointives : supprimé (le survol garde son
halo). La bascule overview ↔ vignettes oscillait d'un cran de zoom, d'où une
hystérésis. Les seuils de paliers sont revus pour ne jamais étirer la
vignette intermédiaire au-delà de 1:1.
2026-09-20 16:47:26 +02:00
5f03359fc3 Preset « plop » comme configuration par défaut des couches
La config enregistrée (aspect 74 % en bas, openness positive au-dessus,
fond OSM sombre) devient le preset intégré « Défaut » et les défauts du
panneau. DEFAULT_VIZ reste le relief archéologique (positive_openness).
2026-09-20 15:18:28 +02:00
1d722ff10c Ne pas générer d overview locale sur la webapp légère (géométrie divergente du worker) 2026-09-20 01:05:08 +02:00
b622d55720 Résoudre paresseusement la div des mosaïques d overview (icône non posée à l eval) 2026-09-20 00:57:46 +02:00
b5f3faa14d Projeter les coins du bbox de zone (PROJ) au lieu d exiger un rectangle plein 2026-09-20 00:45:45 +02:00
eec8421f23 Une mosaïque d overview par zone géographique, pas une grille globale 2026-09-20 00:40:32 +02:00
4a13cdb3f5 Tolérer les coquilles HTML sans const OVERVIEW (alias gardé dans app.js) 2026-09-20 00:28:59 +02:00
342a0d2213 Vue dézoomée en mosaïque d'overview et cache immutable des images versionnées 2026-09-20 00:26:18 +02:00
3236d56a4b Isoler les dalles voisines de raccord dans input/edge_neighbors/ 2026-09-19 23:43:50 +02:00
5ef0232c80 Workers parallèles adaptatifs : -w auto = cœurs - 2, résolu au lancement de chaque run 2026-09-19 21:58:47 +02:00
900bf5ee89 Réessayer le sous-tuilage quand la dalle source est en cours d'écriture 2026-09-19 21:43:56 +02:00
3a374a3ab4 AVIF q60 par défaut et sélecteur de mode de fusion par couche 2026-09-19 21:26:13 +02:00
5f018fe2b6 Raccorder les bords de tuiles voisines et encadrer les rendus en cours
Le MNT de chaque dalle s'étend d'une bande de 100 m remplie avec les
points sol des 8 tuiles voisines (option « Raccord des bords ») : les
rendus à grand noyau (openness, SVF, LRM) deviennent continus d'une
dalle à l'autre, les images restent recadrées sur le kilomètre exact.

Pendant une génération, la carte encadre les dalles du run : orange
pulsant en cours de rendu, rouge en échec — les coins WGS84 sont portés
par /api/status pour toutes les dalles non terminées.

La file de génération trie les dalles du nord au sud et passe à 10
workers GPU.
2026-09-19 20:44:44 +02:00
204b2ad111 Preset Défaut : masquer la pente (openness + aspect 50 % + fond OSM 30 %) 2026-09-19 19:08:45 +02:00
2310676886 Preset Défaut : fond OSM visible à 30 % sous la pile de couches 2026-09-19 19:07:21 +02:00
4c189834c6 Inverser la pile du preset Défaut : openness en base, aspect 50 %, pente au sommet 2026-09-19 19:06:43 +02:00
2751d0fea1 Préconfiguration intégrée unique (pente 0, aspect 50, openness 100) 2026-09-19 19:03:56 +02:00
9546173c07 Préréglage carte par défaut et serve-webapp.sh compatible Traefik 2026-09-19 11:05:16 +02:00
e8a9b0187c Porter la carte au zoom 20 et passer le worker à 5 workers 2026-09-19 10:55:44 +02:00
41206f65de Caler les faisceaux de vol, décimer l'openness et cibler les couches affichées
Trois chantiers liés à la qualité et au coût des rendus :

- Calage vertical des faisceaux : les passes d'une tuile peuvent être biaisées
  de quelques cm (±2,5 cm mesurés sur 1000_6882), créant des marches aux
  recouvrements. Les offsets par PointSourceId sont mesurés sur les points
  sol de la tuile (réf. médiane itérée) et retranchés ≥ 0,5 cm avant
  rastérisation, avec sidecar de cache et application au plancher bare-earth.
- Openness décimée ×2 : lancé de rayons sur grille par blocs (max/min) puis
  rééchantillonnage bilinéaire — 532 s → 40 s par tuile à 0,2 m sur CPU,
  signal archéologique préservé. Réglable --openness-downsample.
- Génération webapp concentrée sur les couches affichées : les défauts
  /api/generate, /api/preview et le sélecteur génèrent le panneau complet
  (slope, aspect, pos_open) au lieu d'aspect seul.
2026-09-19 00:53:22 +02:00
796e68c870 Supprimer le code mort (imports inutilisés, variable _xp, conseil GPU inatteignable) 2026-09-18 21:31:19 +02:00
91d31bcdf9 Numéroter les zones après tri, lire le journal par la fin et corriger l'aide -g 2026-09-18 21:24:57 +02:00
f3708f8449 Journaliser les replis CPU du GPU et retirer une copie VRAM inutile 2026-09-18 21:23:39 +02:00
93d1656d9f Coller les dalles directement dans le canevas habillé (pic mémoire divisé par 2) 2026-09-18 21:22:53 +02:00
5e13151998 Fermer les images PIL et borner le cache de cartes de localisation 2026-09-18 21:20:14 +02:00
394dd27375 Rendre robustes les tuiles WMTS IGN : retry, urlencode, User-Agent, latitude bornée 2026-09-18 21:19:28 +02:00
777b0c3f98 Téléchargement IGN atomique (.part + rename) et pagination du catalogue STAC 2026-09-18 21:18:06 +02:00
fd5ad283f7 Comparer le token d'API à temps constant 2026-09-18 21:16:23 +02:00
de8d84b94b Échapper les noms de dalles injectés dans l'interface (HTML et <script> inline) 2026-09-18 21:16:01 +02:00
1eed1f2029 Toujours supprimer le LAS temporaire du repli PDAL, même en échec 2026-09-18 21:13:22 +02:00
340743abe0 Poser le processus du job avant son fil de veille (double lancement possible) 2026-09-18 21:12:51 +02:00
c8c9f64db1 Plafonner la passe globale de complétion comme dans /api/preview 2026-09-18 21:12:18 +02:00
fbb56936f8 Étiqueter les événements de progression par run pour filtrer les retardataires 2026-09-18 21:11:47 +02:00
ecd21d5b46 Borner le nettoyage PDAL à notre run et supprimer le pkill à chaque sortie 2026-09-18 21:09:32 +02:00
bb086e308a Rendre effectif le délai de sécurité de 2 h des workers parallèles 2026-09-18 21:08:25 +02:00
4cdbf5a0e4 Rejeter proprement les tuiles 100 % nodata en détection d'anomalies 2026-09-18 21:07:32 +02:00
4c8fa68f71 Sol nu : ramener aussi les cellules sans mesure au retour le plus bas 2026-09-18 21:07:01 +02:00
c8e3b6abd9 Diviser le gradient par la résolution hors chemin partagé (pentes fausses) 2026-09-18 21:06:25 +02:00
476f246fe7 Masquer le nodata avant étalonnage colormap et colorbar en unités réelles 2026-09-18 21:05:55 +02:00
3c19dc4226 Blinder la normalisation terrain contre les tuiles d'altitude constante 2026-09-18 21:04:13 +02:00
92197e3e57 Restaurer le rayon réel de 100 m pour SVF et openness à 0,2 m 2026-09-18 21:03:24 +02:00
6d96da6546 Fusionner l'index du worker dans la coquille au rebuild (1er chargement complet)
- Sur la webapp légère, le rebuild ne voyait que le cache local : la
  coquille HTML embarquait un sous-ensemble des tuiles et le premier
  chargement n'affichait pas les tuiles récentes du worker — elles
  n'arrivaient qu'au sondage /api/tiles suivant (15 s).
- _merge_remote_index() applique au rebuild la même fusion que
  /api/tiles (l'index distant prime, le local complète) et réécrit
  index_tiles.json ET la liste embarquée dans index.html.
- AGENTS.md : avertissement — le Pi de prod tourne en compose+override
  (labels Traefik + /srv/lidar/output), jamais via serve-webapp.sh.
2026-09-17 08:01:01 +02:00
a87d049ef6 Bâcher l'interface dans l'image complète aussi, repli inscriptible
- Le Dockerfile principal (worker, --serve, local-2m) n'avait pas l'étape
  de bake : le repli de webapp.py tentait d'écrire webapp_assets/ dans le
  paquet installé (dist-packages, propriété de root) et faisait planter
  l'import de la webapp sous l'utilisateur lidar.
- Même étape de bake que Dockerfile.webapp, avec cd /tmp pour cibler le
  paquet installé (sinon la copie source /app capte l'import via sys.path).
- Le repli de webapp.py ne casse plus l'import si le dossier du paquet
  n'est pas inscriptible : réécriture dans un répertoire temporaire.
2026-09-17 07:46:14 +02:00
ac182da55e Sert l'interface (app.js/app.css) depuis l'image, plus depuis le volume
- Les assets de l'interface étaient écrits dans le volume (output/assets)
  et servis d'ici : sur la webapp légère, un app.js périmé restait servi
  même après rebuild de l'image.
- app.js/app.css (+ Leaflet vendorisé) sont désormais bâchés dans l'image
  au build (Dockerfile.webapp) et servis depuis l'image ; le volume ne
  porte que les données (index.html, vignettes, tuiles).
- _write_ui_assets() génère les assets dans un dossier cible ; repli de
  régénération au démarrage si non bâchés (dev). build_index continue
  d'écrire output/assets/ pour le mode serveur statique.
2026-09-17 00:42:12 +02:00
6fb2c4ee97 Ne plus réadopter les runs de génération vidés au rechargement de la page
- Le bouton « Vider » ne retirait que les tâches du côté client : au
  rechargement, la « dernière génération » du serveur
  (.generation.job.json) était réadoptée et les tâches finies
  réappaissaient.
- Les runs retirés sont mémorisés par horodatage serveur (sessionStorage) ;
  l'adoption au chargement les ignore désormais.
- Les tâches lancées immédiatement (sans passer par la file) captent
  l'horodatage de leur run à la fin, pour être retirables sans réadoption.
2026-09-16 23:48:27 +02:00
f024514427 Sélection de tuiles au clic, file d'attente et rafraîchissement fiable
- Clic sur la carte pour choisir des dalles précises, même sans données
  existantes (via /api/cell) ; les zones dessinées s'ajoutent à la
  sélection au lieu de la remplacer
- Une demande lancée pendant un run part en file d'attente côté serveur
  et démarre à la fin du travail en cours (plus de refus 409), file
  vidable depuis l'interface
- Tuiles et interface toujours fraîches : images servies sans cache
  navigateur (revalidation 304), rechargement de la carte seulement une
  fois le rebuild de l'index terminé
- serve-webapp.sh : sous-commande update retirée, documentation de
  déploiement corrigée en conséquence
2026-09-16 22:37:53 +02:00
26c05319fd Tuiles jointives : grille en outline et assets versionnés
La bordure 1px des tuiles insettait l'image (box-sizing: border-box) et
creusait un espace vide entre deux tuiles ; la grille est désormais un
outline dessiné par-dessus le bord des images, sans consommer de place
(hover/sélection/export/régénération adaptés). Les URLs de app.css et
app.js portent un hash de contenu : chaque évolution force le
rechargement chez tous les navigateurs, même avec une entrée de cache
antérieure aux en-têtes no-cache.
2026-09-16 21:42:46 +02:00
328af123ad Zoom animé : tuiles scalées d'un bloc comme le fond de carte
Les marqueurs Leaflet glissent pendant l'animation de zoom sans changer
de taille : les tuiles LiDAR nageaient sur le fond OSM puis sautaient à
la fin du zoom. Elles vivent désormais dans un pane dédié (lidarTiles)
qui reçoit la même mise à l'échelle que les couches de dalles (translate
+ scale au zoomanim, transition CSS partagée leaflet-zoom-animated) ;
markerZoomAnimation est désactivé pour éviter le double mouvement.
2026-09-16 21:34:44 +02:00
daed457adb Alléger la carte : rugosité retirée, vignettes 160 px, cap mémoire
Retire la couche Rugosité du panneau (DEFAULT_LAYERS restreint panneau,
presets et sélecteur de génération). Réduit la mémoire du navigateur :
vignettes de sous-tuiles à 160 px (régénérées sans ré-encoder les AVIF),
pleine résolution plafonnée à 24 images les plus proches du centre, src
des <img> libéré hors écran. Les changements de palier pré-décodent
l'image avant échange (zoom et pan sans flash).
2026-09-16 21:23:24 +02:00