Merge branch 'fix-edge-neighbor-duplicates'

This commit is contained in:
Antoine Jacquin
2026-09-27 16:35:02 +02:00
4 changed files with 166 additions and 0 deletions

View File

@ -496,6 +496,7 @@ class LidarArchaeoPipeline:
from .dtm import _tile_coords, _NEIGHBOR_OFFSETS, EDGE_NEIGHBORS_DIRNAME
from .fetch_ign import fetch_tiles, tile_filename
edge_dir = self.input_dir / EDGE_NEIGHBORS_DIRNAME
self._cleanup_edge_neighbor_duplicates(edge_dir)
wanted = set()
for laz_file in files:
coords = _tile_coords(Path(laz_file).name)
@ -523,6 +524,47 @@ class LidarArchaeoPipeline:
logger.info(f"Raccord des bords : {len(fetched)}/{len(missing)} dalle(s) "
f"voisine(s) téléchargée(s) ({time.time() - t0:.0f} s)")
def _cleanup_edge_neighbor_duplicates(self, edge_dir):
"""Supprime de edge_neighbors/ les dalles déjà présentes dans input/.
Une dalle téléchargée comme voisine avant d'être requise comme tuile
principale (ou l'inverse) peut se retrouver dupliquée aux deux
emplacements (avant que fetch_tiles ne promeuve les nouvelles
voisines) ; l'exemplaire d'input/ fait foi (_neighbor_laz_files
cherche dans input/ avant edge_neighbors/), le doublon ne sert donc
à rien et peut peser plusieurs centaines de Mo. Les fichiers ".part"
(téléchargement en cours) ne sont jamais touchés, et un doublon de
taille différente est conservé (l'exemplaire d'input/ pourrait être
tronqué : on ne supprime jamais ce qui serait la seule copie saine).
"""
from .dtm import EDGE_NEIGHBORS_DIRNAME
if not edge_dir.is_dir():
return
removed = 0
freed = 0
for path in edge_dir.iterdir():
if not path.is_file() or path.suffix == ".part":
continue
twin = self.input_dir / path.name
if not twin.exists():
continue
try:
size = path.stat().st_size
if twin.stat().st_size != size:
logger.warning(f"Raccord des bords : {path.name} présent dans input/ "
f"et {EDGE_NEIGHBORS_DIRNAME}/ avec des tailles "
f"différentes — doublon conservé")
continue
path.unlink()
freed += size
removed += 1
except OSError:
pass
if removed:
logger.info(f"Raccord des bords : {removed} doublon(s) supprimé(s) de "
f"{EDGE_NEIGHBORS_DIRNAME}/ (déjà dans input/, "
f"{freed / 1e6:.0f} Mo libérés)")
def _report(self, basename, phase, state, detail=None, res=None):
"""Émet un événement de progression (file de génération, best-effort)."""
report_event(self.output_dir, basename, phase, state, detail=detail, res=res)