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

@ -553,3 +553,30 @@ class TestPriorityFlood:
result = _priority_flood(dem, nodata)
assert result[2, 2] == 999.0
class TestDensiteSol:
def test_density_levels_log_scale(self):
from lidar_pipeline.visualizations import density_levels
d = np.array([0.0, np.nan, 0.25, 0.36, 0.5, 1.0, 45.0, 45.3, 1000.0])
assert density_levels(d).tolist() == [0, 0, 0, 1, 2, 4, 14, 15, 15]
def test_generate_reads_density_sidecar(self, tmp_path):
import rasterio
from rasterio.transform import from_bounds
from lidar_pipeline.dtm import density_path
from lidar_pipeline.visualizations import generate_densite_sol
dem = tmp_path / "T_dtm_r0p2.tif"
dem.touch()
with rasterio.open(density_path(dem), 'w', driver='GTiff', width=4, height=1,
count=1, dtype='float32', crs='EPSG:2154',
transform=from_bounds(0, 0, 4, 1, 4, 1)) as dst:
dst.write(np.array([[0.0, 1.0, 4.0, 64.0]], dtype='float32'), 1)
out = generate_densite_sol(dem, "T", tmp_path, 0.2)
with rasterio.open(out) as src:
assert src.read(1).tolist() == [[0, 4, 8, 15]]
assert src.width == 4 # grille de 1 m conservée
def test_missing_sidecar_returns_none(self, tmp_path):
from lidar_pipeline.visualizations import generate_densite_sol
assert generate_densite_sol(tmp_path / "X_dtm.tif", "X", tmp_path, 0.2) is None