Files
lidar_rendu/lidar_pipeline/mapui.py
2026-09-27 17:26:41 +02:00

53 lines
1.7 KiB
Python

"""Interface de la carte à tuiles XYZ (image lidar-maps).
Le HTML, le CSS et le JS vivent dans `web/` (vrais fichiers, relus à l'import) ;
`write_map_assets()` les bâche dans l'image au build. La page est une coquille
minimale : tout l'état vient de `/api/map/meta`, les couches sont des `L.tileLayer`
standard — le navigateur gère LOD, cache et animation.
"""
import hashlib
from pathlib import Path
ASSETS_DIRNAME = "mapserve_assets"
WEB_DIR = Path(__file__).resolve().parent / "web"
def _read_web(name):
"""Fichier de l'interface (HTML/CSS/JS), lu une fois à l'import."""
return (WEB_DIR / name).read_text(encoding="utf-8")
_MAP_HTML = _read_web("map.html")
_MAP_CSS = _read_web("map.css")
_MAP_JS = _read_web("map.js")
def ui_version():
"""Hash court du CSS+JS : sert d'URL de version pour les assets."""
return hashlib.sha1((_MAP_CSS + _MAP_JS).encode("utf-8")).hexdigest()[:10]
def write_map_assets(assets_dir):
"""Écrit app.css / app.js (+ Leaflet vendorisé) dans `assets_dir`."""
import shutil
assets_dir = Path(assets_dir)
assets_dir.mkdir(parents=True, exist_ok=True)
(assets_dir / "app.css").write_text(_MAP_CSS, encoding="utf-8")
(assets_dir / "app.js").write_text(
_MAP_JS.replace("__UI_VERSION__", ui_version()), encoding="utf-8")
src_vendor = Path(__file__).parent / "assets" / "vendor"
dst_vendor = assets_dir / "vendor"
if src_vendor.is_dir():
shutil.rmtree(dst_vendor, ignore_errors=True)
shutil.copytree(src_vendor, dst_vendor)
return assets_dir
def render_html():
"""Coquille HTML (données chargées par /api/map/meta)."""
return _MAP_HTML.replace("__ASSETS_V__", ui_version())