Promouvoir une dalle voisine déjà téléchargée au lieu de la retélécharger, nettoyer les doublons existants

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Antoine Jacquin
2026-09-27 16:22:12 +02:00
parent 90dbe61f3b
commit 32d694bbd6
4 changed files with 151 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,38 @@ 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.
"""
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" or path.name.endswith(".part"):
continue
twin = self.input_dir / path.name
if twin.exists():
try:
freed += path.stat().st_size
path.unlink()
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)