Fix basename: retirer .copc.laz au lieu de .laz seul

Les fichiers LiDAR HD IGN ont l'extension .copc.laz (double extension).
Path.stem ne retire que .laz, laissant .copc dans le basename.
Ajout de _file_basename() qui retire les extensions connues
dans l'ordre: .copc.laz, .copc.las, .laz, .las.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Jacquin Antoine
2026-05-10 12:02:32 +02:00
parent 0904592fa2
commit beb88684cb
2 changed files with 24 additions and 3 deletions

View File

@ -218,7 +218,14 @@ def classify_ground(laz_file, temp_dir, method='auto', force=False):
else: else:
logger.info(f" Classification sol: {method.upper()} (forcé)") logger.info(f" Classification sol: {method.upper()} (forcé)")
output_las = temp_dir / f"{laz_file.stem}_ground_{method}.las" # Strip all known LiDAR extensions (.copc.laz, .laz, .las)
laz_base = laz_file.name
for ext in ['.copc.laz', '.copc.las', '.laz', '.las']:
if laz_base.lower().endswith(ext):
laz_base = laz_base[:-len(ext)]
break
output_las = temp_dir / f"{laz_base}_ground_{method}.las"
if output_las.exists() and not force: if output_las.exists() and not force:
logger.info(f" Classification {method.upper()} déjà effectuée — fichier existant réutilisé") logger.info(f" Classification {method.upper()} déjà effectuée — fichier existant réutilisé")

View File

@ -24,6 +24,20 @@ except RuntimeError:
logger = logging.getLogger("lidar") logger = logging.getLogger("lidar")
def _file_basename(path):
"""Extract base name from a LAZ/LAS file, removing all known extensions.
Handles double extensions like .copc.laz correctly:
'file.copc.laz' -> 'file', not 'file.copc'
"""
name = Path(path).name
# Remove known LiDAR extensions (order matters: longest first)
for ext in ['.copc.laz', '.copc.las', '.laz', '.las']:
if name.lower().endswith(ext):
return name[:-len(ext)]
return Path(path).stem
class FilePrefixFilter(logging.Filter): class FilePrefixFilter(logging.Filter):
"""Adds a file prefix to log messages when processing a specific file.""" """Adds a file prefix to log messages when processing a specific file."""
def __init__(self): def __init__(self):
@ -208,7 +222,7 @@ class LidarArchaeoPipeline:
def process_file(self, laz_file): def process_file(self, laz_file):
"""Process a single LAZ file through the full pipeline.""" """Process a single LAZ file through the full pipeline."""
basename = laz_file.stem basename = _file_basename(laz_file)
_file_filter.basename = basename _file_filter.basename = basename
t_start = time.time() t_start = time.time()
@ -358,7 +372,7 @@ def _process_file_standalone(laz_file_str, input_dir, output_dir, resolution, fo
worker_logger.addFilter(_file_filter) worker_logger.addFilter(_file_filter)
pipeline = LidarArchaeoPipeline(input_dir, output_dir, resolution=resolution, workers=1, force=force, ground_method=ground_method, force_classify=force_classify) pipeline = LidarArchaeoPipeline(input_dir, output_dir, resolution=resolution, workers=1, force=force, ground_method=ground_method, force_classify=force_classify)
basename = Path(laz_file_str).stem basename = _file_basename(laz_file_str)
pipeline.temp_dir = pipeline.output_dir / f"temp_{basename}" pipeline.temp_dir = pipeline.output_dir / f"temp_{basename}"
pipeline.temp_dir.mkdir(exist_ok=True) pipeline.temp_dir.mkdir(exist_ok=True)
laz_file = Path(laz_file_str) laz_file = Path(laz_file_str)