Files
Aislo/docs/raw/plans/2026-08-02_plan_mass_haul_multi_curve.md
T
eomsangdonandClaude Opus 5 eb30b774f8 chore(docs): docs 폴더 git 추적 전환 · PLAN·OWNERS 최상위 이관
- `docs/` 를 .gitignore 에서 빼 git 추적 대상으로 전환 (위키·완료 이력·검증 기록)
- `docs/raw/PLAN.md` · `docs/raw/OWNERS.md` 를 저장소 최상위로 이동 후 .gitignore 에 등록
  — 창끼리 공유하되 저장소에는 안 올리는 장부
- 살아 있는 경로 참조 7개 파일 정정 (아카이브 107건은 그때 사실이라 그대로 둠)
- graphify 날짜별 산출물(`docs/wiki/graphify-out/20*/`) 제외 — `graphify update` 가 다시 만듦

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-09 18:19:07 +09:00

12 KiB
Raw Blame History

[C05] 유토곡선 다중 곡선화 — 종단/횡단 기준 x 지반유형 처리 3종

이 문서는 docs/raw/PLAN.md의 「현재 작업」에서 검증 완료 후 이관된 아카이브입니다. 검증 보고서: docs/raw/verification/2026-08-02_verify_mass_haul_multi_curve.md 검증 판정: CONDITIONAL PASS — 기능 요구 전부 충족. 렌더 결함 1건(F1)은 PLAN.md 다음 작업으로 이관.


[C05] 유토곡선 다중 곡선화 — 종단/횡단 기준 × 지반유형 처리 3종 (2026-08-02)

배경

일반 토목 문헌의 유토곡선은 종단면도에 시공기면을 그린 뒤 횡단도에서 구간 토량을 산출하는 절차를 전제한다. 그러나 임도는 산복 사면을 따라가므로 편절·편성이 지배적이고, 종단상 절토 구간인데 횡단상으로는 성토가 더 큰 경우가 많다. 어느 기준을 정식으로 삼을지 사용자가 그래프를 보고 결정할 수 있도록 두 기준을 한 축에 겹쳐 그린다. 지반유형 처리도 아직 미결(향후 1번)이라 세 가지를 함께 낸다.

법령 근거 — [임도의 설계 및 시설기준] 별표 (산림자원법 시행규칙)

이번 작업으로 원문을 확보해 대조했다. 아래 조항이 두 기준을 모두 내는 직접 근거다.

조항 원문 반영
2.다.(3)(나) "시공계획고는 절토량과 성토량이 균형을 이루게 하되, 피해방지·경관유지를 감안하여 결정한다" 종단 기준 곡선 = 법정 균형 판정선
2.다.(4)(다) "절토부분은 토사·암반으로 구분하되, 암반부분은 추정선으로 기입한다" 향후 1번(암반 경계선 분리)의 법정 근거
2.다.(4)(마) "각 측점의 단면마다 지반고·계획고·절토고·성토고·단면적 ... 을 기입한다" 횡단 기준 곡선의 입력값
2.가.(1)(가) "측점 간격은 20m로 하고 ... 종·횡단의 변화가 심한 지점 ... 에는 보조말뚝을 설치한다" SECTION_STATION_INTERVAL_M = 20.0 + 불규칙 측점 허용
2.라.(1) 설계서 구성에 토적표 포함 유토곡선/토적표 산출의 법정 지위
2.차.(2)(3) 절토 암석지 1:0.4 / 토사 1:0.9 (±0.2), 성토 1:0.9 이하 (±0.2) STANDARD_CROSS_SECTION 대조 근거
2.차.(7) "부족한 토사공급 또는 남는 토사의 처리가 필요한 경우에는 적정한 장소에 사토장 또는 토취장을 지정한다" 사토/토취 표기의 법정 근거
3.나.(1) 유효너비 간선 4m 내외 / 지선 3m 내외 노반폭 기본값 대조

중요: 이 별표에는 토공 운반장비 선정거리 기준이 없다. 장비 경계값(EARTHWORK_HAUL_EQUIPMENT_LIMITS_M)의 근거는 법령이 아니라 3공구 실제 도면 실측치다. 다른 자료가 이를 법령 근거로 제시하면 오류다.

참고 자료 (2026-08-02 사용자 제공: clouds-daily.tistory.com/249)

유토곡선의 성질 7가지 — ① 상승=절토 / 하강=성토 ② 극대·극소점 = 절성토 경계 ③ 산모양 좌→우, 골모양 우→좌 운반 ④ 기선 위에서 끝나면 과잉, 아래면 부족 ⑤ 수평선 두 교점 사이는 절성토 균형(평형선) ⑥ 평균운반거리 = 구간 종거의 1/2 지점을 지나는 수평선 ⑦ 구간 전토량 = b지점 높이.

토량 배분 원칙 3가지 — Phase 2 평형선·운반계획의 명시적 제약으로 고정한다.

