Rendu: zones NaN transparentes au lieu d'interpolation DTM
L'interpolation fillnodata du DTM générait des artefacts visuels (zones lissées artificielles). Revenu au DTM avec NaN conservés. Nouvelle approche pour le rendu: - NaN remplacés par la médiane des valeurs valides (valeur neutre) - Après application de la colormap, un masque alpha rend les zones NaN transparentes au lieu de les afficher - interpolation='bilinear' sur imshow pour un rendu lisse - Figure adaptative: 20-40 pouces selon la taille des données - DPI 200 pour les images > 3000px Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@ -285,25 +285,12 @@ def create_dtm_fast(las_file, basename, dtm_dir, resolution):
|
||||
dtm = stat.statistic.T
|
||||
dtm = dtm[::-1, :] # Flip Y so north is at top
|
||||
|
||||
# Interpolate NaN gaps using distance-weighted nearest-neighbor fill
|
||||
# Keep NaN for zones without LiDAR data — no interpolation
|
||||
nan_count = np.count_nonzero(np.isnan(dtm))
|
||||
if nan_count > 0:
|
||||
total = dtm.size
|
||||
nan_pct = 100.0 * nan_count / total
|
||||
logger.info(f" {nan_count:,} pixels sans données ({nan_pct:.1f}%) — interpolation...")
|
||||
|
||||
from rasterio.fill import fillnodata
|
||||
# rasterio.fill.fillnodata uses GDAL's interpolation:
|
||||
# fills gaps from surrounding valid pixels with distance weighting
|
||||
dtm_filled = fillnodata(dtm.astype(np.float32), mask=~np.isnan(dtm),
|
||||
max_search_distance=max(width, height) // 4)
|
||||
dtm = dtm_filled.astype(np.float64)
|
||||
|
||||
remaining = np.count_nonzero(np.isnan(dtm))
|
||||
if remaining > 0:
|
||||
logger.warning(f" {remaining:,} pixels encore sans données après interpolation")
|
||||
else:
|
||||
logger.info(f" ✓ Interpolation terminée — tous les trous comblés")
|
||||
logger.info(f" {nan_count:,} pixels sans données ({nan_pct:.1f}%)")
|
||||
|
||||
# Save as GeoTIFF
|
||||
output_tif = dtm_dir / f"{basename}_dtm.tif"
|
||||
|
||||
Reference in New Issue
Block a user