Exposer le cadre imprimable et l'export PDF dans mapserve

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Antoine Jacquin
2026-09-27 16:11:57 +02:00
parent 3cf5bbce6e
commit 7f590ddecf
2 changed files with 112 additions and 0 deletions

View File

@ -1764,6 +1764,48 @@ def tiles_inventory(stamp: Optional[float] = None):
return data
# --- export PDF (planche d'impression terrain) ---
# Toujours calculé localement (jamais délégué à LIDAR_GENERATION_URL) : la
# carte légère seule doit savoir exporter. Un export à la fois : l'image de
# la planche occupe jusqu'à ~40 Mo (Pi, mem_limit 1g).
_export_lock = threading.Lock()
@app.get("/api/export/frame")
def export_frame(lat: float, lon: float, paper: str = "A4", orient: str = "paysage",
scale: int = 2000):
"""Cadre imprimable (coins WGS84) centré sur (lat, lon) pour ces réglages."""
from . import export_pdf
try:
return export_pdf.frame(lat, lon, paper, orient, scale)
except ValueError as e:
raise HTTPException(400, str(e))
@app.get("/api/export/pdf")
def export_pdf_file(lat: float, lon: float, paper: str = "A4", orient: str = "paysage",
scale: int = 2000, title: Optional[str] = None):
"""Planche PDF du relief orienté centrée sur (lat, lon)."""
from . import export_pdf
if not _export_lock.acquire(blocking=False):
raise HTTPException(429, "un export PDF est déjà en cours, réessayez dans quelques secondes")
try:
data, name = export_pdf.build_pdf(OUTPUT_DIR, lat, lon, paper, orient, scale,
title=title)
except ValueError as e:
raise HTTPException(400, str(e))
except export_pdf.NoDataError as e:
raise HTTPException(404, str(e))
except Exception: # noqa: BLE001 — message propre côté carte
logger.exception("Échec de l'export PDF")
raise HTTPException(500, "échec de l'export PDF (voir les journaux du serveur)")
finally:
_export_lock.release()
return Response(data, media_type="application/pdf",
headers={"Content-Disposition": f'attachment; filename="{name}"',
"Cache-Control": "no-store"})
@app.post("/api/preview", dependencies=[Depends(_require_token),
Depends(_require_lan_for_generation)])
def preview(req: PreviewRequest):