From 6af50811b60d58d1333fcd8fa053527d89441ea3 Mon Sep 17 00:00:00 2001 From: umsangdon Date: Sat, 1 Aug 2026 12:18:31 +0900 Subject: [PATCH] =?UTF-8?q?fix(B04):=20=EB=B0=B0=EA=B2=BD=20=EC=A7=80?= =?UTF-8?q?=EB=8F=84=20=EC=9E=AC=EB=8B=A4=EC=9A=B4=EB=A1=9C=EB=93=9C=20?= =?UTF-8?q?=ED=8C=90=EC=A0=95=EC=9D=84=20=ED=8C=8C=EC=9D=BC=20=EC=A1=B4?= =?UTF-8?q?=EC=9E=AC=EC=97=90=EC=84=9C=20=EB=B2=94=EC=9C=84=20=ED=8F=AC?= =?UTF-8?q?=ED=95=A8=20=EC=97=AC=EB=B6=80=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 기존에는 vworld_*_meta.json이 있으면 무조건 건너뛰었다. B03 업로드가 부르는 전처리 경로는 rebuild=False라, 계획노선이 바뀌거나 여유 셀 설정을 바꿔도 옛 사진을 계속 썼다 (2026-08-01 사용자 지적: 트리거 시점 문제). map_meta_covers()로 저장된 사진이 필요한 범위(라이다 U 계획노선)를 실제로 덮는지 확인하고, 못 덮으면 다시 받는다. Co-Authored-By: Claude Opus 5 (1M context) --- B04_wf1_Surface/B04_wf1_Surface_Engine.py | 9 ++++++-- .../B04_wf1_Surface_Engine_Extent.py | 21 +++++++++++++++++++ 2 files changed, 28 insertions(+), 2 deletions(-) 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]],