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:
@ -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).
|
||||
|
||||
|
||||
Reference in New Issue
Block a user