diff --git a/D03_PlanAnalysis/D03_PlanAnalysis_Analyze.py b/D03_PlanAnalysis/D03_PlanAnalysis_Analyze.py index 5e6296638..9cb67fa73 100644 --- a/D03_PlanAnalysis/D03_PlanAnalysis_Analyze.py +++ b/D03_PlanAnalysis/D03_PlanAnalysis_Analyze.py @@ -60,8 +60,13 @@ def plan_criteria(road_type: str | None, design_speed_kph: int | None) -> dict[s } +def _point(value: Any) -> tuple[float, float]: + """엔진 출력 자리수(0.1 mm)로 — 노선 끝점 = 지점 그대로 · 연도 경계가 정확히 맞물림.""" + return (round(float(value[0]), 4), round(float(value[1]), 4)) + + def _same_point(a: Any, b: Any) -> bool: - return abs(float(a[0]) - float(b[0])) < 1e-6 and abs(float(a[1]) - float(b[1])) < 1e-6 + return abs(float(a[0]) - float(b[0])) < 1e-3 and abs(float(a[1]) - float(b[1])) < 1e-3 def read_segment(project_root: Path, seg: dict[str, Any]) -> dict[str, Any] | None: @@ -91,7 +96,7 @@ def analyze_segment( corridor_m: float = PLAN_CORRIDOR_M, ) -> dict[str, Any]: """연도 구간 하나 · 갈래 넷 — 입력 지문이 저장본과 같으면 그대로(`stored` True).""" - expected = [tuple(map(float, seg["start"])), tuple(map(float, seg["end"]))] + expected = [_point(seg["start"]), _point(seg["end"])] inputs = { "weights": None, "max_grade": criteria["max_grade"], diff --git a/D03_PlanAnalysis/D03_PlanAnalysis_Terrain.py b/D03_PlanAnalysis/D03_PlanAnalysis_Terrain.py index 63027aac1..7d3be6c57 100644 --- a/D03_PlanAnalysis/D03_PlanAnalysis_Terrain.py +++ b/D03_PlanAnalysis/D03_PlanAnalysis_Terrain.py @@ -41,7 +41,7 @@ logger = logging.getLogger(__name__) # 구간 표본 간격 — 도엽(≈2.8 × 2.3 km) 3×3 묶음이 끊기지 않게 SAMPLE_STEP_M = 1000.0 -# 탐색 복도 반폭(D 만 · B 기본 100 m) — 실측(530-2): 노선이 복도 끝에 닿지 않는 폭 +# 탐색 복도 반폭(D 만 · B 기본 100 m) — 실측(530-2): 100 · 200 m 는 못 지킨 곳 남음 · 300 m 0~1 PLAN_CORRIDOR_M = 300.0 # DEM 이 복도 밖으로 더 덮는 폭(복도 끝 칸 기울기 · 횡단 표본 ±20 m) DEM_EXTRA_M = 50.0 diff --git a/resources/tester/test_530_2_plan_analyze.py b/resources/tester/test_530_2_plan_analyze.py index 5d364e0af..1e50b9275 100644 --- a/resources/tester/test_530_2_plan_analyze.py +++ b/resources/tester/test_530_2_plan_analyze.py @@ -12,8 +12,8 @@ from D03_PlanAnalysis import D03_PlanAnalysis_Analyze as analyze CRITERIA = {"max_grade": 0.14, "min_radius_m": 12.0, "design_speed": 20} SEGMENTS = [ - {"year": 2026, "start": (60.0, 200.0), "end": (560.0, 230.0)}, - {"year": 2027, "start": (560.0, 230.0), "end": (1040.0, 160.0)}, + {"year": 2026, "start": (60.0, 200.0), "end": (560.123456789, 230.987654321)}, + {"year": 2027, "start": (560.123456789, 230.987654321), "end": (1040.0, 160.0)}, ] @@ -54,8 +54,8 @@ def test_boundary_chainage_and_line(run) -> None: for route in result["routes"].values(): assert "error" not in route # 시종점 그대로 — 연도 경계가 정확히 맞물림 - assert route["planned"][0] == list(seg["start"]) - assert route["planned"][-1] == list(seg["end"]) + assert route["planned"][0] == result["start"] == pytest.approx(seg["start"], abs=1e-4) + assert route["planned"][-1] == result["end"] == pytest.approx(seg["end"], abs=1e-4) assert results[0]["routes"]["gradeline"]["planned"][-1] == results[1]["start"] rows = analyze.chain(results, {2026: "earthwork", 2027: None}, 1234.5) @@ -70,7 +70,7 @@ def test_boundary_chainage_and_line(run) -> None: first = results[0]["routes"]["earthwork"]["planned"] second = results[1]["routes"]["gradeline"]["planned"] assert len(line) == len(first) + len(second) - 1 # 경계점 한 번만(꺾인 채) - assert line[len(first) - 1] == list(SEGMENTS[0]["end"]) + assert line[len(first) - 1] == results[0]["end"] == results[1]["start"] def test_same_input_reads_store(run, monkeypatch) -> None: