Isoler les dalles voisines de raccord dans input/edge_neighbors/

This commit is contained in:
Antoine Jacquin
2026-09-19 23:43:50 +02:00
parent 5ef0232c80
commit 3236d56a4b
4 changed files with 50 additions and 12 deletions

View File

@ -456,17 +456,20 @@ class LidarArchaeoPipeline:
"""Télécharge les dalles LAZ voisines manquantes (raccord des bords).
La bande de raccord lit les 8 LAZ adjacentes de chaque tuile ; celles
absentes de input/ sont téléchargées depuis le catalogue IGN avant de
lancer les workers, pour que la bande soit remplie jusqu'au bord de la
zone même pour des tuiles jamais rendues. La liste est dédupliquée sur
absentes sont téléchargées depuis le catalogue IGN avant de lancer
les workers, dans le sous-dossier input/edge_neighbors/ : elles ne
doivent PAS rejoindre input/ à plat, sinon les passes globales
(« tout input/ ») les comptent comme des tuiles à rendre et la zone
grandit d'un anneau à chaque relance. La liste est dédupliquée sur
tout le lot : la couronne d'un bloc contigu ne coûte qu'un passage.
Une dalle introuvable (zone non publiée) ou en échec laisse simplement
la bande vide — le rendu continue (best-effort).
"""
if self.edge_buffer <= 0:
return
from .dtm import _tile_coords, _NEIGHBOR_OFFSETS
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
wanted = set()
for laz_file in files:
coords = _tile_coords(Path(laz_file).name)
@ -477,16 +480,19 @@ class LidarArchaeoPipeline:
wanted.add((col + dcol, row + drow))
missing = sorted(
cr for cr in wanted
if not (self.input_dir / tile_filename(cr[0], cr[1])).exists())
if not (self.input_dir / tile_filename(cr[0], cr[1])).exists()
and not (edge_dir / tile_filename(cr[0], cr[1])).exists())
if not missing:
return
edge_dir.mkdir(parents=True, exist_ok=True)
logger.info(f"Raccord des bords : {len(missing)} dalle(s) voisine(s) "
f"absente(s) de input/ — téléchargement depuis le catalogue IGN")
f"absente(s) — téléchargement dans {EDGE_NEIGHBORS_DIRNAME}/ "
f"(catalogue IGN)")
t0 = time.time()
from concurrent.futures import ThreadPoolExecutor
with ThreadPoolExecutor(max_workers=4) as pool:
fetched = [path for batch in pool.map(
lambda spec: fetch_tiles(self.input_dir, [spec]), missing)
lambda spec: fetch_tiles(edge_dir, [spec]), missing)
for path in batch]
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)")