Garder localement les sources des dalles sur une carte alimentée par l'amont
Avec LIDAR_SOURCE_URL (Pi), la maintenance rapatrie et conserve les sources de chaque dalle dès qu'elle apparaît, sans attendre de visite : les niveaux rendus à la volée restent disponibles quand le conteneur de rendu est éteint. Seuls les paliers utiles sont pris (vignettes, quadrants 500 m ; la dalle entière, doublon de ses quadrants, ne l'est pas) ; une source manquée pendant que l'amont était éteint est reprise au scan suivant. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@ -169,6 +169,7 @@ def _bg_conf():
|
||||
|
||||
_bg = {"threads": [], "stop": threading.Event(), "queue": deque(),
|
||||
"queued": set(), "guard": threading.Lock(), "snapshot": None,
|
||||
"prefetch": deque(),
|
||||
"running": False,
|
||||
"stats": {"rendues": 0, "a_jour": 0, "vides": 0, "scans": 0,
|
||||
"dernier_scan": None, "ajouts_dernier_scan": 0}}
|
||||
@ -236,6 +237,22 @@ def background_scan(output_dir=None):
|
||||
continue
|
||||
changed.setdefault(layer, []).append((col, row))
|
||||
_bg["snapshot"] = snapshot
|
||||
# Carte alimentée par un serveur de dalles amont (Pi) : les sources des
|
||||
# dalles nouvelles ou modifiées sont rapatriées et GARDÉES localement,
|
||||
# sans attendre une visite — les niveaux rendus à la volée restent
|
||||
# disponibles quand le conteneur de rendu est éteint.
|
||||
# Toutes les dalles sont revérifiées (simples tests d'existence) : une
|
||||
# source manquée pendant qu'il était éteint est reprise au scan suivant.
|
||||
if tiles_mod.REMOTE_SOURCE_URL:
|
||||
index = tiles_mod.source_index(output_dir)
|
||||
pending = {str(s_.path) for s_ in _bg["prefetch"]}
|
||||
for per_cell in index.values():
|
||||
for tiers in per_cell.values():
|
||||
for src in tiles_mod.sources_to_keep(tiers):
|
||||
key = str(src.path)
|
||||
if src.url is not None and key not in pending and not src.path.is_file():
|
||||
_bg["prefetch"].append(src)
|
||||
pending.add(key)
|
||||
items = []
|
||||
for layer, cells in changed.items():
|
||||
for col, row in cells:
|
||||
@ -261,7 +278,17 @@ def background_scan(output_dir=None):
|
||||
|
||||
|
||||
def _bg_process_one():
|
||||
"""Traite une tuile de la file. Vrai si elle a dû être rendue."""
|
||||
"""Traite une source à rapatrier, sinon une tuile de la file. Vrai si
|
||||
un travail a été fait (rapatriement ou rendu)."""
|
||||
try:
|
||||
src = _bg["prefetch"].popleft()
|
||||
except IndexError:
|
||||
src = None
|
||||
if src is not None:
|
||||
if src.ensure():
|
||||
_bg["stats"]["sources_locales"] = _bg["stats"].get("sources_locales", 0) + 1
|
||||
return True
|
||||
return False # amont éteint : repris au prochain scan
|
||||
item = _bg_pop()
|
||||
if item is None:
|
||||
return False
|
||||
|
||||
Reference in New Issue
Block a user