Commit Graph

93 Commits

Author SHA1 Message Date
7b8060e893 Ajouter le curseur d'intensité du relief, mémorisé et partagé dans le lien
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-27 20:24:42 +02:00
90663405f7 Remplacer la bulle et la fiche détaillée de dalle par un onglet Dalle du panneau
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-27 20:22:07 +02:00
0df93c2f00 Borner la barre de comparaison hors du panneau et des outils, poignée au-dessus du volet
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-27 19:54:00 +02:00
857a9e55d6 Ajouter le mode Comparer à barre glissante et retirer le mode « les deux »
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-27 19:44:16 +02:00
efabf06bc7 Remplacer le mode « les deux » par « comparer » et servir le texte « Comment lire » à la carte et au PDF
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-27 19:35:28 +02:00
72c50dca99 Fix round 2 : fermer le cadre d'export sous la fiche détaillée en toutes circonstances, ne pas la recadrer au retour, réarmer BOOTSTRAPPING sur échec
panelVisibleTab() renvoie null tant que la fiche détaillée est ouverte,
quel que soit ce qui redéclenche panelRender (grip, redimensionnement,
changement phoneQuery…) : le cadre d'export ne rouvre plus derrière elle.
Rétablir l'onglet Export après un retour (restoreTabAfterDetails / M5)
repose désormais le cadre sans recadrer la vue ni le recentrer
(nouveau drapeau RESTORING_TAB, distingué d'une ouverture explicite par
l'utilisateur). BOOTSTRAPPING est aussi réarmé quand /api/map/meta échoue,
pour qu'une ouverture explicite ultérieure de l'onglet recadre bien la vue.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-27 19:21:50 +02:00
72b10cd228 Corriger la revue stage1 de la refonte : fiche de dalle, thème du fond, cadre d'export, tokens de couleur
Retour/Échap depuis la fiche détaillée ne retouche plus la hauteur du volet
téléphone (openTab remplacé par un rétablissement direct de l'onglet) ; le
fond OSM suit le thème sauf choix explicite (migration du localStorage et des
défauts serveur en v3, plus de dark:true hérité de l'ex-webapp) et part du
bon thème dès sa création (plus de flash sombre) ; l'onglet Export mémorisé ne
recadre plus la vue au premier rendu (lien partagé préservé) et referme son
cadre pendant que la fiche détaillée est ouverte ; la qualité affichée suit le
nom réel de la dalle rendue ; un second clic referme la fiche au lieu de
déplacer son contour derrière elle ; couleurs en dur restantes tokenisées
(--tile-sel, --gps, .gen-log) et lisibles en thème clair ; localStorage
corrompu (lidar-panel, lidar-print) n'y casse plus l'interface.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-27 18:52:30 +02:00
375d53c0b1 Nettoyer le contour de dalle et la référence à la bulle quand on change d'onglet
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-27 18:23:46 +02:00
45455aec93 Remplacer la fiche de dalle flottante par une bulle et une fiche détaillée dans le panneau
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-27 18:17:18 +02:00
a9196d0c97 Rétablir l'onglet Génération mémorisé et ignorer le repli du panneau sur téléphone
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-27 18:06:16 +02:00
b24ebcd83a Regrouper les réglages de la carte dans un panneau unique à onglets, volet en bas sur téléphone
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-27 18:00:59 +02:00
b975ed272a Harmoniser les styles de la carte : réglages communs, thèmes clair et sombre, composants uniques
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-27 17:39:04 +02:00
75a562d6a4 Sortir l'interface de la carte en vrais fichiers web/map.{html,css,js}
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-09-27 17:26:41 +02:00
fe66869cac Poser le cadre d'export PDF sur le terrain, le déplacer par une poignée et recadrer la vue dessus
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-27 16:53:05 +02:00
c1076097f1 Merge branch 'fix-edge-neighbor-duplicates' 2026-09-27 16:35:02 +02:00
c9b7504346 Garder un doublon de voisine si sa taille diffère de la copie d'input/
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-27 16:31:58 +02:00
32d694bbd6 Promouvoir une dalle voisine déjà téléchargée au lieu de la retélécharger, nettoyer les doublons existants
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-27 16:22:12 +02:00
1f8f13dd13 Ajouter le bouton d'export PDF, ses réglages et le cadre imprimable à la carte
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-27 16:21:25 +02:00
7f590ddecf Exposer le cadre imprimable et l'export PDF dans mapserve
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-27 16:11:57 +02:00
3cf5bbce6e Réserver la colonne de la flèche du nord pour que le titre de la cartouche ne la chevauche plus
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-27 16:07:00 +02:00
b85c29e5f1 Corriger le sens de la flèche du nord, éviter les débordements de texte et hachurer les mailles sans donnée de la planche PDF
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-27 16:00:04 +02:00
1336571da7 Dessiner la planche PDF : quadrillage L93, légende, encart qualité et cartouche
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-27 15:47:12 +02:00
94ecba7b3b Agréger la qualité de zone et ajouter les couleurs de légende de la planche PDF
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-27 15:41:08 +02:00
516e4050dd Composer l'image de la planche en Lambert 93 depuis les sources de la pyramide
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-27 15:38:45 +02:00
0955856876 Ajouter la géométrie de planche PDF, l'accès aux sources par emprise L93 et reportlab
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-27 15:35:21 +02:00
3b4d106cc2 Diffuser la qualité des dalles dans l'inventaire et la conserver sur la carte légère
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-27 15:29:06 +02:00
473097257e Écrire le sidecar qualité aussi quand le DTM primaire vient du cache
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-27 15:25:55 +02:00
7d5b5ecd42 Calculer le sidecar qualité après le DTM et ajouter --quality-backfill
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-27 15:17:32 +02:00
1db98c733d Ajouter la mesure de qualité par dalle (densité sol, date d'acquisition) et ses sidecars
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-09-27 15:11:47 +02:00
90dbe61f3b Borner le comblement du MNT à l'enveloppe des points, ajouter la couche précision et un affichage relief/précision, encoder les sous-tuiles une seule fois en q75
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-27 15:07:04 +02:00
c5097e21a0 Télécharger la pyramide du worker sans pause, garder la pause pour le rendu local du Pi
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-27 13:50:49 +02:00
6e1b26986c Afficher le contour de dalle au-dessus des tuiles et ajouter un compteur de tuiles restantes
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-27 13:18:42 +02:00
3d415de86c 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>
2026-09-27 13:00:49 +02:00
34152269aa Afficher la résolution native 0,2 m au lieu d'étirer le niveau 0,4 m
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-27 12:50:53 +02:00
453530ec3a Synchroniser l'animation de zoom du fond et du relief, dater les tuiles à l'horloge précise
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-27 11:52:13 +02:00
147a469ddc Rendre la carte autonome, télécharger la pyramide en fond, refermer les trous de zoom et borner les workers GPU par la VRAM
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-27 11:23:51 +02:00
934e2dab55 Borner la mémoire de la carte (OOM du Pi) et rallumer le relief orienté par défaut
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-27 10:50:03 +02:00
93317dadd0 Garder localement les sources des dalles sur une carte alimentée par l'amont
Avec LIDAR_SOURCE_URL (Pi), la maintenance rapatrie et conserve les sources
de chaque dalle dès qu'elle apparaît, sans attendre de visite : les niveaux
rendus à la volée restent disponibles quand le conteneur de rendu est
éteint. Seuls les paliers utiles sont pris (vignettes, quadrants 500 m ; la
dalle entière, doublon de ses quadrants, ne l'est pas) ; une source manquée
pendant que l'amont était éteint est reprise au scan suivant.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-27 02:34:12 +02:00
434b7f12fd Mettre à jour la pyramide pendant le rendu et réduire son stockage
Le pipeline régénère l'inventaire après chaque dalle par défaut (tous
lanceurs, sauf --no-index), avec une passe différée quand l'anti-rebond
ignore une dalle. La carte surveille l'inventaire toutes les 10 s et place
les tuiles des dalles modifiées en tête de file de maintenance : la
pyramide suit le rendu au lieu d'attendre la fin du lot.

Stockage réduit pour le Raspberry Pi : seuls les niveaux standard pairs
jusqu'à z16 sont écrits sur disque, en AVIF ; les autres, dont le niveau
le plus fin (~75 % de la pyramide), sont rendus à la volée avec un cache
mémoire, y compris en mode cache seule. L'interface ne demande que les
niveaux pairs et réduit ceux du niveau supérieur aux zooms impairs.
Mesuré sur 8 dalles : ~24 Mo de pyramide avant, 1,2 Mo après.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-27 02:31:11 +02:00
f836408d6f Ajouter la fiche de dalle IGN et la rose des vents, imposer la génération
Un clic sélectionne toujours la dalle sous le curseur (cadre sur la carte),
générée ou non : emprise, rendu et recalage des passes s'affichent tout de
suite ; la fiche IGN (date et heure du scan LiDAR, capteurs, mission,
édition, nombre de points, lien de téléchargement du .copc.laz) arrive à
part via /api/map/ign, mise en cache, sans jamais bloquer la sélection.

Une rose des vents donne la couleur de chaque orientation de pente du
relief orienté, avec la même formule CIELAB que le rendu.

La génération impose la classification IGN (sol) et le raccord de 100 m
avec les dalles voisines : plus de réglage dans la carte, défauts CLI
alignés.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-27 01:57:04 +02:00
d32502b74e Recaler les lignes de balayage des passes et accélérer le rendu
Troisième passe du calage vertical : chaque ligne de balayage (décalage et
inclinaison due au roulis) est recalée contre le consensus des autres
faisceaux, à toutes les échelles, avec un profil d'étalonnage par faisceau
et par degré d'angle qui retire les écarts non linéaires en travers de la
fauchée. Les lignes sans recouvrement sont corrigées contre leur propre
faisceau. Efface les lignes en creux et la marche au bord de fauchée
mesurées sur LHD_FXX_0999_6882 (validé sur des blocs jamais vus). Calcul
vectorisé, CuPy si GPU ; la gigue par fenêtres de temps devient inutile
quand scan_angle existe.

Rendu plus rapide : encodage AVIF speed 9 (0,6 s au lieu de 4 s par dalle),
classification IGN par extraction directe laspy au lieu de PDAL (4,9 s au
lieu de 13,5 s), comblement des trous et gradients sur GPU, cache numba
persistant dans l'image.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-27 01:57:04 +02:00
31645a42e8 Faire du relief orienté la seule couche produite et affichée
PANEL_VIZ ne contient plus que relief_oriente et pilote désormais tout :
le pipeline sans --only ne produit que cette couche, la génération lancée
depuis la carte aussi, et la carte ne liste ni ne sert en tuiles (panneau,
XYZ, TileJSON, WMTS, JOSM) les autres visualisations présentes sur disque.
Les autres visualisations restent calculables explicitement avec --only.

Corrige au passage _panel_viz_steps, qui ne retenait que les couches dont
le nom de fichier diffère du nom d'étape : la génération depuis la carte
ne produisait que l'openness positive.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-27 00:10:08 +02:00
0d3c3ba8bc Ajouter la couche relief orienté et une échelle d'openness fixe
Nouvelle visualisation relief_oriente : une image RGB unique qui fusionne
l'openness positive locale (MNT détendancé σ 10 m, rayons 5/10/20 m,
16 directions) portée par la clarté CIELAB et l'orientation des pentes
portée par la teinte. Échelle log fixe et support de 40 m sous la bande
de raccord de 100 m : dalles jointives. Calcul sur grille décimée à 0,8 m,
noyau dédié (CuPy RawKernel, numba parallèle, repli numpy) et colorisation
par table L* × teinte : ~8 s par dalle sur CPU au lieu de ~50 s.

L'openness positive et négative est normalisée par des références figées
mesurées sur 15 dalles au lieu d'un z-score par dalle, qui rendait
l'échelle de couleur non jointive.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-27 00:05:40 +02:00
665ca29984 Rapatrier les tuiles manquantes depuis le serveur amont en mode cache seule
La maintenance de fond plafonne a LIDAR_TILE_BACKGROUND_MAX_Z (16 par
defaut) : les zooms natifs 17-18 de l'interface restaient transparents
sur une machine en cache seule. Une tuile absente du cache est
desormais rapatriee de LIDAR_MAPS_URL (quelques dizaines de Ko, mise en
cache, dedupliquee par verrou) sans aucun rendu local sur le chemin des
requetes.
2026-09-25 20:27:46 +02:00
0a2ccee958 Porter la génération de tuiles dans lidar-maps et retirer l'ancienne webapp
La carte à tuiles XYZ devient la seule interface : l'API de génération
(preview, generate, status, stop, file, cell), le job unique + file
persistante, la délégation LIDAR_GENERATION_URL et les garde-fous
(token, LIDAR_REGEN_CIDR) passent de webapp.py à mapserve.py ; l'interface
gagne les boutons + Zone / ⤒ Compléter / régénération à la dalle, les
options de run et la progression cadre par cadre. mapserve sert aussi
l'inventaire /api/tiles et les dalles en statique versionné : le worker
image complète remplace la webapp sur le 8973 du générateur, le Pi
n'exécute plus que lidar-maps. index.py se réduit aux registres partagés
+ vignettes/sous-tuiles/inventaire (l'UI HTML/JS et les mosaïques
d'overview partent avec export.py et les compose/scripts de la webapp).
2026-09-23 23:21:05 +02:00
900332cdbc lidar-maps : navigation en cache seule et pyramide entretenue en tâche de fond
Sur une petite machine (Raspberry Pi), LIDAR_TILE_CACHE_ONLY sert les tuiles
depuis le cache uniquement (tuile absente = transparente non mémorisable,
X-Tile-Pending) et LIDAR_TILE_BACKGROUND fait surveiller les dalles par un
sondeur : chaque dalle nouvelle ou régénérée par le worker remet sa pyramide
en file, rendue à basse priorité et au ralenti. Scan et état pilotables via
/api/map/background, pré-calcul exhaustif toujours via /api/map/warm.
2026-09-23 19:05:58 +02:00
053eb2f529 Ajouter une carte à tuiles XYZ (image lidar-maps) réutilisable dans OSM
L'ancienne carte n'est pas une carte à tuiles : une div Leaflet par dalle,
rotée en CSS pour coller la grille Lambert 93 sur le Web Mercator, trois
paliers d'images choisis à la main, un plafond d'images pleine résolution et
une mosaïque d'overview pour boucher les trous au dézoom. Des centaines de
nœuds DOM, des AVIF de 2500² à 5000² décodés dans le navigateur, un LOD
maison — et rien de réutilisable hors de cette page.

Nouvelle image légère (Pillow + pyproj, ni GDAL ni PDAL, port 8975) servant
une pyramide XYZ EPSG:3857 au schéma OpenStreetMap, rendue à la demande
depuis les dalles et mise en cache dans output/index_xyz/ :

- tiles.py : grille XYZ, reprojection par transformation projective dalle par
  dalle (calage mesuré < 1 px), choix du palier source parmi ceux que le
  pipeline produit déjà (vignette, intermédiaire, quadrant, dalle), cache
  périmé dès qu'une dalle contributrice est plus récente, marqueur .empty
  pour les zones sans donnée, cache d'images sources à budget mémoire ;
- mapserve.py : /tiles/{couche}/{z}/{x}/{y}.png (256 px canonique) et
  @2x.webp (512 px, interface), TileJSON, WMTS, josm.imagery.xml, CORS —
  les rendus deviennent un fond d'imagerie pour JOSM, iD, QGIS, uMap ;
- mapui.py : une L.tileLayer par couche dans un pane isolé — LOD, cache et
  animation natifs de Leaflet ; pile réordonnable (glisser avec barre
  d'insertion, ou boutons ▲▼ au doigt), modes de fusion CSS par couche,
  configuration figeable comme défaut de tous les navigateurs.

Deux amonts pour les déploiements en deux machines : LIDAR_SOURCE_URL
(webapp du pipeline — inventaire complet, dalles rapatriées à la demande) et
LIDAR_MAPS_URL (autre instance carte). Charge bornée et réglable, taillée
par défaut pour une petite machine : 2 rendus et 2 téléchargements
simultanés, 192 Mo de cache de sources.

Mesuré sur 849 dalles réelles : première tuile d'une zone 0,9–3,2 s
(téléchargement compris), ~1 ms ensuite ; un chemin OSM se superpose
exactement à la trace du rendu de pente, et les coutures entre tuiles
restent sous le bruit naturel du terrain.

L'interface historique (port 8973) n'est pas touchée : génération et export
y restent, les deux cartes coexistent.
2026-09-23 14:47:38 +02:00
64eaad751c L'interface webapp ne peut plus rester silencieusement périmée
La webapp légère bâchait app.js/app.css dans l'image au build : après une
évolution de l'interface, le Pi servait l'ancienne carte sans aucun signal
(tuiles invisibles, vieux fichiers). Désormais l'interface embarque sa
version (hash CSS+JS) que le serveur de données publie via /api/tiles : en
cas de divergence, bandeau « interface périmée » dans la carte + log d'alerte
côté webapp. Les assets sont servis en revalidation (jamais immutable) et
une page ouverte depuis plus de 15 min se recharge seule au retour au premier
plan — l'ancienne interface n'est plus jamais affichée après un déploiement.
2026-09-21 23:43:19 +02:00
7c10ae3e18 Rasterisation GPU du DTM (bin_mean_2d) + GPU fallback renforcé et workers mono-thread
Rastérisation des points sol via gpu.bin_mean_2d (bincount 2D CuPy, sémantique
identique au repli scipy binned_statistic_2d) : ~x7 plus rapide sur cette
étape, logs de durée par phase dans create_dtm_fast. safe_gpu_call retente en
CPU sur toute erreur GPU (pas seulement les messages CUDA) : un transfert
échoué en cours de run mélangeait types numpy/cupy et faisait échouer la
visualisation entière. Workers en mono-thread BLAS/OpenMP sur la machine de
traitement (plus de saturation des cœurs pendant les runs).
2026-09-21 23:42:55 +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