Panéau et couches par défaut limités aux 4 couches conservées

La carte ne conserve que Pente, Aspect, Openness positive et Rugosité :
PANEL_VIZ est restreint à DEFAULT_LAYERS, le sélecteur de génération
suit le panneau, et ces 4 couches sont allumées par défaut via
default_layers (index.html + index_tiles.json). Les autres couches ne
sont plus ni affichées ni proposées.
This commit is contained in:
Antoine Jacquin
2026-09-13 21:44:56 +02:00
parent e2533bac48
commit f79608a92f
2 changed files with 77 additions and 44 deletions

View File

@ -198,13 +198,21 @@ VIZ_LEGENDS = {
},
}
# Couche activée par défaut à l'ouverture de la carte.
DEFAULT_VIZ = 'hillshade_multi'
# Couches activées par défaut à l'ouverture de la carte : seules celles-ci
# sont allumées, toutes les autres sont désactivées (mais restent accessibles
# via le panneau). Ordre = pile basse → haute.
DEFAULT_LAYERS = ('slope', 'aspect', 'positive_openness', 'roughness')
# Restriction optionnelle du panneau de couches : None = proposer toutes
# les visualisations présentes sur disque (aucune restriction). Le sélecteur
# de génération/régénération est piloté par le même registre (voir _render_html).
PANEL_VIZ = None
# Couche « principale » (mise en avant ; index_tiles.json + affichage en
# direct de la webapp).
DEFAULT_VIZ = DEFAULT_LAYERS[0]
# Restriction du panneau de couches : seule la sélection DEFAULT_LAYERS est
# proposée (couches conservées ; les autres ne sont plus ni affichées ni
# référencées). None = toutes les visualisations présentes sur disque.
# Le sélecteur de génération/régénération est piloté par le même registre
# (voir _render_html).
PANEL_VIZ = DEFAULT_LAYERS
# Correspondance mot-clé de fichier de sortie → nom d'étape --only du pipeline
# (les trois visualisations dont le nom de sortie diffère du nom d'étape,
@ -224,6 +232,16 @@ def step_to_keyword(step):
return STEP_TO_KEYWORD.get(step, step)
def default_layers_present(all_viz_keys):
"""Couches activées par défaut (DEFAULT_LAYERS) présentes sur le disque.
Ordre conservé (DEFAULT_LAYERS) ; sert de base à l'état initial du
panneau (toutes les autres couches sont désactivées).
"""
present = set(all_viz_keys)
return [v for v in DEFAULT_LAYERS if v in present]
def cells_with_all_viz(vis_dir, viz_keys, resolutions=(0.5,)):
"""Cellules (col, row) disposant de TOUTES les visualisations demandées.
@ -1061,7 +1079,9 @@ def build_index(output_dir, output_format='avif'):
(output_dir / 'index_tiles.json').write_text(json.dumps({
'tiles': display_tiles,
'viz_meta': {k: {'label': VIZ_LABELS.get(k, k)} for k in ordered_viz},
'stats': {'default_viz': default_viz, 'n_tiles': len(display_tiles)},
'stats': {'default_viz': default_viz,
'default_layers': default_layers_present(all_viz_keys),
'n_tiles': len(display_tiles)},
}, ensure_ascii=False), encoding='utf-8')
_write_assets(output_dir)
@ -1129,13 +1149,15 @@ def _render_html(tiles, global_bbox, all_viz_keys, output_format):
tiles_json = json.dumps(tiles, ensure_ascii=False)
# Options du sélecteur de génération/régénération : TOUTES les couches du
# registre (mêmes libellés que le panneau ; valeurs = noms d'étapes --only
# du pipeline), y compris celles absentes du disque — pour pouvoir les
# générer. Toutes pré-sélectionnées : une régénération refait la dalle
# complète, l'utilisateur pouvant désélectionner pour cibler.
gen_keys = [v for v in _VIZ_FALLBACK_ORDER if v in VIZ_LABELS]
gen_keys += sorted(k for k in VIZ_LABELS if k not in gen_keys)
# Options du sélecteur de génération/régénération : les couches du panneau
# (PANEL_VIZ si restreint, sinon le registre complet — mêmes libellés,
# valeurs = noms d'étapes --only du pipeline), y compris celles absentes
# du disque — pour pouvoir les générer. Toutes pré-sélectionnées : une
# régénération refait la dalle complète, l'utilisateur pouvant
# désélectionner pour cibler.
gen_base = PANEL_VIZ if PANEL_VIZ is not None else VIZ_LABELS
gen_keys = [v for v in _VIZ_FALLBACK_ORDER if v in gen_base]
gen_keys += sorted(k for k in gen_base if k not in gen_keys)
gen_viz_options = "\n".join(
f' <option value="{KEYWORD_TO_STEP.get(v, v)}" selected>'
f'{VIZ_LABELS.get(v, v)}</option>'
@ -1146,8 +1168,11 @@ def _render_html(tiles, global_bbox, all_viz_keys, output_format):
for k in ordered_viz
}, ensure_ascii=False)
stats_json = json.dumps({'default_viz': default_viz, 'n_tiles': len(tiles)},
ensure_ascii=False)
stats_json = json.dumps(
{'default_viz': default_viz,
'default_layers': default_layers_present(all_viz_keys),
'n_tiles': len(tiles)},
ensure_ascii=False)
n_tiles = len(tiles)
grid_w = global_bbox['max_col'] - global_bbox['min_col'] + 1
@ -1855,10 +1880,17 @@ const LS_KEY = 'lidarLayers_v1';
function defaultLayers() {
const order = Object.keys(VIZ_META);
const base = STATS.default_viz && VIZ_META[STATS.default_viz]
? STATS.default_viz : order[0];
// Couches activées par défaut : seules celles-ci sont allumées, toutes les
// autres sont désactivées (mais restent accessibles via le panneau). Repli
// sur la couche « principale » (default_viz) si la liste n'est pas fournie
// (index ancien) ; sinon la première couche disponible.
const list = (Array.isArray(STATS.default_layers) && STATS.default_layers.length)
? STATS.default_layers
: ((STATS.default_viz && VIZ_META[STATS.default_viz])
? [STATS.default_viz] : [order[0]]);
const onSet = new Set(list.filter(k => VIZ_META[k]));
const on = {}, opacity = {};
for (const k of order) { on[k] = (k === base); opacity[k] = 1; }
for (const k of order) { on[k] = onSet.has(k); opacity[k] = 1; }
return { order, on, opacity, osm: { on: true, opacity: 0.85, dark: true } };
}