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.
This commit is contained in:
52
run.sh
52
run.sh
@ -109,6 +109,9 @@ SERVE_PORT=8973
|
||||
WEBAPP_FLAG=0
|
||||
WEBAPP_SERVE_PORT=8973
|
||||
WEBAPP_IMAGE="lidar-webapp"
|
||||
MAPS_FLAG=0
|
||||
MAPS_SERVE_PORT=8975
|
||||
MAPS_IMAGE="lidar-maps"
|
||||
|
||||
# Parse arguments manually (more robust than getopts for mixed short/long options)
|
||||
while [ $# -gt 0 ]; do
|
||||
@ -154,6 +157,10 @@ while [ $# -gt 0 ]; do
|
||||
WEBAPP_FLAG=1; shift
|
||||
if [ $# -gt 0 ] && [[ ! "$1" =~ ^- ]]; then WEBAPP_SERVE_PORT="$1"; shift; fi
|
||||
;;
|
||||
--serve-maps)
|
||||
MAPS_FLAG=1; shift
|
||||
if [ $# -gt 0 ] && [[ ! "$1" =~ ^- ]]; then MAPS_SERVE_PORT="$1"; shift; fi
|
||||
;;
|
||||
-h|--help|-help)
|
||||
echo "Pipeline LiDAR Archéologique"
|
||||
echo ""
|
||||
@ -188,6 +195,10 @@ while [ $# -gt 0 ]; do
|
||||
echo " carte servie depuis le cache local de tuiles, génération"
|
||||
echo " déléguée via LIDAR_GENERATION_URL (tuiles à la demande)"
|
||||
echo " (cf. docs/DEPLOY_WEBAPP.md)"
|
||||
echo " --serve-maps [PORT]"
|
||||
echo " Carte à tuiles XYZ (image légère lidar-maps, défaut 8975) :"
|
||||
echo " schéma OpenStreetMap, réutilisable dans JOSM/QGIS/iD"
|
||||
echo " (cf. docs/MAPS.md)"
|
||||
echo " --test Exécuter les tests unitaires"
|
||||
echo " -h Afficher cette aide"
|
||||
echo ""
|
||||
@ -254,6 +265,18 @@ build_webapp_image() {
|
||||
fi
|
||||
}
|
||||
|
||||
# Image carte à tuiles XYZ (cf. Dockerfile.maps)
|
||||
build_maps_image() {
|
||||
local log="/tmp/lidar_maps_build_$$.log"
|
||||
echo "Mise à jour de l'image Docker carte (cache)..."
|
||||
if ! docker build -f Dockerfile.maps -t "$MAPS_IMAGE" "$SCRIPT_DIR" >"$log" 2>&1; then
|
||||
cat "$log" >&2
|
||||
echo "Échec du build de l'image carte (journal : $log)" >&2
|
||||
exit 1
|
||||
fi
|
||||
rm -f "$log"
|
||||
}
|
||||
|
||||
# Check for --test flag first
|
||||
if [ "$TEST_FLAG" -eq 1 ]; then
|
||||
build_image
|
||||
@ -301,6 +324,35 @@ if [ "$SERVE_FLAG" -eq 1 ]; then
|
||||
python3 -m uvicorn lidar_pipeline.webapp:app --host 0.0.0.0 --port 8973
|
||||
fi
|
||||
|
||||
# Mode --serve-maps : carte à tuiles XYZ (image légère lidar-maps).
|
||||
# Les tuiles suivent le schéma OpenStreetMap ({z}/{x}/{y}.png) : la carte est
|
||||
# consultable ici et les mêmes URLs servent de fond d'imagerie dans JOSM, iD,
|
||||
# QGIS ou uMap. Variables optionnelles depuis l'environnement hôte :
|
||||
# LIDAR_MAPS_URL serveur de tuiles amont (carte déportée)
|
||||
# LIDAR_ATTRIBUTION mention d'attribution servie aux clients
|
||||
if [ "$MAPS_FLAG" -eq 1 ]; then
|
||||
build_maps_image
|
||||
mkdir -p "$OUTPUT_DIR"
|
||||
echo "============================================"
|
||||
echo " Carte LiDAR — tuiles XYZ (image légère)"
|
||||
echo "============================================"
|
||||
echo " Carte : http://127.0.0.1:${MAPS_SERVE_PORT}/"
|
||||
echo " Tuiles XYZ : http://127.0.0.1:${MAPS_SERVE_PORT}/tiles/{couche}/{z}/{x}/{y}.png"
|
||||
echo " JOSM / QGIS : /tiles/josm.imagery.xml, /tiles/wmts.xml"
|
||||
echo " Amont : ${LIDAR_MAPS_URL:-aucun (rendu local)}"
|
||||
echo "============================================"
|
||||
MAPS_ENV=()
|
||||
[ -n "${LIDAR_MAPS_URL:-}" ] && MAPS_ENV+=(-e LIDAR_MAPS_URL="$LIDAR_MAPS_URL")
|
||||
[ -n "${LIDAR_ATTRIBUTION:-}" ] && MAPS_ENV+=(-e LIDAR_ATTRIBUTION="$LIDAR_ATTRIBUTION")
|
||||
exec docker run --rm --init \
|
||||
--user 1000:1000 \
|
||||
-p "${MAPS_SERVE_PORT}:8975" \
|
||||
-v "${OUTPUT_DIR}:/data/output" \
|
||||
-e LIDAR_OUTPUT_DIR=/data/output \
|
||||
"${MAPS_ENV[@]}" \
|
||||
"$MAPS_IMAGE"
|
||||
fi
|
||||
|
||||
# Mode --serve-webapp : conteneur webapp SEUL (image légère, sans PDAL/GPU).
|
||||
# La carte est servie depuis le cache local de tuiles (output/) ; la
|
||||
# génération est déléguée à la machine de traitement et les tuiles sont
|
||||
|
||||
Reference in New Issue
Block a user