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>
This commit is contained in:
Antoine Jacquin
2026-09-27 00:10:08 +02:00
parent 0d3c3ba8bc
commit 31645a42e8
10 changed files with 76 additions and 22 deletions

View File

@ -18,9 +18,12 @@ class _FakeRequest:
"port": 8975})()
def _setup(tmp_path, monkeypatch, layers=("aspect", "slope")):
def _setup(tmp_path, monkeypatch, layers=("aspect", "slope"), panel=None):
"""Dalle factice ; panel=None lève la restriction PANEL_VIZ pour que les
couches de test (aspect, slope) soient servies."""
import lidar_pipeline.mapserve as mapserve
from lidar_pipeline import tiles
from lidar_pipeline import index, tiles
monkeypatch.setattr(index, "PANEL_VIZ", panel)
_make_dalle(tmp_path, 1054, 6882, list(layers))
monkeypatch.setattr(mapserve, "OUTPUT_DIR", tmp_path)
tiles.source_index(tmp_path, force=True)
@ -209,6 +212,19 @@ def test_map_meta(tmp_path, monkeypatch):
assert meta["default_layers"] == ["relief_oriente"]
def test_only_panel_layers_are_served(tmp_path, monkeypatch):
"""Seules les couches de PANEL_VIZ sont affichées et servies ; la
génération depuis la carte ne produit qu'elles."""
from fastapi import HTTPException
mapserve = _setup(tmp_path, monkeypatch, layers=("relief_oriente", "aspect", "slope"),
panel=("relief_oriente",))
meta = mapserve.map_meta()
assert [l["key"] for l in meta["layers"]] == ["relief_oriente"]
with pytest.raises(HTTPException):
asyncio.run(mapserve.tile("aspect", 15, 1, "1.png"))
assert mapserve._panel_viz_steps() == ["relief_oriente"]
def test_map_tile_info(tmp_path, monkeypatch):
"""/api/map/tile identifie la dalle sous un point et lit ses métadonnées."""
mapserve = _setup(tmp_path, monkeypatch)
@ -542,11 +558,8 @@ def _reset_bg(mapserve):
def test_tile_cache_only_never_renders(tmp_path, monkeypatch):
"""Mode cache seule : tuile manquante = transparente non mémorisable."""
import lidar_pipeline.mapserve as mapserve
mapserve = _setup(tmp_path, monkeypatch, layers=("slope",))
from lidar_pipeline import tiles
_make_dalle(tmp_path, 1054, 6882, ["slope"])
monkeypatch.setattr(mapserve, "OUTPUT_DIR", tmp_path)
tiles.source_index(tmp_path, force=True)
monkeypatch.setenv("LIDAR_TILE_CACHE_ONLY", "1")
z = 15
x, y = _tile_of_cell(1054, 6882, z)

View File

@ -24,6 +24,15 @@ class TestVizSteps:
from lidar_pipeline.pipeline import VIZ_STEPS
assert len(VIZ_STEPS) == 16
def test_default_run_produces_only_relief(self, tmp_path):
"""Sans --only : seule la couche affichée (relief orienté) est produite ;
--only reste libre pour les autres visualisations."""
from lidar_pipeline.pipeline import LidarArchaeoPipeline
p = LidarArchaeoPipeline(tmp_path, tmp_path / "out")
assert [n for n, _ in p.viz_steps] == ["relief_oriente"]
p = LidarArchaeoPipeline(tmp_path, tmp_path / "out2", only_viz=["slope"])
assert [n for n, _ in p.viz_steps] == ["slope"]
def test_ortho_and_topo_present(self):
from lidar_pipeline.pipeline import VIZ_STEPS
names = [name for name, _ in VIZ_STEPS]

View File

@ -119,9 +119,10 @@ def test_zoom_supported_bounds():
# Index des sources
# ---------------------------------------------------------------------------
def test_source_index_and_layers(tmp_path):
def test_source_index_and_layers(tmp_path, monkeypatch):
"""L'index liste les couches présentes et leurs paliers (grossier → fin)."""
from lidar_pipeline import tiles
from lidar_pipeline import index, tiles
monkeypatch.setattr(index, "PANEL_VIZ", None)
_make_dalle(tmp_path, 1054, 6882, ["aspect", "slope"])
layers = tiles.source_index(tmp_path, force=True)
assert set(layers) == {"aspect", "slope"}
@ -132,6 +133,15 @@ def test_source_index_and_layers(tmp_path):
set(tiles.available_layers(tmp_path)) == {"slope", "aspect"}
def test_available_layers_follow_panel(tmp_path, monkeypatch):
"""Couches sur disque hors PANEL_VIZ : ni affichées ni servies."""
from lidar_pipeline import index, tiles
_make_dalle(tmp_path, 1054, 6882, ["aspect", "relief_oriente"])
tiles.source_index(tmp_path, force=True)
monkeypatch.setattr(index, "PANEL_VIZ", ("relief_oriente",))
assert tiles.available_layers(tmp_path) == ["relief_oriente"]
def test_grid_bounds(tmp_path):
"""Emprise L93 et WGS84 de la grille disponible."""
from lidar_pipeline import tiles