# 원칙 반영 지점
① 운반거리를 짧게 평형선 탐색의 목적함수 = 평균운반거리 최소화
② 높은 곳에서 낮은 곳으로 운반 방향은 성질 ③을 따르고, 종단 경사 역방향 운반은 후순위
③ 토량을 모아서 한 가지 방법으로 운반 장비 경계로 구간을 잘게 쪼개지 말고 통합 후 단일 장비 배정

구현 결과

곡선 6종 = 기준 2 × 지반유형 처리 3. 색이 기준(횡단=브랜드 보라 / 종단=성공색 초록), 선모양이 환산 방식(실선=지반유형별 / 파선=토사 단일 / 점선=환산 없음)을 뜻한다.

횡단 기준 종단 기준
소스 design.cut_area_m2 / fill_area_m2 (엔진 실측) design_profiles[0].samples[].difference_m × 노반폭
부호 규약 엔진이 절·성토를 이미 분리 difference_m = 계획고 − 지반고, 음수=절토 (B05_wf2_Route_UI_Profile_Alignment.ts:338 규약과 동일)
노반폭·지반유형 측점 자체 값 최근접 설계 측점에서 상속
표본 밀도 설계된 측점만 종단 샘플(측점보다 조밀)
  • _UI_MassHaul.ts (346줄) — 공통 적분 함수 integrate(samples, conversion, groundMode) 하나로 통일. 두 기준이 AreaSample[]까지 정규화된 뒤 같은 코드를 탄다(평균단면법·환산 로직 이중화 없음). computeMassHaulSeries() 신설. computeMassHaul()은 시그니처·결과 그대로 유지해 _UI_Page.ts:385의 확정 저장 경로가 바뀌지 않는다.
  • _UI_MassHaul_View.ts (318줄) — 다중 곡선 렌더 + 오버레이 범례. Y 스케일은 표시 여부와 무관하게 항상 전체 곡선 기준(volumeRange(series[]))이라 켜고 꺼도 축이 움직이지 않는다. 면(band)은 맨 앞 곡선 하나에만 칠한다(겹치면 못 읽음). 곡선은 범례 역순으로 그려 첫 곡선이 맨 위에 온다.
  • _UI_Section_View.ts (432줄) — 표시 집합을 sessionStorage["b06:masshaul-visible"]에 보존. 전부 끈 상태도 사용자의 선택으로 존중한다(기본값 복원 안 함). 요약줄은 켜 둔 첫 곡선의 수치를 쓰고, 어느 곡선인지 끝에 반드시 표기한다.
  • _UI_Style_MassHaul.css (142줄, 신규) — _UI_Style_Cross.css가 742줄로 700줄 제한을 넘어 유토곡선 블록을 분리(분리 후 606줄). 범례는 position: sticky; left: 0 + height: 0으로 가로 스크롤에도 왼쪽에 남으면서 곡선 위에 뜬다.
  • ui_template_locale_b2.ts — 곡선명·범례 문구 9개 키 추가. 하드코딩 없음.

구현 체크리스트

  • 공통 적분 함수 분리 — 두 기준이 같은 코드를 탄다
  • 종단 기준 곡선 계산 (difference_m × 노반폭, 최근접 측점 상속)
  • 지반유형 처리 3종 (지반유형별 / 토사 단일 / 환산 없음)
  • 다중 곡선 렌더 + 표시 무관 고정 Y 스케일
  • 그래프 상단 오버레이 hide/show 범례 버튼
  • locale 키 등록, 색상은 theme.css 변수만 사용
  • prettier + tsc --noEmit 통과, 전 파일 700줄 이하
  • 계산 엔진 단위 테스트 18건 통과
  • 서버 기동 후 실제 프로젝트(테스트1, route 48) 브라우저 검증

검증 결과 (테스트1 / route 48 / 24측점 중 23측점 설계)

항목 결과
범례 버튼 6개 생성, 기본 2개(횡단·종단의 지반유형별) 켜짐
토글 2 → 6 → 0 → 2 정상 동작
Y 스케일 고정 세 상태 모두 눈금 60.5 / -46.3 / -153.0 동일
X축 정렬 종단도 측점선 [62 … 1454] 24개 = 유토곡선 [62 … 1454] 24개
오버레이 범례 top 318px = SVG top 318px (겹침 확인)
세션 보존 새로고침 후 켜 둔 2개 그대로 복원
전부 끈 상태 안내문 "표시할 곡선을 하나 이상 켜 주세요." 표시

곡선별 수치 (자연상태 절토는 어느 곡선이든 같아야 하며 실제로 같다)

곡선 절토(자연) 환산 후 성토 최종
횡단 · 지반유형별 216.1 244.8 321.4 토취 76.6
횡단 · 토사 단일 216.1 194.5 321.4 토취 126.9
횡단 · 환산 없음 216.1 216.1 321.4 토취 105.3
종단 · 지반유형별 154.8 174.0 158.2 사토 15.8
종단 · 토사 단일 154.8 139.3 158.2 토취 18.9
종단 · 환산 없음 154.8 154.8 158.2 토취 3.4

