diff --git a/lidar_pipeline/index.py b/lidar_pipeline/index.py index 990141a..d835729 100644 --- a/lidar_pipeline/index.py +++ b/lidar_pipeline/index.py @@ -1,8 +1,9 @@ -"""Carte globale interactive des tuiles LiDAR traitées. +"""Carte continue interactive des tuiles LiDAR traitées. Génère une page HTML unique (output/index.html) présentant toutes les tuiles -1×1 km traitées, positionnées sur une grille Lambert 93, avec zoom/pan natifs -et sélecteur de visualisation. Permet de choisir rapidement la tuile à examiner. +1×1 km traitées, affichées en carte continue sans bordure, avec zoom/pan fluide +et sélecteur de visualisation. Au clic sur une tuile, un modal affiche l'image +avec légende et permet de télécharger en PDF. Sortie: - output/index.html : page interactive auto-suffisante @@ -42,6 +43,27 @@ VIZ_LABELS = { 'topo': 'Carte topographique IGN', } +# Informations de colormap pour génération de légende côté navigateur. +# Utilisées par le JS pour dessiner la légende sur le canvas avant export PDF. +VIZ_COLORMAPS = { + 'hillshade_multi': {'cmap': 'gray', 'diverging': False}, + 'slope': {'cmap': 'inferno', 'diverging': False}, + 'aspect': {'cmap': 'twilight', 'diverging': False}, + 'mslrm': {'cmap': 'seismic', 'diverging': True}, + 'sailore': {'cmap': 'seismic', 'diverging': True}, + 'positive_openness': {'cmap': 'YlOrBr', 'diverging': False}, + 'negative_openness': {'cmap': 'PuBu', 'diverging': False}, + 'svf': {'cmap': 'hot_r', 'diverging': False}, + 'aniso_open': {'cmap': 'seismic', 'diverging': True}, + 'roughness': {'cmap': 'plasma', 'diverging': False}, + 'wavelet': {'cmap': 'cividis', 'diverging': False}, + 'flow_acc': {'cmap': 'YlGn', 'diverging': False}, + 'solar': {'cmap': 'gray', 'diverging': False}, + 'anomaly': {'cmap': 'YlOrRd', 'diverging': False}, + 'ortho': {'cmap': 'rgb', 'diverging': False}, + 'topo': {'cmap': 'rgb', 'diverging': False}, +} + # Visualisation par défaut pour la vignette (si disponible). DEFAULT_VIZ = 'hillshade_multi' @@ -225,7 +247,7 @@ def _pick_display_viz(viz_keys): def build_index(output_dir, output_format='avif'): - """Génère la carte interactive HTML des tuiles traitées. + """Génère la carte continue HTML des tuiles traitées. Scanne output_dir/visualisations/, génère les vignettes JPEG, puis écrit output_dir/index.html (auto-suffisant) + output_dir/index_thumbs/. @@ -312,7 +334,7 @@ def build_index(output_dir, output_format='avif'): def _render_html(tile_records, bbox, all_viz_keys, output_format): - """Construit le HTML complet avec CSS et JS natifs (zoom/pan).""" + """Construit le HTML complet avec CSS et JS (carte continue + modal PDF).""" # Ordre des viz dans le sélecteur (selon ordre préféré puis alpha). ordered_viz = [v for v in _VIZ_FALLBACK_ORDER if v in all_viz_keys] for v in sorted(all_viz_keys): @@ -325,6 +347,12 @@ def _render_html(tile_records, bbox, all_viz_keys, output_format): 'vizList': ordered_viz, }, ensure_ascii=False) + viz_meta_json = json.dumps({ + k: {'label': VIZ_LABELS.get(k, k), 'cmap': VIZ_COLORMAPS.get(k, {}).get('cmap', 'terrain'), + 'diverging': VIZ_COLORMAPS.get(k, {}).get('diverging', False)} + for k in ordered_viz + }, ensure_ascii=False) + options_html = '\n'.join( f' ' @@ -337,6 +365,7 @@ def _render_html(tile_records, bbox, all_viz_keys, output_format): return _HTML_TEMPLATE.format( data_json=data_json, + viz_meta_json=viz_meta_json, options_html=options_html, n_tiles=n_tiles, grid_w=grid_w, @@ -350,10 +379,10 @@ _HTML_TEMPLATE = """ -Carte globale des tuiles LiDAR +Carte continue LiDAR
-

Carte globale LiDAR

+

Carte continue LiDAR

{n_tiles} tuile(s) • {grid_w}×{grid_h} km