diff --git a/B04_wf1_Surface/B04_wf1_Surface_Engine.py b/B04_wf1_Surface/B04_wf1_Surface_Engine.py index 2626e4ec..0139e66d 100644 --- a/B04_wf1_Surface/B04_wf1_Surface_Engine.py +++ b/B04_wf1_Surface/B04_wf1_Surface_Engine.py @@ -232,7 +232,10 @@ def run_surface_analysis( ) prj_path = prj_candidates[0] if prj_candidates else project_root / "result.prj" - from B04_wf1_Surface.B04_wf1_Surface_Engine_Extent import download_extent + from B04_wf1_Surface.B04_wf1_Surface_Engine_Extent import ( + download_extent, + map_meta_covers, + ) from B04_wf1_Surface.B04_wf1_Surface_Engine_GisVector import download_all_gis_vectors from B04_wf1_Surface.B04_wf1_Surface_Engine_VWorld import ( download_vworld_satellite_map, @@ -259,7 +262,9 @@ def run_surface_analysis( ] for item in layers: meta_path = processed_dir / f"vworld_{item['layer'].lower()}_meta.json" - if not rebuild and meta_path.is_file(): + # 파일이 있어도 계획노선·여유 셀이 바뀌어 범위를 못 덮으면 다시 받는다. + # (B03 업로드가 부르는 경로는 rebuild=False라, 존재 여부만 보면 영영 갱신되지 않는다.) + if not rebuild and map_meta_covers(meta_path, bounds_dict_for_download): continue try: step_started = time.monotonic() diff --git a/B04_wf1_Surface/B04_wf1_Surface_Engine_Extent.py b/B04_wf1_Surface/B04_wf1_Surface_Engine_Extent.py index a35a20b3..de370354 100644 --- a/B04_wf1_Surface/B04_wf1_Surface_Engine_Extent.py +++ b/B04_wf1_Surface/B04_wf1_Surface_Engine_Extent.py @@ -7,6 +7,7 @@ from __future__ import annotations +import json import logging from pathlib import Path from typing import Any @@ -81,6 +82,26 @@ def download_extent( } +def map_meta_covers(meta_path: Path, extent: dict[str, list[float]]) -> bool: + """저장된 배경 지도가 필요한 범위를 이미 덮고 있는가. + + 파일 존재 여부만 보면 계획노선이 바뀌거나 여유 셀 설정을 바꿔도 옛 사진을 계속 쓴다 + (B03 업로드 → 전처리 경로는 `rebuild=False`라 더더욱 다시 받지 않는다, 2026-08-01). + """ + if not meta_path.is_file(): + return False + try: + meta = json.loads(meta_path.read_text(encoding="utf-8")) + return ( + float(meta["x_min"]) <= extent["x"][0] + and float(meta["x_max"]) >= extent["x"][1] + and float(meta["y_min"]) <= extent["y"][0] + and float(meta["y_max"]) >= extent["y"][1] + ) + except (OSError, ValueError, KeyError, TypeError): + return False + + def sheet_reference_points_wgs84( project_root: Path, las_bounds: dict[str, list[float]],