diff --git a/docs/raw/요구_1025/_분석_363_예정노선_지점_횡단.md b/docs/raw/요구_1025/_분석_363_예정노선_지점_횡단.md new file mode 100644 index 000000000..36d41d13e --- /dev/null +++ b/docs/raw/요구_1025/_분석_363_예정노선_지점_횡단.md @@ -0,0 +1,93 @@ +# 분석 363 — 예정노선 지점 고침 · 예상 횡단 · 3D · 측점 표기 + +읽기 전용 조사 · 코드 고침 없음 · 줄 번호 = main_laptop_1 `4e1dc5c1f` 기준. + +## ① 결론 다섯 줄 + +1. 연도 경계 지점은 이미 고쳐짐(D02 카카오 끌기 · 누름 · 경위도 칸, D03 끌기) — 단 산림청 계정만. 비어 있는 것 = 추천 노선 꺾임점(IP) 고침 → D03 평면에 B05 순수 함수를 import 만 해서 얹음. D02 카카오는 브라우저 좌표 변환이 없어 비권. +2. 꺾임점 고침 = 캐시에 마디만 · 브라우저가 B05 `rebuildLine` 으로 선 → 길이 · 측점 · 지반 즉시 · 재분석 없음(경계 지점 옮김만 앞뒤 연도 재분석) · [저장] = 서버가 마디로 선(`node_polyline`) · 지표(`route_metrics`) 다시 셈. +3. 예상 횡단 = `computeCrossDesign`(common_util · 파이썬 짝 있음) + config 표준 횡단 + B 초기 설계 기본(리핑암 · 암 경계 −0.5 · 산쪽 절토 · 일반 측구) · 계획고 = 중심 지반고(B 첫 종단 규칙) · `buildCrossSvg` 의 groundOnly 끔. +4. 3D = 같은 예상 단면 → B05 `buildCorridor` → `viewer.setCorridor`(D03 모달이 이미 B05 뷰어) — 새 엔드포인트 · 새 메시 코드 없음 · B 그룹 코드 고침 0. +5. 측점 표기 — D03 화면은 이미 B 화면과 같은 `stationLabel`(`61+14.5`) · 날 누가가 남은 곳 = D01 시작 · 종료 입력 · D04 표 · D04 xlsx(shp 숫자 칸은 그대로 권함) · 「No.」 접두사 여부만 사용자 확인. + +## ② 항목별 현황 + +### A. 지점 · 노선 고침 +- D02 지점 P0..Pn = 연도 경계 · 카카오 표지 끌기 `onMove` · 지도 누름 `onClick` · 경위도 칸(`D02_PlanBase_UI_Page.ts:101-117`, `:150`) · 표지 끌기 `ui_template_kakao_map.ts:180-184` · 선 = 지점 사이 직선만(`D02_..._UI_Page.ts:121-137`) · 추천 노선은 안 그림. +- 고침 권한 = 산림청(시스템관리자 · `*.go.kr`)만 — `D02_..._UI_Page.ts:85`, `:242` · `common_util_auth.py:156-158` · D03 PUT `D03_PlanAnalysis_Router.py:300-301`. 일반 회사 계정이면 화면이 보기만 → 「고칠 수 없음」으로 보였을 수 있음. +- D03 지점 끌기 `D03_PlanAnalysis_UI_Map.ts:291-328` → `D03_PlanAnalysis_UI_Page.ts:273-292`(끈 지점 앞 · 뒤 연도 분석 비움 → 다시 [분석]) · 캐시 `d03-plan` {nodes, choices}(`UI_Page.ts:79-82`, `:163-164`) · [저장] = 지점 + 갈래 이름만 PUT(`UI_Page.ts:421-438` · `Router.py:293-339`). +- 노선 꺾임점 고침 = 어디에도 없음. +- 저장 꼴 — 파생 `D03_PlanAnalysis/_derived/route_<연도>.json` = 갈래 넷 × {planned, nodes, curves, metrics}(`D03_PlanAnalysis_Analyze.py:64-65`, `:101-103`, `:177`) · 입력 지문 `:119-135` · [저장] = `plan_route_years.route_json` ← {이은 누가 행 + planned · nodes · curves}(`Router.py:322-334`) · 측점 목록은 저장 안 함(화면 `stationChainages` · `logic/D03_PlanAnalysis_Plan.ts:98-111`). +- 이은 누가 길이 = 엔진 `metrics.length_m`(`Analyze.py:307` ↔ `Plan.ts:65` · ① 짝) — 선을 고치면 선 길이로 바꿔야 함. +- TS `PlanRoute` 에 nodes · curves 칸 없음(`Plan.ts:21-30`) — 서버는 이미 내려 줌. +- B05 편집기 화면 `mountRouteEditor`(`B05_Profile_UI_RouteEdit.ts`) = B05 페이지 · `/route/plan` · 설계 파이프라인에 묶임 → 통째 재사용 불가. +- 순수 부품(export 됨 · DOM · fetch 없음): `buildEditedPolyline` `B05_Profile/logic/B05_Profile_UI_RouteEdit_Curve.ts:250` · `dragHandleTo` `:96` · `rebuildLine` `logic/B05_Profile_UI_RouteEdit_Edits.ts:172` · `flattenServerPlan` `:380` · `spliceNode` `:441` · `radiusFloorM` `:61` · `curveShortfalls` `:136` · `lineLength` `logic/B05_Profile_Sections_Stations.ts:242` · 집기 `nodeAtScreen` · `handleAtScreen` · `segmentAtScreen`(`B05_Profile_UI_RouteEdit_Input.ts:166`, `:192`, `:251` — D03 가 이미 이 파일 import · `UI_Map.ts:30-33`). +- 서버 정본 부품: `node_polyline`(`B05_Profile_Route_Polyline_Write.py:57` · Node `route.polyline` = 같은 TS) · 폴백 `build_planned_polyline(simplify=False, curve_flags, radii)`(`common_util_route_polyline.py:290`) · 지표 `route_metrics`(`B05_Profile_Engine_RouteInitial_Metrics.py:115`) · 최소 R = 분석 저장본 `criteria.min_radius_m`(`Analyze.py:169-171`). +- D02 카카오 = 경위도 · B05 셈 = TM m · 브라우저 좌표 변환 없음(proj4 · TS 변환 함수 없음) → D02 에서 꺾임점을 끌면 끌 때마다 서버 왕복 → 5장 「조작 중 네트워크 왕복 금지」 어김. + +### B. 예상 횡단 +- 지금: `sectionsGround(line, [localM], grid)` → `buildCrossSvg({…, design: null}, w, h, true)`(`D03_PlanAnalysis_UI_Cross.ts:60-85`) · 깃발 `B05_Profile_UI_RouteEdit_Cross_Draw.ts:100-107`. +- groundOnly 끄면: `design.design_line` 을 사면 끝에서 잘라 그림 + 「기본 계획 횡단」 범례(`Cross_Draw.ts:121-132`, `:194`) · 그리기만, 셈 없음 · `calcChecked` 는 계산 자리가 server 일 때만 뒤에서 대조(`design_calc_server.ts:164-192`). +- 표준 횡단 기본값 = `config/config_system_design.py:277-311` `STANDARD_CROSS_SECTION`(soil · rock · paved · 노폭 3.0 · 노견 0.5×2 · 절토 1:1.0 / 암 1:0.4 · 성토 1:1.2 · 측구) · 암 경계 −0.5 `:313` · `resources/master_template` · M02 에는 없음 · 프로젝트별 고친 값 = B06 표준 패널 → 종단 options(D 엔 없음 → config 값만). +- 셈: `computeCrossDesign(samples, 계획고, options)` `common_util/common_util_cross_design.ts:267`(config 값을 품지 않음 · standard 를 넘김) · 파이썬 짝 `compute_cross_design` `B06_Section_Engine_Design.py:197` · 거울 시험 `test_b06_cross_design_mirror.py`. +- B 초기 기본: `optionsFor` 리핑암 · left_cut · 일반 측구(`B06_Section/logic/B06_Section_Cross_Stage.ts:49-64`) · 서버 `attach_default_designs` 리핑암 · 산쪽 절토 · 암 경계 −0.5(`B06_Section_Router_Design.py:359-395`) · 사면이 ±20 m 안에서 안 닿으면 `extendUnclosed`(`Cross_Stage.ts:139-150` · `logic/B05_Profile_Sections_Ground.ts:269`). +- 브라우저에 표준값 — B = `fetchSectionContext`(`B06_Section_Api_Context.ts:18` · 서버 `B06_Section_Router.py:125-127`, config 값을 늘 실음). D 프로젝트는 노선 문맥이 None 일 뿐이라 될 것으로 봄 — 실측 필요 · 안 되면 D03 GET 에 두 칸. +- 계획고 — D 는 종단 설계 없음 · 분석은 `with_profile: False`(`Analyze.py:114`). 후보 ① 중심 지반고 = B 첫 종단 규칙(`logic/B05_Profile_Grade_Ground.ts:144` · `B05_Profile_Engine_RouteInitial_CrossEarth.py:7-8`) — 즉시 · 짝 이미 있음 ② 엔진 `balanced_profile`(`RouteInitial_Profile.py:325-474`) — 켜면 지문이 바뀌어 전 연도 재분석 · 고친 선엔 무효 ③ 브라우저 `groundFollowingBasePvi` + 기울기 고르기 — B 종단 정책까지 끌어옴. +- 서버 Node `cross.design`(`A00_Common/design/logic/design_calc_node.ts` · `package.json:14` build:design-calc) = 같은 `computeCrossDesign` — D 가 예상 단면 값을 저장할 때만 필요(지금은 보기만 → 저장 없음 · 5장 위반 아님). + +### C. 3D +- 지금: B05 `createRouteViewer` · 연도 DEM GLB `loadSurface` · 노선 선 · 측점 막대만 · `setCorridor` 안 씀(`D03_PlanAnalysis_UI_3D.ts:3-5`, `:64-83`). +- B05 코리도 = 순수 `buildCorridor(sections, routePoints, designSamples?)`(`B05_Profile/logic/B05_Profile_Corridor_Build.ts:140`) — 측점마다 chainage_m(선 첫 점 = 0) · center_x/y · frame.left_xy · samples · design(design_line · road_edges · ditch · section_mode) → `viewer.setCorridor(build)`(`B05_Profile_UI_Viewer.ts:84`) → 노면 메시 + 지형을 잘라 절 · 성토면(`B05_Profile_UI_Viewer_Corridor.ts:183-222` · `B05_Profile_UI_Corridor_Tin.ts:181` — `build.sections` 를 붙여야 잘림). +- 서버 저장 코리도 `corridor_{route}.json`(`B05_Profile_Router_Corridor.py:27-29`) = route_id 묶임 → D 엔 안 맞음 · E03 · E04 3D = 날 three.js · 다른 꼴 → 비권. + +### D. 측점 표기 +- B 화면 표기 한 벌 = `stationLabel(ch, interval, decimals)` `common_util/common_util_station.ts:11` → `n+r`(접두사 없음 · `:8`) · `inferStationInterval` `:34`. `No.` / `NO.` 는 B07 CAD · M02 표 · B05 알림 하나만(`B07_DesignDetail_Engine_Cad.py:319` · `M02_Table_Fill.py:297` · `logic/B05_Profile_RouteEdit_KeyNudge.ts:115`). +- 간격 — B = 프로젝트 `station_interval_m` 기본 20(`config_system_design.py:254`) · 시점 0. D = 20 고정 `PLAN_STATION_INTERVAL_M`(`UI_Map.ts:38`) · 번호 = D01 시작 누가(`route_start_m`)부터 절대 누가(`Router.py:229`, `:259` · `Plan.ts:98-124`) · 연도 경계 = 측점(`+r` 붙음). +- D 이미 `n+r`: 연도 머리 `UI_Page.ts:225-226` · 끝 · 목표 `:267-268` · 평면 눈금 `UI_Map.ts:209-218` → `B04_PreProcess_UI_MapOverlays.ts:294` · 횡단 머리 `UI_Cross.ts:65` · 3D 막대 `UI_3D.ts:72-81` → `B05_Profile_UI_Markers.ts:342`, `:415`(정수 · 간격 추정 → 평면 `61+14.5` 대 3D `61+15`). +- D 날 누가: D01 「노선 시작 · 종료 누가거리 (m)」 입력(`D01_PlanRegister_UI_Page.ts:65-66`) — 「초기에 누가거리 형태」에 맞는 자리 · D04 표 `시점 ~ 종점` 수 + 머리 「누가 (m)」(`D04_PlanConfirm_UI_Page.ts:224` · `ui_template_locale_de.ts:29`) · D04 xlsx `시점누가(m)` · `종점누가(m)`(`D04_PlanConfirm_Export.py:150-151`, `:169-170`) · shp dbf `시점누가` · `종점누가` N(11,2)(`Export.py:47-48`, `:116-117` · 345-C 양식 덧칸 · B03 은 무시). +- 도움말: `A05_EduDetail/guide/D03/03_평면_지도_읽기.md:11,18,29` · `04_측점_횡단.md:17` = `n+r` 로 적힘 · `guide/D01/05_누가거리.md:3,23-24` = m 입력. +- E(참고 · 이번 범위 밖): 대개 B06 저장 label `STA.0+120.000`(km 식 · `B05_Profile_Engine_Sections_Core.py:70`) 또는 `0+120`(`E03_StabSection_UI_List.ts:86` · E04 · E07 지도) · E02 표만 `stationLabel`(`E02_StabGround_UI_Tables.ts:306`) · E05 xlsx · PDF = label + 날 수(`E05_StabReport_Build.py:360-361`). + +### E. 위험 +- B 그룹 고침 = 0(모두 import). 선택 1건 — 범례 「기본 계획 횡단」을 「예상 횡단」으로 바꾸려면 `buildCrossSvg` 인자 하나(`Cross_Draw.ts:194`) · 그대로 둬도 뜻 맞음. +- 성능 — 꺾임점 고침 · 예상 횡단은 재분석 없음(288 s = 3 연도 6.5 km 전체 분석 · `완료보고_345_예정노선_안정성평가.md:12` · 경계 지점 옮길 때만) · 단면 하나 = ms 수준 · 3D `buildCorridor` 한 연도 ≈ 100 측점 × 0.2 m 쪼갬 + 지형 TIN 자름 = 메인 스레드 멈칫 가능 → 실측 뒤 길면 Worker. +- [저장] — 고친 연도마다 지형 · 계류 읽기 + `route_metrics`(비용면 캐시 `_derived/cost_<연도>` 재사용) · 실측 필요 · 저장 잠금 안이라 허용 범위. +- 데이터 — route_json 덧칸(`edited` · `base_mode` · `base_fingerprint` · 입력 마디)만 · `mode` 는 PLAN_MODES 그대로 → `_saved_mode` · D04 Link · Export 는 `planned` 만 읽음(`D04_PlanConfirm_Link.py:74-91`) → 그대로 흐름 · Link 지문 바뀜 = 연결된 B 프로젝트에 「바뀜」 표시(의도). +- 재분석(지문 다름 · 경계 지점 옮김) = 그 연도 고침 버림 → 알림 필요 · 처음 · 끝 마디 = 연도 경계 → 잠금(안 그러면 연도 사이 끊김). +- 3D 높이 — D03 `gridBounds` z = 격자 최소 · 최대(`UI_3D.ts:27-44`) · 코리도는 절대 좌표 → 지형과 높이 맞는지 스크린샷 확인. +- 짝 — `chain` ↔ `chainRows` 길이 출처 바뀜 → 거울 시험 `test_530_3_plan_logic.py` 함께. +- B 연결 뒤 B 프로젝트 측점은 0 부터(`요구서_345_예정노선_안정성평가.md:91`, `:103`) → D 번호와 다름(의도). + +## ③ 권하는 설계 + +- 지점 고침 자리 = D03 평면(TM · 측점 · 횡단 · 3D 가 한 화면) · D02 = 지금대로 연도 경계만. +- 고침 대상 = 고른 갈래 노선의 마디(IP) — 끌기 · 선 위 두 번 누름 = 넣기 · 오른쪽 누름 = 지우기 · 곡선 손잡이 = R · 처음 · 끝 마디 잠금 · 되돌리기 = 열 배열 쌓기 · 법정 최소 R 밑이면 막음(`criteria.min_radius_m`) · 권한 = 지금 규칙(산림청). +- 캐시 — `d03-plan` 에 `edits{연도: {base_mode, base_fingerprint, nodes, curve_flags, radii}}` 더함 · 자동저장 없음. +- 다시 셈(브라우저 즉시) — `rebuildLine` → planned → `lineLength` → `chainRows`(고친 길이) → `stationChainages` → 평면 · 카드(연장 즉시 · 최대 기울기 · 위반 = 「저장 때 셈」 · TS 짝 없는 ③ 서버 값) · 누른 측점 횡단 다시. +- [저장] — PUT 에 edits(마디 입력만 · 선 안 받음) → 서버 `node_polyline`(폴백 `build_planned_polyline`) → 끝점 = 지점 확인 → `route_metrics`(연도 지형) → `chain`(선 길이) → route_json. GET 은 저장된 고침을 지문이 같을 때만 돌려줌. +- 예상 횡단 — 새 순수 `logic/D03_PlanAnalysis_Expect.ts`: `sectionsGround` 측점 → `computeCrossDesign(samples, center_z, {ripping_rock · ${uphill}_cut · standard 측구 · standard · 암 경계 −0.5})` + `extendUnclosed` · `UI_Cross` 는 design 넘기고 groundOnly 끔 · 머리에 「예상 — 표준 횡단 기본값 · 계획고 = 지반고」 · 절 · 성토 ㎡ 줄은 `buildCrossSvg` 가 이미 그림 · 곡선 확폭은 첫 판에 뺌. +- 3D — 같은 Expect 결과로 측점 묶음(chainage = 연도 선 위 localM) → `buildCorridor` → `build.sections` 붙임 → `setCorridor` · 모달에 「예상 코리도」 켬끔(`setCorridorVisible`). +- 측점 표기 — D 화면 = `stationLabel` 한 벌(B 화면과 같음) · D01 = m 입력 옆에 즉시 「= 61+14.5」(저장값 m 그대로 · 서버 검사 그대로) · D04 표 · xlsx = 측점 표기 칸(+ m 숫자 칸 유지) · shp = 숫자 그대로(기계용 양식 덧칸) · 「No.」를 붙이기로 하면 D 전용 감쌈 함수 하나(B 안 고침). + +## ④ 계획 걸음 후보 + +창1 = 지점 고침(D03 Plan · Analyze · Router · Api · UI_Map · UI_Page · 새 Edit 둘) · 창2 = 예상 횡단 · 3D(UI_Cross · UI_3D · 새 Expect) · 창3 = 측점 표기(D01 · D04 · locale · 도움말). 창2 는 `cross.show` · `openPlan3d` 인자를 안 바꿈 → 창1 과 파일 안 겹침. + +1. 창2 · 예상 단면 순수 함수 · `D03_PlanAnalysis/logic/D03_PlanAnalysis_Expect.ts`(새) · 새 시험 — 비탈 표본 → design_line · 절 · 성토 ㎡ = 파이썬 `compute_cross_design` 값 대조. +2. 창2 · 횡단 패널 예상 단면(표준값 = `fetchSectionContext` · D 프로젝트 실측) · `D03_PlanAnalysis_UI_Cross.ts` · ORCA — 가이드 D 프로젝트(`_projects.json` plan) 측점 누름 → SVG 설계선 좌표 · ㎡ 수치. +3. 창2 · 3D 예상 코리도 · `D03_PlanAnalysis_UI_3D.ts` · ORCA 스크린샷 — 노면 높이 = 지형 · 절 · 성토 색 · 시간 실측. +4. 창1 · 마디 고침 순수(연도별 열 · 다시 그음 · 길이 · 끝 잠금) + `PlanRoute` nodes · curves · `logic/D03_PlanAnalysis_Edit.ts`(새) · `logic/D03_PlanAnalysis_Plan.ts` · 새 시험(끝점 그대로 · 길이 = `lineLength`). +5. 창1 · `chain` ↔ `chainRows` 고친 길이 받기(짝) · `D03_PlanAnalysis_Analyze.py` · `Plan.ts` · `test_530_3_plan_logic.py` 거울. +6. 창1 · 평면 마디 겹(끌기 · 넣기 · 지우기 · R 손잡이) · `D03_PlanAnalysis_UI_Map.ts`(700 줄 넘으면 새 `D03_PlanAnalysis_UI_Edit.ts`) · ORCA eval — 끌기 뒤 연장 · 측점 · 횡단 바뀜. +7. 창1 · 캐시 · 카드 · 되돌리기 · 재분석 알림 · `D03_PlanAnalysis_UI_Page.ts` · `D03_PlanAnalysis_Api.ts` · ORCA — 새로고침 뒤 캐시 살아 있음. +8. 창1 · [저장] 고침 정본 + GET 돌려줌 · `D03_PlanAnalysis_Router.py` · 새 `D03_PlanAnalysis_Edit.py` · `test_530_2_plan_router.py` + 새 시험(브라우저 선 = 서버 선 1 mm · 저장 시간 실측). +9. 창3 · D01 입력 옆 측점 표기 · D04 표 · xlsx 측점 칸 · `D01_PlanRegister_UI_Page.ts` · `D04_PlanConfirm_UI_Page.ts` · `D04_PlanConfirm_Export.py` · `ui_template_locale_de.ts` · `test_531_d04_export_finalize.py` + ORCA. +10. 창3(끝에) · 도움말 · `A05_EduDetail/guide/D01/05_누가거리.md` · `guide/D03/03_평면_지도_읽기.md` · `04_측점_횡단.md` · `06_3D_보기.md` · 새 고침 · 예상 횡단 절 · 눈 확인. + +## ⑤ 정할 거리(사용자) + +1. 「각지점」 = 추천 노선 꺾임점(IP) 고침으로 봄 — 연도 경계 지점은 이미 D02 · D03 에서 끌기 됨(산림청 계정만). 맞는지. +2. 예상 횡단 계획고 = 중심 지반고(B 첫 종단과 같음 · 즉시) 권함 — 종단 기울기를 고른 선이 필요하면 별건. +3. 측점 표기 = B 화면처럼 `61+14.5`(지금 D03 그대로 · D01 · D04 만 맞춤) 권함 · 또는 D 전부 `No.61+14.5`. + +브레인 몫(묻지 않음): 지반 기본 = 리핑암(B 초기와 같음) · 고침 권한 = 산림청 유지 · shp 숫자 칸 유지 · E 표기는 범위 밖.