검산 — 14.9×0.90 + 201.2×1.15 = 244.79 ✓ / 216.1×0.90 = 194.49 ✓ / 16.2×0.90 + 138.7×1.15 = 174.09 ✓. 각 행의 환산 후 − 성토가 최종값과 일치 ✓.

사용자 판단 대기 사항

  1. 정식 기준 채택 — 횡단 단독 / 종단 단독 / 병기 유지 중 택일.
    • 관측: 종단 기준은 환산 없이 −3.4㎥로 거의 완전 균형이다. 법령 2.다.(3)(나)가 계획고를 절성토 균형으로 정하게 했고 B05가 그렇게 그었으니 당연한 결과다. 반면 **횡단 기준은 −105.3㎥**로 크게 부족하다. 이 간극이 곧 임도 편절·편성이 종단 균형을 깨뜨리는 양이며, 사용자가 제기한 "임도는 횡단 의존이 크다"를 수치로 확인해 준다.
    • 단서: 종단 기준은 노반폭만 곱한 개략값이라 비탈면 절·성토를 잡지 못한다. 절토 154.8 vs 216.1, 성토 158.2 vs 321.4로 양쪽 다 과소평가된다. 물량 산출에는 쓸 수 없고 균형 판정 지표로 봐야 한다.
  2. 지반유형 처리 — 향후 1번(암반 경계선 분리)이 서기 전까지는 세 곡선을 유지한다. 분리가 끝나면 "지반유형별"이 유일한 정답이 되므로 나머지 둘은 제거 후보다.

미결사항 반영 내역 (향후 작업에서 이관)

  • 향후 1번(암반 경계선 분리): 법정 근거 확보 — 2.다.(4)(다) "절토부분은 토사·암반으로 구분하되, 암반부분은 추정선으로 기입". 이제 이 항목은 설계 판단이 아니라 법정 요구사항 이행이다. 구현은 향후에 남긴다.
  • 향후 2번(Phase 2)의 선행 자료: 배분원칙 3가지 확정, 평균운반거리 산정법(성질 ⑥) 확정, 장비 경제거리 문헌값 대조 완료. Phase 2 본체는 향후에 남긴다.


검증 단계 정정·보완 사항 (2026-08-02)

  • [F1] 저장된 패널 높이가 첫 렌더에 미반영 (미해결, PLAN.md 다음 작업으로 이관): 패널을 줄여 둔 세션에서 재진입하면 패널 높이는 296px로 복원되나 차트 배분이 기본값으로 계산돼 종단면도가 20px로 잘린다. 창 크기를 바꾸면 정상(129/111)으로 잡힌다. 원인은 draw()가 root.replaceChildren(panel, ...) 이전에 drawPanel()을 호출해 첫 렌더 시 panel이 detached 상태이고, getComputedStyle이 빈 값을 주어 BASE_PANEL_HEIGHT로 폴백하기 때문이다. 구조는 C02에서 유입됐으나 차트가 둘로 늘면서 영향이 확대됐다.

  • [F2] 화면 요약값 != 확정 저장값 (설계 의도, 명시 필요): 요약줄은 켜 둔 첫 곡선의 수치를 보여 주지만 확정 저장은 항상 횡단 · 지반유형별이다. 요약줄 끝에 곡선명이 붙어 있어 오독 위험은 낮다. 정식 기준이 확정되면 해소된다.

  • [F3] 법령 인용 서술 정정: 본문의 "유토곡선/토적표 산출의 법정 지위"는 과장이다. 법령 2.라.(1)이 설계서 구성으로 요구하는 것은 토적표이며, '유토곡선'이라는 단어는 별표 전문에 등장하지 않는다. 유토곡선은 토적표에서 파생되는 실무 관행 도면이다. 나머지 인용 11건은 원문과 문자 그대로 일치함을 확인했다.

  • [F4] 좁은 화면(900px) 범례 (조치 불요): 범례 6개가 한 줄로 뻗어 가로 스크롤이 필요하나 position: sticky; left: 0이라 스크롤해도 왼쪽에 남는다. 향후 1번 완료 시 곡선이 6->2로 줄어 자연 해소된다.

  • 검증 단계에서 추가한 테스트: 엣지 8건(측점 범위 밖 종단 샘플, 노반폭 결측, difference_m=0, NaN 샘플, 미지 ground_type, 음수 단면적, 저장 payload 동일성, 합성 station_id 누출). 기존 18건과 합쳐 26건 전원 통과.

  • 미수행: 확정 버튼 실동작은 프로젝트 상태를 WF3로 전이시키는 실제 데이터 변경이라 실행하지 않았다. 확정 경로 무회귀는 정적 대조와 payload 동일성 테스트로 확인했다.