Borner le comblement du MNT à l'enveloppe des points, ajouter la couche précision et un affichage relief/précision, encoder les sous-tuiles une seule fois en q75

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Antoine Jacquin
2026-09-27 15:07:04 +02:00
parent c5097e21a0
commit 90dbe61f3b
17 changed files with 994 additions and 593 deletions

View File

@ -48,6 +48,9 @@ AVIF_SPEED = 9 # encodage rapide (cf. rendering.AVIF_SPEED : ×7, +3 %
# l'active quand la bande passante compte (consultation mobile).
PNG_PALETTE = os.environ.get("LIDAR_TILE_PNG_PALETTE", "") == "1"
# Couches en aplats de niveaux codés, rééchantillonnées au plus proche voisin
NEAREST_LAYERS = frozenset({'densite_sol'})
# Demi-circonférence équatoriale : emprise du Web Mercator (EPSG:3857).
ORIGIN = 20037508.342789244
@ -452,8 +455,10 @@ def _build_index(output_dir):
quads = {}
for f in sub_dir.iterdir():
name = f.name
# « .webp » plein en dernier : les vignettes finissent aussi en .webp
for suffix, tier in ((".avif", "full"), ("_mid.webp", "mid"),
(f"_thumb{_SUBTILE_THUMB_PX}.webp", "thumb")):
(f"_thumb{_SUBTILE_THUMB_PX}.webp", "thumb"),
(".webp", "full")):
if not name.endswith(suffix):
continue
m = _SUBTILE_RE.search(name[:-len(suffix)] + ".avif")
@ -810,7 +815,9 @@ def render_tile(output_dir, layer, z, x, y, scale=1):
canvas = Image.new("RGBA", (size, size), (0, 0, 0, 0))
# Agrandissement (zoom natif) : bicubique ; réduction : bilinéaire suffit
# puisque le palier source est déjà calé sur la résolution de la tuile.
resample = Image.BICUBIC
# Aplats de niveaux codés (densité, 1 m/px) : plus proche voisin, sinon
# l'agrandissement aux zooms 18–19 invente des gris intermédiaires.
resample = Image.NEAREST if layer in NEAREST_LAYERS else Image.BICUBIC
painted = False
for src in sources:
painted |= _paste_source(canvas, src, z, x, y, size, resample)