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