diff --git a/docs/raw/조사/2026-10-06_63-2_노선추천_종단.md b/docs/raw/조사/2026-10-06_63-2_노선추천_종단.md new file mode 100644 index 000000000..b50dfa805 --- /dev/null +++ b/docs/raw/조사/2026-10-06_63-2_노선추천_종단.md @@ -0,0 +1,117 @@ +# 63-2 노선 추천에 종단 포함 — 검토 (sub7 · 2026-10-06 · 코드·저장 자료 손대지 않음) + +## 결론 다섯 줄 + +1. 노선 추천은 **원지반만** 봄 — 종단 계획선(꺾임점·종단곡선)을 세우지 않음. 토공은 「폭 4m 평평한 띠 · 비탈면 뺌」 가늠값이고, 절성토 균형은 어느 모드의 점수에도 안 들어감. +2. 종단선이 원지반에 붙는 것은 최적화가 실패해서가 아님. **「모든 측점 계획고 = 지반고」 규칙(2026-09-02 사용자 확정)** 그대로이고, 기울기 상한도 경고만 띄움. 균형 계산기(3·4순위)는 실패했을 때만 도는 예비 경로. +3. 검증_sub7 수치 — 저장된 토공은 절토 7,108㎥ · 성토 19,977㎥(다짐 기준), 부족 12,869㎥(전량 반입), **절/성 0.36**. 종단기울기 14%를 넘는 구간은 65 곳 중 38 곳(최대 79%) → 「최적화 안 됨」이 수치로 맞음. +4. 이 노선은 옆 경사가 40° 넘는 사면을 지나서 중심 계획고만 조금 바꿔도 토공이 크게 움직임. 전 구간을 **0.7m 낮추면 절 7,425 · 성 7,376㎥로 균형**(성토 −54%). 지금 균형 계산기의 잣대(종단 면적 ㎡)는 이런 차이를 못 잡음 — 중심선이 지반에 붙어 있으면 불균형을 0 으로 읽음. +5. 권하는 순서 — **안 A(종단 자동 설계에 횡단 토량 기준 균형을 넣음)를 먼저**, 그다음 안 B(추천 후보에 같은 종단 평가를 붙임). 안 B 만 하면 추천 점수와 [확인] 뒤 실제 종단이 서로 달라짐. 어느 안이든 09-02 사용자 확정 규칙을 뒤집는 일이므로 사용자 결정이 먼저. + +## ① 지금 노선 추천 — 무엇으로 고르나 + +| 항목 | 내용 | 위치 | +|---|---|---| +| 진입 | B05 편집 [노선 추천] → 창의 모드 8개 → `POST /route/initial` | `B05_Profile_UI_RouteEdit_Recommend.ts:51-60,351-400` · `B05_Profile_Api_RouteInitial.ts:50-67` | +| 탐색 | 예상노선 ±100m 띠 · 4m 격자 · 16방향 Dijkstra · 최소 반경은 꺾기 전 직진 칸 수로 지킴 | `B05_Profile_Engine_RouteInitial_Search.py:28-60,225-233,369` | +| 고리 비용 항 | 예상노선과의 거리 · 토공(`W²·옆경사/4`, W=4m) · **지반** 종단경사² · 목표경사 편차 · 위험(옆경사 ≥35°·하천 띠) · 하천 횡단 | `Search.py:146-176,368` | +| 강제 조건 | 지반 경사가 상한을 넘는 고리는 뺌(상한을 1.0→0.93→0.85 로 낮춰 가며) · 하천 따라가기 금지 · 길이 막히면 벌점으로 바꿈 | `Search.py:306-309,356-358` · `Pool.py:59,146-159` | +| 고르기 | 후보 묶음에서 실측 지표로 고름 — earthwork=절+성 최소 · gentle=최대경사 · cost=비용지수 … | `B05_Profile_Engine_RouteInitial_Pool.py:272-285` | +| 종단 | 꺾임점·곡선 없음. `grade_line()`(상한 안으로 앞뒤로 누른 두 선의 평균)은 토공 가늠에만 씀 | `B05_Profile_Engine_RouteInitial_Metrics.py:92-100,235` | +| 토공 가늠 | 폭 4m 평평한 띠 9점 · **비탈면 뺌** · `surplus_m3`(절−성)는 계산은 하지만 점수에 안 씀 | `Metrics.py:224-240,270-271` | +| 기본값 | 상한 경사·반경은 파이썬 상수(20km/h: 9/14% · 15/12m) | `config/config_system_design.py:496-525` | + +→ **판단 근거는 횡단(옆경사)과 지반 종단경사뿐**이고, 계획고·절성토 균형은 들어가지 않음. + +## ② 종단선이 원지반에 붙는 까닭 + +| 순위 | 엔진 | 하는 일 | 균형 | +|---|---|---|---| +| **1(기본)** | `design_ground_following_profile` `B05_Profile_Engine_Grade_Profile.py:148-238` | 모든 측점이 꺾임점 · 계획고 = 지반고 · 꺾임점마다 종단곡선(L 15m), 곡선이 측점에서 지반을 지나도록 꼭짓점을 밀어 맞춤 | 없음(경고만) | +| 2 | `design_pipe_anchored_profile` `:241-366` | 배수관 측점에서만 지반에 맞춤(옛 1차 — 최대 성토 +9.36m 문제로 내려감) | 없음 | +| 3 | `design_alignment_profile` `:369-450` · `Grade_Solver.py:310-460` | DP 로 꺾임점을 고르고 최소제곱 ∫(계획−지반)² · 기울기 상한 강제 | 종단 면적 ㎡, 허용 10% | +| 4 | `design_grade_line` `B05_Profile_Engine_Grade.py:458-634` | 2차 계획법 · 구간별 면적 균형 등식 | 종단 면적 ㎡ | + +- 순서는 `B05_Profile_Engine_Sections.py:317-369`. 1순위가 실패하지 않는 한 3·4는 돌지 않음. +- 기울기 위반 정책 `grade_violation_policy = warn` · 기본 지형 `special`(14%) — `config_system_design.py:632` · `Grade.py:60`. +- 덮개·교량 제어점 없음 · 배관 덮개 강제(`enforce_pipe_clearance`)는 기본 꺼짐. +- B05 화면의 종단 ㎡ 불균형 표시는 「실제 토량이 아니라」 뺐음(2026-09-03, `B05_Profile_UI_Profile_Balance.ts:8-10`). 균형은 유토곡선(횡단 ㎥)으로만 보여 줌. + +지식DB 근거: + +| 근거 | 내용 | 위치 | +|---|---|---| +| 별표2 Ⅰ.1.나.(4)(다) | **시공계획고는 절토량과 성토량이 균형을 이루게 하되** 피해방지·경관유지 고려 | `original/법률/…/별표2_…md` L64 | +| 별표2 Ⅰ.2.라.(1) | 종단기울기 20km/h 일반 9% · 특수 14% · 포장 시 18% | 같은 파일 L168-177 | +| 별표2 Ⅰ.2.마 | 종단곡선 20km/h R≥100m · L≥20m · 비포장 대수차 5% 이하 생략 | L187-197 | +| 교본 3장 실시설계 | 진입·진출부는 가급적 절토 · **계곡부는 양쪽 절토량이 성토되도록 계획고 결정** · 능선부 4% 이내 | `original/임도기술교본/3. …/3. 실시설계.md` L231-233,279 | +| 정리본 | 시공계획고 원칙 · 실무 지침 표 | `technical_info/01_임도/02_상세설계/종단선형.md` §4·§5 | + +→ 법령은 「균형」을 계획고 결정 원칙으로 둠. 지금 1차 규칙(계획고 = 지반고)은 사용자 판단(설계자가 고쳐 쓰는 출발선)이라 법령 위반은 아니지만, 자동 제안으로는 균형과 상한 둘 다 비어 있음. + +## ③ 종단 포함 안 비교 + +| | 안 A — 종단 자동 설계에 횡단 토량 균형 | 안 B — 추천 후보마다 종단+토공 점수 | 안 C — A+B 를 한 평가 함수로 | +|---|---|---|---| +| 하는 일 | 1차 계획선을 「지반 따라가기」에서 「상한 지키며 **횡단 ㎥** 기준 균형」으로(또는 [균형 계획선] 버튼으로 골라 씀). 측점마다 계획고 ±Δ 에 대한 절·성 면적 곡선을 미리 만들어 최적화 | 후보마다 ① 상한 안 종단 ② 비탈면을 넣은 횡단 토량 ③ 절/성 비 · 총 토량 · 반입·사토량을 재고 **새 모드「토공 균형」** 추가 | 추천 점수와 [확인] 뒤 종단이 같은 함수를 씀 — 추천에서 본 토량 = 확정 뒤 유토곡선 | +| 바뀌는 파일 | `B05_Profile_Engine_Grade_Solver.py`(목표·제약) · `B05_Profile_Engine_Grade_Profile.py`(새 진입점) · `B05_Profile_Engine_Sections.py`(순서) · `config_system_design.py`(정책) · B06 `compute_cross_design` 을 불러 쓰는 얇은 연결 하나 | `B05_Profile_Engine_RouteInitial_Metrics.py`(토공 가늠 교체) · `…_Pool.py`(GOALS·MODE) · `B05_Profile_UI_RouteEdit_Recommend.ts`(모드 단추) · 지반 횡단 표본을 DEM 에서 뽑는 함수 | A + B 파일 · 평가 함수 하나를 공용으로 | +| 계산 자리 | ③ 서버 단독 — 화면은 `base_pvi`+편집만 다시 그리므로 TS 짝 필요 없음 | ③ 서버 단독 | ③ 서버 단독 | +| 계산 시간(실측 근거) | 횡단 66장 한 벌 0.13초 → 오프셋 7단 ≈ 1초 + 최적화 · [확인] 체인에 1~3초 더함 | 후보 ≈17개(쓸기 11+모드) × 1~2초 ≈ **20~40초** 더함(지금 제한 5분) | A+B | +| 위험 | 09-02 사용자 확정 규칙 뒤집음 · 계획고가 지반 아래로 내려가 **배수관 덮개** 줄 수 있음(덮개 강제 꺼짐) · 상한을 지키면 깊은 절토(실측: 14% 만 지켜도 중심 절토 최대 6~8m · 성토 9m) | 추천 점수와 확정 뒤 종단이 다름(1차가 그대로면 균형 점수가 거짓말) · 추천 응답 느려짐 | 범위 큼 · 시험 많음 | +| 권함 | **먼저** | A 뒤에 | 최종 모습 | + +곁가지(값싼 첫걸음): 안 B 의 「토공 가늠에 비탈면 넣기」만 해도 지금 earthwork 모드가 급사면 성토를 크게 낮춰 보는 흠이 줄어듦 — 다만 균형은 여전히 못 봄. + +## ④ 확정 뒤 종단선 연결 영향 + +| 대상 | 지금 동작 | 안 A·B·C 일 때 | +|---|---|---| +| [적용] | 편집기 값과 캐시만 바꿈 · 계산 없음 (`B05_Profile_UI_RouteEdit_Initial.ts:144-152`) | 같음 | +| [확인] | `POST /route/replan` → 재확정 체인: 종단 자동 설계 → 배관 → B06 재생성(종단 **두 번** 계산) → 횡단 설계는 측점 거리로 이어 붙임 → 확정 (`B03_FileInput_Service_Chain.py:439-621`) | 새 종단이 이 체인 안에서 돎 → 시간 1~3초 더함. 계획고가 바뀌니 이어 붙인 횡단 설계의 면적도 다 바뀜 | +| 초기값(initial_snapshot) | 재확정 때 **지우고 다시 안 찍음**(편집 섞인 가짜 초기값 방지, 2026-08-29 사용자 확정 · `Service_Chain.py:440-444`) | 바뀌지 않음. 단 첫 자동 체인에서 찍히는 초기값의 종단이 새 규칙으로 바뀜 → 새 프로젝트부터 [초기화] 결과가 달라짐 | +| 사용자가 고친 종단선 | 편집은 `base_pvi` 기준 측점별 Δ. 재확정하면 **편집이 버려짐**(옮겨 붙이지 않음) · 세션 초안도 새 route_id 로 떨어짐 | 같음. 단 안 A 로 `base_pvi` 가 바뀌면, 옛 프로젝트를 다시 계산할 때 옛 Δ 가 새 기준에 얹혀 뜻이 바뀜 → 저장된 Δ 는 새 기준으로 옮기지 않는다는 규칙 필요 | +| B06 횡단 | 서버는 `design_profiles[0].samples` 보간 계획고, 화면은 `base_pvi`+편집으로 다시 계산 (`common_util_route_profile.py:46-75` · `B06_Section_Cross_Refresh.ts:215-281`) | 계획고가 바뀌면 측구 방향 · 절·성토 면적 · 포장 제안(국부 경사) · 유토곡선 · 사토/반입 계획이 다 바뀜. 모양 정보(`base_pvi` 형식)만 지키면 화면 코드는 그대로 | +| 배수관 | 덮개 강제 꺼짐 · 관 측점 = 지반 기준 | 계획고를 낮추면 관 덮개 부족 가능 → 안 A 에 덮개 제약(`facility_clearance_m`)을 켜야 함 | + +## ⑤ 검증_sub7 실측 (프로젝트 6d3b2812 · 노선 231 CONFIRMED · 연장 1,078m · 측점 66) + +- 이 노선은 추천을 거치지 않음(`initial_choice.json` 없음). 지반 20m 경사는 61 구간 중 31 곳이 ±14% 를 넘음(최대 −64%) · 들쭉날쭉한 등락. 시점 879.1m → 종점 833.0m(평균 −4.3%). +- 계획선: 66 측점 모두 계획고 = 지반고(오차 ≤0.0001m) · 기울기 14% 초과 38/65 구간 · 최대 79% · 종단곡선 64개 중 다수가 「직선이 짧아 L 줄임」 경고(반경 0~7m). + +저장된 토공(DB `longitudinal_sections.data.mass_haul` · 절토 자연량 / 성토 다짐량): + +| 구간 | 절토 ㎥ | 성토 ㎥ | 절/성 | +|---|---|---|---| +| 0–200 | 936 | 692 | 1.35 | +| 200–400 | 1,131 | 2,704 | 0.42 | +| 400–600 | 825 | 4,905 | 0.17 | +| 600–800 | 2,004 | 2,620 | 0.77 | +| 800–1,078 | 1,858 | 9,057 | 0.21 | +| **계** | **6,754**(다짐 7,108) | **19,977** | **0.36** · 부족 12,869㎥ 전량 반입 · 사토 0 | + +- 성토가 큰 측점(840 · 860 · 1,020 · 500m, 측점당 1,000~1,700㎥)은 중심이 지반에 붙어 있는데도 옆 경사가 82~99%(40°+) → 내리막 쪽 성토 비탈이 지반에 잘 닿지 않아 성토가 커짐. + +중심 계획고를 통째로 올리고 내린 민감도(B06 `compute_cross_design` 을 읽기 전용으로 다시 돌림 · 기본 지반 리핑암 · 평균단면법 · 자연량 — 저장값과 조건이 조금 달라 절대값은 다름): + +| 계획고 이동 | 절토 ㎥ | 성토 ㎥ | 성/절 | +|---|---|---|---| +| 0 | 4,099 | 16,160 | 3.94 | +| −0.5m | 6,368 | 9,330 | 1.47 | +| **−0.7m** | **7,425** | **7,376** | **0.99** | +| −1.0m | 9,158 | 4,660 | 0.51 | +| −2.0m | 15,975 | 94 | 0.01 | + +종단 기울기 상한만 지키는 계획선(20m 꺾임 · 시점 고정 · 선형계획 · 종단 면적 기준): + +| 상한 | 균형 없이 절/성 ㎡·m | 중심 최대 절/성 m | 균형 넣고 중심 최대 절/성 m | +|---|---|---|---| +| 14% | 523 / 1,911 | 6.2 / 9.2 | 8.2 / 9.2 | +| 9% | 661 / 5,703 | 7.5 / 22.8 | 26.1 / 22.8 | + +→ 이 지형에서 상한(14%)을 지키려면 중심 절·성토가 8~9m 까지 커짐. 「원지반에 붙인 종단」은 토공은 작게 보이지만 **기울기 위반 + 급사면 성토 쏠림**을 그대로 남김. 노선 자체(추천 단계)에서 지반 등락이 작은 길을 고르는 것과 종단 균형을 같이 봐야 하는 까닭. + +## 남은 결정(사용자 · 브레인) + +- 09-02 규칙(1차 계획고 = 지반고)을 유지하고 [균형 계획선]을 **골라 쓰는 단추**로 둘지, 기본값 자체를 바꿀지. +- 균형 잣대 = 횡단 ㎥(유토곡선과 같은 잣대) — 허용 비율(지금 10%) · 구간 길이(지금 전 구간 하나). +- 상한을 못 지키는 지형(이 노선)에서 상한 우선인지 토공 우선인지.