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

@ -1129,6 +1129,48 @@ def generate_relief_oriente(dem_file, basename, vis_dir, resolution, shared=None
return None
# Densité de points sol : 16 niveaux sur une échelle log fixe (même gris =
# même densité partout, mosaïque jointive). Le niveau k commence à
# DENSITY_BASE × 2^(k/2) pts/m² : 0 = ≤ 0,35 (noir, y compris sans aucun
# point), 15 = ≥ 45 (blanc) ; deux niveaux = densité doublée.
DENSITY_LEVELS = 16
DENSITY_BASE = 0.25
def density_levels(density):
"""Niveau 0..15 d'une densité (pts/m²)."""
with np.errstate(divide="ignore", invalid="ignore"):
k = np.floor(2.0 * np.log2(np.asarray(density, dtype=np.float64) / DENSITY_BASE))
return np.clip(np.nan_to_num(k, nan=0.0, neginf=0.0), 0, DENSITY_LEVELS - 1).astype(np.uint8)
def generate_densite_sol(dem_file, basename, vis_dir, resolution, shared=None):
"""Densité des points sol retenus pour le MNT, en 16 niveaux de gris.
Lue dans le fichier annexe écrit à la rastérisation (dtm.density_path) :
grille de 1 m, gardée telle quelle (la densité n'a pas plus de détail —
image 25× plus légère qu'à 0,2 m). Sortie : niveau 0..15 (float32).
"""
logger.info(" → Densité de points sol...")
t0 = time.time()
output = vis_dir / f"{basename}_densite_sol.tif"
try:
from .dtm import density_path
src_path = density_path(dem_file)
if not src_path.exists():
logger.error(f" ✗ Densité absente ({src_path.name}) : régénérer le DTM")
return None
with rasterio.open(src_path) as src:
density = src.read(1)
transform, crs = src.transform, src.crs
_save_tif(output, density_levels(density).astype(np.float32), transform, crs)
logger.info(f" ✓ Densité de points terminée ({time.time()-t0:.1f}s)")
return output
except Exception as e:
logger.error(f" ✗ Erreur densité de points: {e}", exc_info=True)
return None
def generate_mslrm(dem_file, basename, vis_dir, resolution, shared=None):
"""Multi-Scale Relief Model (MSRM) - LRM at adaptive scales combined (GPU if available).