knowledge(요구): 요구서 546 · 조사 셋 — 지도 아이콘 그룹화 · 노선 그리기 한 벌 · 예정노선 가이드 추천선 · B05 라이다 · PLAN 634~637 승인 대기

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-11-01 10:27:40 +09:00
co-authored by Claude Opus 5.5
parent 7b0eb34fb0
commit 7a28fb8bd0
4 changed files with 629 additions and 0 deletions
@@ -0,0 +1,196 @@
# 분석 546-A — B05 평면 · D03 예정노선 지도 아이콘 셋 그룹화
근거 = 요구 546(`docs/raw/요구_1101/사용자요구_1101.md:3-65` · 표 둘) · 코드 읽기 + headless 실측 한 번(5173 · 검증_랩탑메인 B · `_D` · 1920 · 1366 폭 · 누름 없음 · 저장 없음).
- 표 그룹2 = 17 줄(지시의 18 아님).
- 호버 글 = locale 사전 아님 — 겹 표(`A00_Common/map/map_layer_list.ts`) · 단추 표(`ui_template/ui_template_map_tools.ts`) · 페이지 덮어쓰기에 박힘.
## 1. 지금 상태
### 1-1 그룹1(지도 겹) — 표 22 줄 대 지금 겹 줄(`map_layer_bar` · 정의 = `map_layer_list.ts` 줄)
| # | 표 | 열쇠 · 아이콘 | 지금 호버(줄임) | 정의 | B05 | D03 | 표 호버 · 그룹 |
|---|---|---|---|---|---|---|---|
| 1 | 위성사진 | satellite · satellite | 위성사진 | :56 | 보임 | 보임 | 위성사진 · - |
| 2 | 음영기복 | hillshade · sun | 음영기복(2 m 지형 · …) | :57 | 보임 | 보임 | 음영기복도 · - |
| 3 | 도엽 등고선 | contour · mountain | 도엽 등고선(굵은 선 = …) | :58 | 보임(B05 자기 자료 · LAS/도엽) | 보임 | 등고선 · - |
| 4 | 급경사 색 | slope · angle | 급경사 색(기울기 % …) | :59 | 보임 | 보임 | 급경사 · - |
| 5 | 세류선 | stream · droplet | 세류선(가는 파랑) · 하천(굵은 파랑) | :62 | 보임(B05 자기 자료) | 보임 | 세류 · 수계망도 |
| 6 | 물면 | water · ripple | 물 면(도엽 실폭하천 · …) | :63 | 보임 | 보임 | 하천 · 수계망도 |
| 7 | 0차곡 | zeroOrder · arrowsJoin | 0차곡(지형 추정 …) | :125-130 | 보임 | 보임 | 0차곡 · 수계망도(지금 구역 묶음) |
| 8 | 계류100m | bands · borderOuter | 계류 100 m · 도로 300 m 띠(타당성평가) | :131-136 | **숨김**(:154) | 보임 | 계류100m · 수계망도 — 지금 한 겹이 띠 둘 |
| 9 | 기존도로 | road · road | 기존 도로(도엽 도로중심선) | :64 | 보임 | 보임 | 도로 · 도로 |
| 10 | 임도망도 | nationalRoad · route | 임도망도(산림청 전국 …) | :65-71 | 보임 | 보임 | 임도망도 · 도로 |
| 11 | 임도(업로드) | forestRoadFile · map | 임도(업로드)(산림청 시군구 SHP …) | :72-78 | **숨김**(:154) | 보임 | 임도(업로드) · 도로 |
| 12 | 지적도 | cadastral · borderAll | 지적도(참고용 · …) | :81 | 보임 | 보임 | 지적도 · 토지·건물 |
| 13 | 건물 | building · building | 건물(도엽 · 하류 민가 …) | :137 | 보임 | 보임 | 건물 · 토지·건물 |
| 14 | 지명 | place · mapPin | 지명(도엽 계곡 · …) | :138 | 보임 | 보임 | 지명 · 토지·건물 |
| 15 | 보호규제구역 | zones · shield | 보호 · 규제 구역(브이월드 …) | :82-86 | 보임 | 보임 | 보호규제구역 · 제한·재해 |
| 16 | 산림입지도 | soils · leaf | 산림입지도(토양형 · …) | :88-92 | 보임 | 보임 | 산림입지도 · 제한·재해 |
| 17 | 경제림육성단지 | ecoForest · trees | 경제림육성단지(산림청 2014 …) | :94-98 | 보임 | 보임 | 국유림·사유림 · 제한·재해 |
| 18 | 생태자연도 | ecology · plant | 생태자연도(환경부 …) | :100-104 | 보임 | 보임 | 생태자연도 · 제한·재해 |
| 19 | 산사태위험지도 | landslide · alert | 산사태위험지도(1~5 등급 …) | :106-110 | 보임 | 보임 | 산사태위험지도 · 제한·재해 |
| 20 | 산사태취약지역 | landslideZones · alertOctagon | 산사태취약지역(시도 …) | :112-116 | 보임 | 보임 | 산사태취약지역 · 제한·재해 |
| 21 | 단층 | faults · bolt | 단층(브이월드 지질 · 참고용) | :118 | 보임 | 보임 | 단층 · 제한·재해 |
| 22 | 지질구조선 | lineaments · lineDashed | 지질구조선(브이월드 …) | :119-124 | 보임 | 보임 | 지질구조선 · 제한·재해 |
| 밖 | — | gl · gauge | 그래픽 카드 그림(…) | `map_layer_bar.ts:68-75` | 보임 | 보임 | 표에 없음 |
- 지금 묶음(나눔선) = 바탕 4 · 물 · 길 5 · 구역 13(`map_layer_list.ts:54-140`) — 표 묶음과 다름.
- 지금 단추 수 = D03 22 + GL · B05 20 + GL(띠 · 임도(업로드) 숨김 = `MAP_LAYER_PAGES.b05.hide` `:154`).
- 막힘 글 덧붙임 = `map_layer_bar.ts:84-88`(「— 지형 받기 뒤 보임」 · 「— 옛 그림…엔 안 보임」) + B05 덮어쓰기 `B05_Profile_UI_RouteEdit_Layers.ts:166-180`.
### 1-2 그룹2(도구) — 표 17 줄 대 지금 도구줄(`map_toolbar.ts` 차례 · 단추 = `ui_template_map_tools.ts`)
| # | 표 | 열쇠 · 아이콘 | 지금 호버(정의) | B05 | D03 | 표 호버 · 사용(B05/D) |
|---|---|---|---|---|---|---|
| 1 | 조작도움말 | hint-toggle · help | 조작 도움말 펼치기 · 접기(`ui_template_map_tools.ts:122`) | 있음 | 있음 | 도움말 · 사용/사용 |
| 2 | 되돌리기 | undo | 되돌리기 (Ctrl+Z)(`:23` · B05 `_Chrome.ts:156`) | 있음 | 있음 | 되돌리기 · 사용/사용 |
| 3 | 다시하기 | redo | 다시하기 (Ctrl+Y)(`:24` · `_Chrome.ts:157`) | 있음 | 있음 | 다시하기 · 사용/사용 |
| 4 | 3D 보기 | view3d · cube | B05 「3D 화면을 큰 창으로 엽니다 — …」(`design_view_profile_3d_modal.ts:78`) · D03 「3D 보기」(`:25`) | 있음 | 있음 | 3D · 사용/사용 |
| 5 | 반시계로 돌리기 | rotate-ccw | 반시계로 돌리기(`:26`) | 있음 | 있음 | 좌 회전 · 사용/사용 |
| 6 | 시계로 돌리기 | rotate-cw | 시계로 돌리기(`:27`) | 있음 | 있음 | 우 회전 · 사용/사용 |
| 7 | 1m 등고선 | contour-minor · ripple | 「1m 간격 등고선을 … (확대하면 보임)」(`B05_Profile_UI_RouteEdit.ts:654-656` 가 `_Chrome.ts:160` 덮음) | 있음 | 없음 | 등고선 1m · 사용/미사용 = 맞음 |
| 8 | 측점 | stations · tallymarks | B05 「측점 — …」(`_Chrome.ts:163-165`) · D03 「측점」(`D03_PlanAnalysis_UI_Map.ts:238`) | 있음 | 있음 | 측점 · 사용/사용 |
| 9 | 구간길이 기울기 | slopes · percentage | B05 「기울기 — …」(`_Chrome.ts:166-168`) · D03 「구간 길이 · 기울기」(`UI_Map.ts:239`) | 있음 | 있음 | 길이·기울기 · 사용/사용 |
| 10 | 절성토선 | footprint · road | 「절/성토선 — …」(`_Chrome.ts:169-171`) | 있음 | 없음 | 절성토선 · 사용/미사용 = 맞음 |
| 11 | 길이재기 | measure · ruler | B05 「거리 재기 — …」(`_Chrome.ts:172-174`) · D03 「거리 재기」(`:32`) | 있음 | 있음 | 길이측정 · 사용/사용 |
| 12 | 스냅 | station-snap · magnet | 「측점 스냅 — 켜면 …」(`_Chrome.ts:175-178`) | 있음 | 없음 | 스냅 · 사용/미사용 = 맞음 |
| 13 | 스냅 간격 | snap-step · 「간격」 글 + 날 `<select>` | 「측점 스냅 간격 — …」(`_Chrome.ts:134-141`) | 있음 | 없음 | 스냅 간격 · 사용/미사용 = 맞음 |
| 14 | 예정노선 변경 | expected-draw · pencil | 「예정노선 변경 — 켜면 …」(`:34-39`) | **있음**(626-3) | 없음 | 미사용/미사용 → B05 숨길 것 |
| 15 | 예정노선 원본 | expected-original · lineDashed | 「예정노선(원본) — …」(`:40-45`) | **있음** | 없음 | 미사용/미사용 → B05 숨길 것 |
| 16 | 추천노선 보기 | recommend · compass(`createPickMenu`) | 「추천 노선 보기 — …」(`B05_Profile_UI_RouteEdit_RecPreview.ts:46`) | 있음 | **없음** | 추천노선 · 사용/사용 → D03 새로(D 전용 셈) |
| 17 | 수치지형도/라이다 | terrain · 분할 고르기 둘 | B05 「설계 지형 — …」 · D03 「분석 지형 — …」(`map_terrain_chip.ts:21-24`) + D03 [LAS 올리기](`D03_PlanAnalysis_UI_LidarUpload.ts:63-73`) | 칩만 | 칩 + LAS 올리기 | 수치지형도/라이다 · 사용/사용 → B05 LAS 올리기 새로 |
- 표 밖이지만 지도 위에 있는 것 = 그래픽 카드 단추(겹 줄 끝) · 위성 밝기(범례 칸 · `map_sat_light.ts`) · 급경사 범위 ⚙(범례 칸 · `map_slope_bands.ts`) · LAS 올리기(D03 지형 칸) · 도로 300 m 띠(계류 띠와 한 겹). 위성 밝기 · 급경사 ⚙ 는 범례 칸이라 아이콘 셋과 무관.
- 같은 아이콘 둘 = `ripple`(1m 등고선 · 물 면) · `road`(절/성토선 · 기존 도로) · `lineDashed`(예정노선 원본 · 지질구조선).
### 1-3 지금 자리 · 줄 · 칸(실측)
| 화면 | 지도 칸 폭 | 도구줄 | 겹 줄 |
|---|---|---|---|
| B05 1920 | 1572 | 왼쪽 위 1 줄 947 px(17 칸 · 간격 고르기 132 · 지형 칩 170) | 그 아래 둘째 줄 801 px(20 + GL) |
| B05 1366 | 1018 | 947 px 넘침 0 | 801 px |
| D03 1920 | 1600 | 오른쪽 1 줄 612 px(10 칸 · 지형 칸 226) | 왼쪽 1 줄 872 px(22 + GL) |
| D03 1366 | 1046 | **두 줄로 감김**(455 px · 높이 78) | 565 px 보임 · 내용 871 → 가로 밀기 |
- B05 = 세로 칸 하나에 도구줄 → [?] 판 → 겹 줄 → 예정노선 판 차례(`_Chrome.ts:193-196` · css `B05_Profile_UI_Style_RouteEdit.css:19-35` · ☰ 비킴 `:33`).
- D03 = 따로 뜬 둘 — 겹 줄 왼쪽(최대 55 % · `D03_PlanAnalysis_UI_Style.css:71-76`) · 도구줄 왼쪽 끝 = 겹 줄 폭(`--d03-layers-w` 기본 222px · `UI_Style.css:47-53` · 재기 `UI_Layers.ts:194-197`) · 도구줄 줄바꿈(625-4 · `UI_Style.css:56-61`).
- 범례 = D03 왼쪽 아래 따로(`UI_Style.css:78-90`) · B05 상태 글판 안(`_Chrome.ts:221`) — 아이콘 행과 안 겹침.
- 묶은 뒤 어림 — 그룹1 ≈ 9 단추(단독 4 + 묶음 4 + GL) ≈ 360 px · 그룹2 B05 ≈ 860 px(지금 − 예정노선 둘 85) · D03 ≈ 660 px(+ 추천 49) → 한 행 B05 ≈ 1230(1920 들어감 · 1366 그룹2 밀기) · D03 ≈ 1030(1920 들어감 · 1366 아슬 · 1280 밀기).
## 2. 표와의 차이
### 2-1 없는 것 · 막힌 것
| 항목 | 페이지 | 지금 | 서버 길 · 자료 | 할 일 |
|---|---|---|---|---|
| 계류100m | B05 | 숨김 · B05 받기 없음(`_Layers.ts` `fill` 에 bands 없음 · D03 만 `UI_Layers.ts:547`) | `GET /plan/layers/bands` 종류 안 가림(`D03_PlanAnalysis_Router.py:454` → `_layer_root` → `road_frame`) · 꼴 `map_layer_specs.ts:134`(`_band` 로 계류 · 도로 가름) · B 실측 안 함 | B05 받기 한 갈래 + 계류 띠만 거름 |
| 계류100m | 둘 | 한 겹 = 계류 100 m + 도로 300 m(`map_legend.ts:154-166`) | 그대로 | 결정 7 |
| 임도(업로드) | B05 | 숨김 · 올리는 자리 없음 | `forest-roads` 길 = `_plan_ends` → `store.load_plan`(예정노선 아니면 400 · `Router.py:87` · `Store.py:77`) | 결정 12(546 공유 일감) |
| 추천노선 보기 | D03 | 없음 | B05 추천 = 임도 `route_recommend/` 저장본 — D 에 없음 · 비고 = D 전용 빠른 셈(기준점 · 20 m · −14~14 % · 급경사) | 새 셈 일감 |
| 수치지형도/라이다 LAS 올리기 | B05 | 칩만(`B05_Profile_UI_RouteEdit_Terrain.ts`) | B03 올리기 길 + B04 전처리 · 설계 지형 바꿈 `POST /route/design-terrain` 있음 | 새 화면 일감 |
| 예정노선 변경 · 원본 | B05 | 보임 | — | 숨김(결정 13 시점) |
| 건물 · 지명 · 음영기복 · 0차곡 | 둘 | 있음(B05 도엽 조각 `_Layers.ts:63-69` · 음영 `fetchPlanRaster`) | 있음 | 이름만 |
### 2-2 이름만 바뀜(호버 = 표)
- 그룹1 22 개 모두 괄호 · 설명 걷음(예외 임도(업로드)) · 물면 → 「하천」 · 세류선 → 「세류」 · 경제림 → 「국유림·사유림」 · 음영기복 → 「음영기복도」.
- 그룹2 = 도움말 · 되돌리기 · 다시하기 · 3D · 좌 회전 · 우 회전 · 등고선 1m · 측점 · 길이·기울기 · 절성토선 · 길이측정 · 스냅 · 스냅 간격 · 추천노선 · 수치지형도/라이다.
- 페이지가 덮는 호버 = `_Chrome.ts:156-178` · `RouteEdit.ts:654-656` · `design_view_profile_3d_modal.ts:78` · `UI_Map.ts:238-239` · `RecPreview.ts:46` · `map_terrain_chip.ts:21-24 · 59-61` · `_Chrome.ts:136` · `LidarUpload.ts:72-73` — 모두 표 한 곳으로.
## 3. 권하는 구조
### 3-1 데이터 표 한 벌(사용자 표 두 장 = 두 파일)
| 표 | 자리 | 줄 꼴 |
|---|---|---|
| 그룹1 | `A00_Common/map/map_layer_list.ts` `GROUPS` → 평평한 목록(표 차례) | `{ key, icon, title(호버제목), group: "water" \| "road" \| "land" \| "limit" \| null, pages: {b05, d03}, on }` + 묶음 표 `LAYER_GROUPS = { water: {name: "수계망도", icon} … }` · `MAP_LAYER_PAGES` 는 처음 켬 · 취향 열쇠만 남김(hide → `pages`) |
| 그룹2 | `A00_Common/map/map_toolbar.ts` `MAP_TOOLBAR` | 줄에 `title`(호버제목) 더함 · `pages` = 표(예정노선 둘 = [] · 추천 = 둘(D 셈 붙을 때)) · 묶음 없음(결정 6) |
- 페이지 덮어쓰기 글 걷고 표에서만 읽음 · 막힘 까닭만 페이지가 넘김(결정 10).
### 3-2 부품
| 부품 | 자리 | 더할 꼴 |
|---|---|---|
| 여럿 고르기 메뉴 | `ui_template/ui_template_context_menu.ts`(383) `createPickMenu` + `.css` | `multi: true` = `menuitemcheckbox` · 눌러도 안 닫힘(`:340` 의 `setOpen(false)` 를 하나 고르기만) · `values()` · 줄 `icon` · `disabled` · `title` · 줄 하나 고침 `setItem` · 단추 ▾ + 켠 수 배지(`ui_template_badge` `kind: "count"`) · 하나라도 켜면 눌림 |
| 견본 | `ui_template/ui_template_ui_kit_parts.ts` `KIT_PARTS` | 「고르기 메뉴(하나 · 여럿)」 한 줄 — 지금 `createPickMenu` 견본 없음 |
| 한 행 두 영역 | `ui_template/ui_template_map_tools.ts` · `.css` | 두 도구줄 한 행 꼴(각 영역 `min-width: 0` · 자기 가로 밀기 `watchOverflow` 그대로 · [?] 판은 행 아래) |
| 겹 줄 | `A00_Common/map/map_layer_bar.ts`(96) | 표 `group` 대로 단독 단추 · 묶음 메뉴 · `sync` 가 단추 · 메뉴 줄 막힘 · 글 모두 맞춤(B05 덮어쓰기 걷음) |
| 아이콘 | `ui_template/ui_template_icons.ts` | 묶음 넷 · 겹친 셋 대신(결정 4) |
- 새 날 `<button>` 없음 — 메뉴 줄은 지금 `createPickMenu` 줄 꼴(`ui-row-menu__item`) 그대로 · 스냅 간격 날 `<select>`(`_Chrome.ts:134-141`)는 고르기 메뉴 하나로(결정 16).
- 페이지 자리 CSS 걷음 — D03 `UI_Style.css:46-76`(222px 기댐 · 줄바꿈) · `UI_Layers.ts:194-197` · B05 css `:19-35` → 공용 한 행 하나.
### 3-3 사용/미사용 · 이원화(페이지 갈래 남은 곳)
- 사용/미사용 = 이미 표 둘(`MAP_LAYER_PAGES.hide` · `MAP_TOOLBAR.pages`) — 표 두 장과 1:1 로 맞추면 끝.
- 남은 갈래:
| # | 갈래 | B05 | D03 |
|---|---|---|---|
| 1 | 겹 받기 · 그리기 | `_Layers.ts`(412 · GL 둘째 칸) | `UI_Layers.ts`(672 · 옛 캔버스 · 조각) — 같은 서버 길 두 벌 |
| 2 | 막힘 글 | 공용 sync + `_Layers.ts:166-180` 덮음 | 공용 sync |
| 3 | 도구 호버 | `_Chrome.ts` · `RouteEdit.ts` · 3D 모달 | `UI_Map.ts` · `MAP_TOOLS` |
| 4 | 측점 · 기울기 켬끔 | `_Marks.ts:14`(측점 켬 · 기울기 끔) | `UI_Map.ts:191`(둘 다 켬) |
| 5 | 지형 칸 | `_Terrain.ts`(칩 · 없으면 숨김) | `LidarUpload.ts`(칩 + LAS) |
| 6 | 자리 CSS | 세로 두 줄 | 따로 뜬 둘 |
| 7 | GL 취향 | `aislo:pref:map.canvas`(`B04_PreProcess_UI_MapGl.ts:27` · B04 · 배수 같이) | `aislo:pref:d03.canvas`(`UI_Layers.ts:89`) |
| 8 | 도움말 글 · 재기 · 3D | 페이지 몫(A⑩) | 페이지 몫 |
### 3-4 기억 열쇠
| 무엇 | 자리 | 묶은 뒤 |
|---|---|---|
| 겹 켬끔 | `aislo:pref:b05.layers` · `aislo:pref:d03.layers`(`map_layer_list.ts:151-156` · 브라우저 + 계정 올림 `b_page_state.ts:289 · 449`) · 값 = `{겹 열쇠: 참/거짓}` | 그대로(겹 열쇠 단위 · 메뉴 열림은 안 적음) |
| 그래픽 카드 | 위 표 7 | 그대로 |
| 위성 밝기 · 급경사 범위 | `aislo:pref:d03.satellite-light` · `d03.slope-bands`(두 페이지 같이) | 그대로 |
| 도구 켬끔 | B05 측점 · 기울기 = 페이지 메모리(`_Marks.ts:14`) · 절성토선(`_Footprint.ts:28`) · 1m(`_Contour.ts:256`) · 스냅(`RouteEdit.ts:168`) · 간격 = 세션 `routeedit-snap-step`(`_SnapStep.ts:68`) · [?] 열림(`_Chrome.ts:85`) / D03 측점 · 기울기(`UI_Map.ts:191`) · 지형 = 세션 `d03-terrain` | 그대로 |
## 4. 사용자 결정 거리
| # | 물음 | 권함 |
|---|---|---|
| 1 | 두 영역 차례 | 그룹1(지도 겹) 왼쪽 · 그룹2(도구) 오른쪽 한 행(지금 D03 꼴) |
| 2 | 둘 다 넘칠 때 | 각자 내용 폭 · 모자라면 그룹2 먼저 가로 밀기 |
| 3 | 묶음 단추 꼴 | 묶음 아이콘 + ▾ + 켠 수 배지(0 = 없음) · 하나라도 켜면 눌림 · 호버 = 그룹명 |
| 4 | 묶음 아이콘 | 묶음 전용 새 아이콘 넷 · 겹친 아이콘 셋(ripple · road · lineDashed)도 바꿈 |
| 5 | 메뉴 안 줄 | 항목 아이콘 + 호버제목 + ✓ · 「모두 끔」 줄 없음 · 막힌 줄 흐림 |
| 6 | 「-」 · 그룹2(그룹명 = 항목명 · 빈칸) | 모두 단독 아이콘 — 그룹2 는 묶지 않음 |
| 7 | 계류100m | 계류 100 m 띠만 그림 · 도로 300 m 띠 숨김(서버 · 자료 그대로) |
| 8 | 세류(세류선 + 하천중심선) · 하천(물 면) | 이름만 표대로 · 그림 그대로 |
| 9 | 그래픽 카드 단추(표 밖) | 그룹1 끝 단독 · 호버 「그래픽 카드」 |
| 10 | 막힘 까닭 | 평소 제목만 · 막힘일 때만 「제목 — 까닭」 |
| 11 | 지금 긴 설명 | 걷음(도움말 판 글은 그대로) |
| 12 | B05 임도(업로드) | 아이콘은 표대로 · 자료 = 546 공유 일감(D 에서 받은 묶음 읽기) · 그 전 막힘 + 까닭 |
| 13 | B05 예정노선 변경 · 원본 숨김 시점 | B05 좌측 그리기(546 공유 일감)와 같은 일감에서 숨김 |
| 14 | D03 추천노선 · B05 LAS 올리기 | 셈 · 올리기 = 따로 일감 · 아이콘 일감은 자리만 |
| 15 | 측점 · 길이·기울기 처음 값(D03 둘 다 켬 · B05 기울기 끔) | 그대로 |
| 16 | 스냅 간격 날 `<select>` | 이번에 고르기 메뉴(하나)로 |
| 17 | 그래픽 카드 취향 열쇠 둘 | 그대로(하나로 = B04 · 배수 칸도 바뀜) |
## 5. 일감 나눔
| 차례 | 일 | 파일(줄) | 시험 |
|---|---|---|---|
| 1 | 부품 — 여럿 고르기 메뉴 · 배지 · 한 행 두 영역 · 견본 · 아이콘 | `ui_template_context_menu.ts`(383) · `.css` · `ui_template_map_tools.ts`(156) · `.css` · `ui_template_ui_kit_parts.ts`(381) · `ui_template_ui_kit_frames.ts` · `ui_template_icons.ts` | 568_1 · 626_1 · 552_4 |
| 2 | 표 두 장 · 공용 겹 줄 | `map_layer_list.ts`(215) · `map_layer_bar.ts`(96) · `map_toolbar.ts`(83) | 624_2 · 624_3 · 622_2 |
| 3 | 두 페이지 배선 · 호버 덮어쓰기 걷음 · 자리 CSS · B05 계류 띠 받기 | D03 `UI_Map.ts`(579) · `UI_Layers.ts`(672 ⚠) · `UI_Style.css` · `LidarUpload.ts` / B05 `_Chrome.ts`(302) · `_Layers.ts`(412) · `RouteEdit.ts`(683 ⚠) · `_RecPreview.ts` · css · `design_view_profile_3d_modal.ts` · `map_terrain_chip.ts` | 553_4 · 625_draw · b05_routeedit_initial · 626_3 |
- 창 수 = **하나**(1 → 2 → 3 차례 · 같은 파일 묶음이라 나누면 겹침).
- 따로 일감(아이콘 밖 · 546 공유 쪽과 함께) = B05 임도(업로드) 자료 · D03 추천 셈 · B05 LAS 올리기 · 예정노선 변경 → 좌측 그리기.
- 700 줄 — `D03_PlanAnalysis_UI_Layers.ts` 672 · `B05_Profile_UI_RouteEdit.ts` 683 · `D03_PlanAnalysis_UI_Page.ts` 680 = 줄 늘리지 않음(지움 · 글 줄임만) · `ui_template_context_menu.ts` 383 + ≈ 60 · `_Layers.ts` 412 + ≈ 15 = 괜찮음.
## 6. 위험
| 위험 | 자리 | 막는 길 |
|---|---|---|
| B05 막힘 글 덮어쓰기가 `layerBar.root.querySelector('[data-layer=…]')` — 메뉴 판은 열 때만 body 에 붙어 못 찾음 | `_Layers.ts:166-180` · `ui_template_context_menu.ts:353-363` | 공용 `sync` 로 옮김 |
| 메뉴 판 = fixed — 도구줄 가로 밀기 · 창 크기에 안 따라감 | `context_menu.ts:353-360` | 밀거나 크기 바뀌면 닫음 |
| 한 번에 하나 메뉴 · 지도 누름 · Esc 닫힘 | `context_menu.ts:46-79` | 그대로(의도) · 긋기 Esc 와 안 섞임 |
| 시험 고정 글 · 꼴 | `test_625_draw.py:189`(D03 줄바꿈) · `test_624_2` · `test_624_3` · `test_553_4` · `test_b05_routeedit_initial.py:206-209` · `test_626_1:45-50` · `test_568_1:87` | 낡은 시험 고침 · 까닭은 커밋 글 |
| 가이드 촬영 셀렉터 | `A05_EduDetail/guide/D03/_scenes.json:19-20`(`.d03-plan__layers [data-layer=…]`) · `B05/_scenes.json:3`(`[data-slot=terrain-name]` 이미 없음) | 다시 찍기는 사용자 지시 때 |
| 같은 아이콘이 한 행에 | 1-2 끝 | 결정 4 |
| 예정노선 변경 먼저 숨기면 626-3 고치는 길 사라짐 | `map_toolbar.ts:48-55` | 결정 13 |
| B 띠 서버 길이 없으면 B04 `processed/도엽_*` 를 새로 풂 | `D03_PlanAnalysis_Layers.py:86-100` | 일감 창이 B 실측 |
| 숨김 풀린 B05 띠 · 임도(업로드) 취향은 옛 끔 | `map_layer_list.ts:179` | 처음 끔(문제 아님) |
| 호버 글이 사전(locale) 밖 | 겹 표 · `MAP_TOOLS` | 이번 범위 밖 |
@@ -0,0 +1,163 @@
# 546-B 조사 — D 예정노선 · B05 평면 노선 긋기 로직 공용화
원문 = `docs/raw/요구_1101/사용자요구_1101.md` 요구 546 「(중요)」 줄. 읽기 · 실측만(코드 · git · storage 손 안 댐 · 화면 안 띄움).
실측 = 검증_랩탑메인 B `dad81824` · D `e50c92f5` · 가이드_예정노선 `87d47800` 파일 · DB 읽기.
## 0. 결론
- 부품(긋기 · 고르기 · 메뉴 · 속성 판)은 이미 같은 함수. **두 벌인 것 = 엮는 코드 · 지도 입력 · 왼쪽 칸 꾸밈 · 숨김 방법 · 예정노선 자료 꼴.** 「일원화 안 됨」의 실제 까닭.
- 숨김이 표가 아니라 `oneLine` 플래그 열한 곳 + 가짜 값(빈 지점 · epsg 0)으로 흩어짐 — 사용자가 확인할 표가 없음.
- B05 예정노선 = 조밀 점 331 개(3.1~3.5 m · 원본 shp 꼭짓점 121) → D 의 「노드 몇 개」 고치기와 꼴이 다름. D 연결 노선도 체인이 조밀화함.
- 여러 연도 받기 · 다른 연도 흐리게 = **지금 길 없음**(연결 = 조각 하나 · 한 B 프로젝트에 한 행). 서버 새 길 필요.
- 권함 = D03 폴더에 「키트」 하나(부품 엮기 · 칸 · 겹 차례 · 키 · 지도 입력) + 페이지 기능 표(지도 도구줄 표와 같은 꼴) · B05 는 키트를 부르고 표로 숨김.
## 1. 지금 상태
### 1-1 공용(같은 코드)
| 덩이 | 자리 | B05 부름 |
|---|---|---|
| 긋기 겹 `createPlanDraw` | `D03_PlanAnalysis_UI_Draw.ts` | `B05_Profile_UI_ExpectedDraw.ts:122-129` |
| 고르기 겹 `createPlanEdit` | `D03_PlanAnalysis_UI_Edit.ts` | `ExpectedDraw.ts:135-147` |
| 속성 판 `createPlanProps` | `D03_PlanAnalysis_UI_Props.ts` | `ExpectedDraw.ts:148-161` |
| 우클릭 메뉴 `createPlanMenu` | `D03_PlanAnalysis_UI_Menu.ts` | `ExpectedDraw.ts:162-171` |
| 방식 칸 · 부채꼴 · 순수 셈 | `A00_Common/map/map_draw_kind.ts` · `D03/logic/*` | 간접 |
| 도구줄 표 · 겹 · 범례 · 지형 칩 | `A00_Common/map/*` | 둘 다 |
| 지도 이동 · 돌림 · 보기 | B05 `_RouteEdit_Input` · `_Rotate` · `_View` | D03 `UI_Map.ts:34-36` 가 B05 것 부름 |
### 1-2 사본(같은 일을 두 번 짬)
| 일 | D03 | B05 |
|---|---|---|
| 부품 만들기 · 서로 잇기 | `UI_Page.ts:133-209` | `ExpectedDraw.ts:121-175` |
| 왼쪽 칸(위치 · 지점 · 그리기 · 구역·연도 · [저장][초기화]) | `UI_Page.ts:240-277` | 없음 — 그리기 몸만 도구줄 밑 떠 있는 판(`ExpectedDraw.ts:177-183`) · 위치 칸 없음 |
| 겹 차례 | `UI_Page.ts:355-364` | `ExpectedDraw.ts:172` |
| 화면 좌표 꾸러미(ScreenMap) | `UI_Map.ts:353-392` | `ExpectedDraw.ts:293-316` |
| 누름 · 맴돎 · 놓음 · 우클릭 나눠 주기 | `UI_Map.ts:452-510` | `ExpectedDraw.ts:325-376`(켠 동안 먼저 가로챔) |
| 키 받기 | `UI_Page.ts:623-640` | `ExpectedDraw.ts:378-385` |
| 겹 그리기 돌림 | `UI_Map.ts:394-408` | `ExpectedDraw.ts:404-410` |
| 원본 옅은 점선 | — | `ExpectedDraw.ts:389-403`(B05 만) |
| 거리 재기 | `UI_Measure.ts` + `logic/Measure` | `_RouteEdit_Measure.ts`(결정 A⑩ = 페이지 몫 · 그대로) |
| 되돌리기 | 페이지 스택 `UI_Page.ts:307-343` | 페이지 사진첩 `expected` 칸(`_RouteEdit_History.ts:34`) — 둘 다 `commit` 받는 쪽 · 문제 아님 |
### 1-3 갈래(같은 코드 안 페이지 가름)
| 꼴 | 자리 |
|---|---|
| `oneLine` 플래그 | `UI_Draw.ts:72-83 · 106 · 162 · 384` · `UI_Menu.ts:28 · 51 · 86` · `UI_Props.ts:71 · 216 · 243 · 270` · `UI_DrawPanel.ts:38 · 54` |
| 가짜 값 숨김 | `ExpectedDraw.ts:50-61` 빈 지점(`full: true` → 메뉴 「지점 놓기」 사라짐) · `base: []` · `points: []` · `addPoint` 빈 함수 · `epsg: 0`(속성 판 경위도 빈칸) · `yearStart` 올해 |
| 한 선 두 번 막음 | `oneLineBlock` + `ExpectedDraw.ts:251-254`(가운데 토막 지움 = 두 선 → 알림 뒤 되돌림) |
| 켬끔 | 도구줄 「예정노선 변경」 켠 동안만 D 기능 · 끄면 B05 옛 편집(`ExpectedDraw.ts:196-215`) |
### 1-4 자료 꼴 차이(사용자 눈에 다르게 보이는 까닭)
| 칸 | D03 | B05 |
|---|---|---|
| 예정노선 | 꼭짓점 적음(가이드 5 · 12 · 5) + 노드 기록(방식 · 길이 · 기울기) | 조밀 점 331(검증 B 실측 · 간격 3.09~3.50 m · 원본 shp 121) · 노드 기록 없음 — `load_design_route` 조밀화(`common_util_route_geometry.py:284-287`) |
| 지형 | 예정노선 지형면(`UI_Page.ts:129-132`) | 설계 지형 격자(`ExpectedDraw.ts:209`) |
| 좌표 | GRS80 TM(5185~5188 · 5179 · `logic/D03_PlanAnalysis_Tm.ts:18-28`) | 사업지 좌표(검증 B = 5176 Bessel · TS 변환 없음) |
## 2. 요구별 차이
| 요구 | 지금 | 모자람 |
|---|---|---|
| 기본 로직 한 벌 · 숨김으로 일원화 | 부품만 같음(1-1) · 엮기 · 입력 · 칸 두 벌(1-2) | 키트 하나 + 기능 표 |
| B05 왼쪽 판 = D03 그리기 · 위치 칸 | 그리기 = 떠 있는 판 · 위치 없음 · B05 왼쪽 판 = 「구조물 배치」(order 10 · `design_sections.ts:20-24`) · 「페이지 설정」(order 20 · `_Panel_Sections.ts:17-21`) | `registerPanelSection` 로 칸 둘(order 1 · 2) · 편집기가 나중에 서므로 빈 자리 + 편집기가 채움 |
| 위치 칸 B 꼴 | D03 위치 = 주소 찾기 → 기준점 → **지형 받기**(`UI_Page.ts:454-465`) · 찾기 API `/map/search` 는 프로젝트 무관(`D03_PlanAnalysis_Api.ts:196-197`) | B = 찾기 → 지도 이동만 · 받기 · 기준점 · 임도(업로드 · B 400 624-1) 숨김 |
| 노드 제어 · 삭제 · 다시 긋기 | 됨(626-3 검증) — 단 조밀 점 331 위 | 고칠 선 = 받은 원본 꼭짓점(서버 `load_design_route(root)` 표면 인자 없이 = 좌표만 맞춘 원본 `:286-287`) |
| 한 · 여러 연도 받기 | 연결 = 지정 행 하나 = 조각 하나 shp(`D04_PlanConfirm_Link.py:174-185`) · 한 B 에 한 행(`:149-166` 옛 연결 끊음) · B03 은 최신 shp 하나만(`common_util_route_geometry.py:200-214`) | 같은 선 이어진 조각 합치기 · 여러 행 · B03 여러 고름 |
| 자기 몫 표시 | B 에 남음 — `projects.source_project_id` · `source_fingerprint` · `plan_route_assignees.linked_project_id`·`piece_id`(`D04_PlanConfirm_Link.py:341-367`) | 실측: 지정 40 행 중 연결 0 · 검증 B 는 파일 올림(source 없음) → 연결된 검증 B 없음 |
| 다른 연도 · 구역 흐리게 | 길 없음 | 서버 새 GET(D 원본 조각 · 내 조각 표시 · 연도 · B 좌표로 · 업체 이름 뺌) + 보기 전용 겹 |
| 전후 비교 | 「예정노선(원본)」 도구줄 켬끔 옅은 점선(`ExpectedDraw.ts:185-194 · 389-403`) | 도구줄 아이콘 걷음(요구 표) → 왼쪽 그리기 칸으로 · 길이 비교 없음 |
| [초기화] = 받은 노선 | 페이지 [초기화] = 초기값 통째 + `expected_route_edit.csv` 지움(`Router_Lifecycle.py:356-357`) → 받은 노선 추적선으로 돌아감(구조물 · 종단 등 B 설계도 다 초기값) | 옛 프로젝트 초기값 = 추천 노선(검증 B `initial_choice.json` = earthwork) → 받은 노선 아님(D5) · 「예정노선만 되돌림」 길 없음 |
| 고친 뒤 B 로직 이어감 | `/route/follow`(저장 0) → 편집기 한 걸음 → 페이지 [저장] → `expected_route_edit.csv` + 종 · 횡단 다시 셈(626-2 · 626-3 검증) | 한 선이면 충분 · 여러 선은 B05 계획선이 하나라 내 조각(이어진 것)만 계획선 · 나머지 = 보기만 |
| 「예정노선 변경」 · 「원본」 아이콘 걷음 | `map_toolbar.ts:48-55` · `ui_template_map_tools.ts:34-45` · `_RouteEdit_Chrome.ts:67-70 · 295-296` · css `:493-516` · 시험 `test_626_3:108` | 걷고 왼쪽 「예정노선 수정」 단추로 |
| 켬 때 다른 계획노선 선 어둡게 | 없음 · 불투명 토큰 없음 | `drawRouteEditScene` 의 발자국 → 구조물 마커 구간(`_RouteEdit_Render.ts:256-353`)을 `globalAlpha` 로 · 장면 칸 하나 · 추천 보기(`underRoute :265`)도 |
## 3. 권하는 공용 구조
| 갈래 | 내용 | 값 |
|---|---|---|
| **① D03 제자리 + 키트(권함)** | 새 `D03_PlanAnalysis_UI_Kit.ts`(Page 133-209 · 240-277 · 355-364 · 623-640 옮김) · 새 `_UI_Features.ts`(기능 표 · `pages: d03 · b05` · `map_toolbar.ts` 꼴) · 지도 입력 나눠 주기 한 함수(Map 452-510 = ExpectedDraw 325-376 · `capture` 칸) · `oneLine` · 가짜 값 → 표 읽기 | 이원화 0 · 시험 경로 그대로 · D03 Page 680 → 약 480 · ExpectedDraw 448 → 약 200 |
| ② `A00_Common/plan_route/` 이사 + 키트 | ①을 공용 폴더로 · logic 짝 머리(`Draw.ts`↔`.py` · `Tm.ts` · `Plan.nameError`) 고침 | 깔끔하나 시험 약 20 개 경로 고침(UI 9 · logic 11) — 셋째 페이지가 쓸 때 |
| ③ 지도 하나 | B05 편집기를 D03 `createPlanMap` 위로(또는 반대) | 카메라 · GL · 등고선 · 구조물 겹이 다름 · Bessel 좌표 못 받음(TS) — 안 권함 |
키트 꼴(①):
- 입력 = `{ page, network · commit · show, heightAt, lonLat?(경위도 · 없으면 칸 숨김), editable, onMode, cards: { site?: 찾기 → 이동 } }`.
- 내놓음 = `{ cards(위치 · 지점 · 그리기 · 구역·연도 중 표가 켠 것), layers(차례 고정), props, menu, key(event), sync() }`.
- 저장 · 초기화 · 되돌리기 = 페이지 몫 그대로(D = PUT plan/network · B = 페이지 [저장] 초안 `expected`).
- 데이터 3층 그대로 — 조작 = 캐시(D `d03-plan` · B 사진첩 · 초안) · [저장]은 서버가 다시 셈(B follow · D derive).
- logic/ 규칙 그대로(새 셈 없음) · 부품 상자만(카드 = `createPanelCard` · 단추 `createButton`).
- 어둡게 = 새 토큰 `--draw-map-dim`(불투명 값) · `ui_template_theme.css` · `test_551_2` 토큰 수.
## 4. 숨김 후보 표(사용자 확인용)
| 기능 | 자리 | D03 | B05 권함 |
|---|---|---|---|
| 주소 · 장소 찾기 | `UI_Site.ts` | 사용(기준점 + 지형 받기) | 사용 — 지도 이동만 |
| 기준점 줄 · 지형 받기 · 진행 서클 · [다시 받기] · 10 km 알림 | `UI_Page.ts:373-465` · `UI_Terrain.ts` | 사용 | 숨김(B 지형 = B04 확정) |
| [임도(업로드)] · 올린 묶음 목록 | `UI_Site.ts` · `UI_RoadList.ts` | 사용 | 숨김(서버 B 400) |
| 지점 칸 · 핀 · 지점 붙기 · 지점에서 긋기 · [지점으로] · 메뉴 「지점 놓기 · 지우기」 | `UI_Points.ts` · `UI_Menu.ts:54 · 63-65 · 82 · 90` · `UI_Props.ts:213-216` | 사용 | 숨김 |
| [긋기] · 방식 넷 · 길이 · 기울기 · Tab · Shift · 부채꼴 · ± 색 | `UI_DrawPanel.ts` · `map_draw_kind.ts` · `logic/Fan` | 사용 | 사용 |
| [연도 구역 마커] · 끌어 놓기 · 메뉴 「여기서 연도 구역 나눔」 · [마커 지움] | `UI_DrawPanel.ts:47-58` · `UI_Edit.ts:464-490` · `UI_Menu.ts:86` | 사용 | 숨김 |
| 구역 · 연도 칸(해 줄 · 이름 · 연도 고름 · 지움) | `UI_Pieces.ts` | 사용 | 숨김(여러 연도 받으면 보기만 — 결정 5) |
| 빈 땅 새 선 | `UI_Draw.ts` | 사용 | 선 없을 때만 |
| 이어 긋기(선 끝) · [다시 긋기] | `UI_Draw.ts` · `logic/Span` | 사용 | 사용 |
| 갈래 · 둘째 선 · 다른 선과 잇기 | `UI_Draw.ts:72-83` | 사용 | 숨김(한 선) |
| 고름 노드 → 선 → 구역 → 전체 · 끌어 고르기 | `UI_Edit.ts` · `logic/Select` | 사용 | 사용 |
| 노드 끌기 · 토막 끌어 꺾임점 | `UI_Edit.ts` | 사용 | 사용 |
| 노드 · 구역 · 전체 지움 | `UI_Edit.ts` · `UI_Props.ts` | 사용 | 사용 |
| 토막 지움(가운데 = 두 선) | `UI_Props.ts` | 사용 | 끝 토막만 · 가운데 숨김(지금 = 지운 뒤 되돌림) |
| 속성 판 지반고 · 측점 · 길이 · 기울기 | `UI_Props.ts` | 사용 | 사용 |
| 속성 판 경위도 | `UI_Props.ts:191-197` | 사용 | 서버 변환 또는 숨김(지금 빈칸) |
| 속성 판 든 연도 · 해마다 길이 · 연도 고름 · 선 이름 | `UI_Props.ts:243 · 270 · 277-288` · `UI_Pieces.ts` | 사용 | 숨김 |
| 되돌리기 · 다시하기 · 거리 재기 · 3D | 페이지 몫 | 사용 | 사용(B05 것) |
| 도구줄 「예정노선 변경」 · 「예정노선(원본)」 | `map_toolbar.ts:48-55` | 없음 | 걷음(요구 표) |
| D 전용 — 등록 기준점(D01) · 연도 상태 · 확정(D04) · 업체 지정 · 메일 · 배포 · PUT plan/network [저장] · 빈 선 [초기화] · 산림청만 고침 | D01 · D04 · `D03_PlanAnalysis_Network.py:429-438` | 사용 | 없음(계속) |
| B 새 것 — 「예정노선 수정」 켬끔 · 받은 노선 보기 · 길이 비교 · 「받은 노선으로」 · 흐린 다른 연도 · 구역 · 켬 때 어둡게 | — | 없음 | 사용 |
## 5. 사용자 결정 거리
| # | 물음 | 브레인 권함 |
|---|---|---|
| 1 | 공용 자리 | ① D03 제자리 + 키트 · 이사는 셋째 페이지 때 |
| 2 | 4장 숨김 표 | 표대로 · 사용자 확인 뒤 표만 고침 |
| 3 | B 에서 고칠 예정노선 꼴 | 받은 원본 꼭짓점(조밀화 전 · 범위 트림만) · 조밀 점 331 안 씀 |
| 4 | 여러 연도 받기 단위 | 같은 선 위 이어진 조각만 한 노선으로 합침 · 떨어진 조각 · 다른 선 = 따로 프로젝트 |
| 5 | 다른 연도 · 구역 흐리게 원천 | D 원본 실시간 읽기(보기 전용 · 파일 안 만듦) · 업체 이름 안 보임 · 구역 · 연도 칸 = 보기만 |
| 6 | 흐린 선과의 관계 | 붙기(이음점 스냅)만 · 고침 막음 |
| 7 | 이웃 조각 이음점 | 고정 안 함 · 벗어나면 안내 한 줄(판단 = 설계자) |
| 8 | 「예정노선 수정」 자리 · 꼴 | 왼쪽 「그리기」 칸 머리 켬끔 · 켜면 지도 누름 = 예정노선 몫 · 다른 계획노선 선 어둡게 |
| 9 | 전후 비교 꼴 | 고쳤으면 받은 노선 옅은 점선 늘 보임 + 그리기 칸 「받은 노선」 켬끔 + 길이 비교 한 줄 |
| 10 | [초기화] 의미 | 페이지 [초기화](초기값 통째) 그대로 + 그리기 칸 「받은 노선으로」(예정노선만 되돌림 · 한 걸음 · 다른 B 설계 이월) |
| 11 | 어둡게 정도 · 대상 | 불투명 0.35 · 계획선 · 노드 · 곡선 손잡이 · 절성토선 · 측점 · 기울기 글 · 구조물 마커 · 추천 노선 보기 |
| 12 | 다시 추적 확인창 | 지금 그대로(켠 뒤 처음만) |
## 6. 일감 나눔
| 물결 | 창 | 일 | 파일 경계 |
|---|---|---|---|
| 1 | A 화면(D03) | 기능 표 · 키트 · 지도 입력 한 함수 · D03 Page 키트로 · `oneLine` · 가짜 값 걷음 | 새 `D03_PlanAnalysis_UI_Kit.ts` · `_UI_Features.ts` · `UI_Page.ts` · `UI_Map.ts`(입력만) · `UI_Draw` · `UI_Menu` · `UI_Props` · `UI_DrawPanel` |
| 1 | C 서버 | 여러 조각 연결(같은 선 이어진 것) · 한 B 여러 행 · B03 여러 고름 · 새 `GET /api/projects/{B}/plan-context` · `GET /route/plan` 덧칸 `expected_source`(원본 꼭짓점) | `D04_PlanConfirm_Link.py` · 새 `D04_PlanConfirm_Context.py` · `B03_FileInput_UI_PlanImport.ts` · 새 B05 라우터 파일(`Router_Replan.py` 634 줄이라 덧칸은 새 파일로) |
| 2 | B 화면(B05) | ExpectedDraw → 키트 · 왼쪽 「위치」 · 「그리기」 칸 · 「예정노선 수정」 · 받은 노선 보기 · 길이 비교 · 「받은 노선으로」 · 도구줄 아이콘 둘 걷음 · 어둡게 · 원본 꼭짓점 편집 | `B05_Profile_UI_ExpectedDraw.ts` · 새 `B05_Profile_UI_Panel_Plan.ts` · `_RouteEdit_Chrome.ts` · `_RouteEdit_Render.ts` · `map_toolbar.ts` · `ui_template_map_tools.ts` · `ui_template_theme.css` · css |
| 3 | B 이어서 | 흐린 다른 연도 · 구역 겹 · 붙기 | `ExpectedDraw.ts` · 키트 보기 전용 겹 |
- 창 수 = 셋(A · C 병행 → B). 검증은 연결된 검증 B 프로젝트가 있어야 함(브레인 복제 · 배정).
- 700 줄 조심 — `B05_Profile_UI_RouteEdit.ts` 683(늘리지 않음 · 배선은 ExpectedDraw) · `D03_UI_Page.ts` 680(줄어듦) · `_RouteEdit_Render.ts` 648(+10 안) · `UI_Draw.ts` 624 · `Route_Save.py` 638 · `Router_Replan.py` 634 · `design_pipeline_page.ts` 699(안 건드림).
- 546 다른 갈래(아이콘 그룹화 · 호버 글 · D 추천노선 · B05 LAS)와 같은 파일 — `map_toolbar.ts` · `ui_template_map_tools.ts` · `_RouteEdit_Chrome.ts` · `D03_UI_Map.ts` → 아이콘 두 개 걷기는 아이콘 그룹화 일감에 넣고 이 일은 그 뒤.
- 고칠 시험 — `test_626_3`(원본 켬끔 줄 108 · 한 선 줄 70) · `test_625_draw` · `test_553_4` · `test_475` · `test_560_4` · `test_551_2` · `test_584_3` · `test_606_1` · `test_624_4b`(D03 글 대조).
## 7. 위험
| 위험 | 대처 |
|---|---|
| B 설계 값 바뀜 | 키트 = 화면 엮기만 · 서버 길 그대로 · 626-3 지킴 대조(`planned_route*` · `initial_snapshot` · `route_recommend` · `expected_route.csv` 지문) 다시 |
| 원본 꼭짓점으로 바꾸면 다시 추적 결과가 조밀 점 때와 다를 수 | 같은 받은 노선 → 체인 초기선과 거리 0 시험(626-2 방식) 먼저 · 다르면 결정 3 다시 물음 |
| 저장 | 새 저장 칸 없음 · `RouteDraft.expected` → `expected_route_edit.csv` 그대로 |
| [초기화]가 파일을 지움 | `B05_Profile/route` = 스냅샷 트리 통째 복사(`common_util_initial_snapshot.py:38 · 275-285`) → 새 파일을 그 폴더에 두지 않음 · 흐린 겹 = 실시간 읽기 |
| [초기화] ≠ 받은 노선(옛 프로젝트) | 초기값이 추천 노선인 프로젝트(검증 B = earthwork) — 「받은 노선으로」 단추가 메움 · 옛 초기값은 그대로(D5) |
| 좌표계 | B = 사업지 crs(Bessel 5176 등) · D = GRS80 · TS `tmParams` 는 GRS80 만 → 다른 조각 · 경위도 변환은 서버(pyproj) |
| 데스크탑 임시 배포 옛 서버 | DB · storage(시놀로지) 공유 — 스키마 안 바꿈 · 새 파일 안 만듦 · 연결 규칙 바꿈 뒤 옛 서버로 연결하면 다른 행을 끊음(검증 사용자 연결 조작 때) · 화면은 전역 깃 싱크 전까지 옛 꼴(아이콘 남음) |
| 실제 연결 자료 없음 | 지정 40 행 중 연결 0 → 여러 연도 · 흐리게 검증용 연결 B 프로젝트 마련 |
| vite 새 파일 | 새 파일 먼저 · import 나중 |
@@ -0,0 +1,159 @@
# 546-C 분석 — D 추천노선 보기(가이드 선) · B05 라이다 올리기
원문 = `docs/raw/요구_1101/사용자요구_1101.md:64`(추천노선 보기) · `:65`(수치지형도/라이다). 읽기 · 실측만 · 코드 · storage 고침 없음.
## 0. 결론
- C1 — **2 m 격자 A\*(20 m 걸음 56 방향 · |기울기| ≤ 14 % 막음 · 급경사 35°+ 벌점 · 꺾임 벌점)** 권함 · TS 한 벌 브라우저 셈(저장 없음) · 실측 JS **26~258 ms**(지점 둘 · 셋 · 1 km 안팎) · 양각기 탐욕은 6 구간 중 4 구간 헤맴(버림).
- C2 — D 올리기 길(`D03_PlanAnalysis_Lidar.py`) 대부분 공용으로 뺄 수 있음 · B05 는 이미 지형 칩 + 설계 지형 바꿈 체인 있음 → 빠진 것 셋 = B 올리기 창구 · 라이다 확정값(`las_selection`) 적기 · 이미 LAS 있는 B 의 같은 지형 다시 셈.
---
## C1. D 추천노선 보기(가이드 선)
### 1. 재료
| 재료 | 자리 | 쓸모 |
| --- | --- | --- |
| 양각기 후보(원 360 표본 · 이분) | `D03_PlanAnalysis/logic/D03_PlanAnalysis_Draw.ts:17` · `:110` `compassCandidates` (파이썬 짝 `D03_PlanAnalysis_Draw.py`) | 탐욕 안(A)의 걸음 · 다듬기에 씀 |
| 부채꼴(허용 호 · 정방향) | `logic/D03_PlanAnalysis_Fan.ts:57` `compassFan` · `:8` 「화면 고르기 전용 · 파이썬 짝 없음」 | 계산 자리 선례(저장 안 하는 화면 셈 = TS 한 벌) |
| 브라우저 높이 격자 | `D03_PlanAnalysis_UI_Page.ts:129-132` `z(x,y)` = 지형 칩 원천 격자 · `D03_PlanAnalysis_Api.ts:212` `smooth=true` · `common_util/common_util_surface_sampler.ts:65` `heightAt` | 가이드 셈 입력 그대로(네트워크 없음) |
| 지형 원천 | `common_util/common_util_terrain_store.py:1-12`(도엽마다 2 m · `storage/_shared/terrain`) → D `models_plan/dtm_sheet_laplace(_smooth).npz` | 실측 격자 |
| 급경사 | `D03_PlanAnalysis_Layers.py:217-229`(평활 안 한 DEM · % 값 그림 · 화면용으로 솎음) · 범위 기본 26.8 · 70 · 83.9 % `A00_Common/map/logic/map_slope_bands.ts:36-40` | 벌점 문턱 70 %(35°) · 브라우저는 높이 격자에서 바로 셈(값 그림은 솎여서 안 씀) |
| 급경사 근거 | `resources/knowledge/technical_info/01_임도/01_계획노선/타당성평가.md:18`(35°+ 통과 10 % 이상 = 조건) · `:45`(종단 평균 3~8 % 좋음 · 10~14 % 나쁨) · `노선_배치.md:29` | 문턱 · 표시 값 |
| 0차곡 | `D03_PlanAnalysis_ZeroOrder.py:1-12`(선 · 서버 파생) | 1차엔 안 씀(벌점 후보) |
| B05 추천 엔진 | `B05_Profile/B05_Profile_Engine_RouteInitial_Search.py:1-8` · `:31-35`(복도 100 m · 4 m 칸 · 16 방향 · 방향 상태 · scipy) · `B05_Profile_Engine_RouteInitial.py:1-50` | 코드는 못 씀(파이썬 · 예상노선 복도 전제 · 최대 115 s) · 규칙만 빌림 = 기울기 넘는 링크 뺌 · 꺾임 벌점 |
### 2. 알고리즘 안
| 안 | 방법 | 실측 판정 |
| --- | --- | --- |
| A 양각기 탐욕 | 걸음마다 20 m 원에서 \|기울기\| ≤ 14 % 방위 중 목표 쪽 · 필요 기울기에 가까운 것 | **6 구간 중 4 구간 못 닿음**(400 걸음 맴돎 · 급경사 38~98 %) — 버림 |
| **B 격자 A\*(권함)** | 칸 = 2 m 격자점 · 걸음 = 반지름 10 칸 ± 0.5 격자점 56 방향(19.7~20.9 m) · 막음 = \|Δz\| > 0.14 × 걸음 · 비용 = 길이 × (1 + 3 × 급경사 표본 비율 + 0.3 × (g/14 %)²) + 꺾임 벌점(앞 걸음 방향 · 상태 없는 어림) · 어림 = 직선 거리 × 3(가중 A\*) · 지점 사이 구간마다 · 상자 = 두 점 + 여유(200~800 m · 못 닿으면 두 배 한 번) | 6 구간 모두 닿음 · 아래 표 |
| C 연속 각 A\* · 빔 | 정확히 20 m · 방향 상태 · 최소 곡선반지름 | 안 짬 — 상태 × 방향 수 = 수십 배 · 가이드엔 과함 |
- 지그재그 = 허용(못 피함 — p1→p2 직선 평균 26.8 % → 선 2.8 배) · 꺾임 벌점 1 로 꺾임 > 90° 를 7~39 → 4~23 개로 줄임.
- ±14 % 로 못 닿는 높이 차 = A\* 가 스스로 둘러 감(지그재그) · 상자 안에 길이 없으면 → 펼침 상한 뒤 「닿지 못함」(가장 가까이 간 데까지 + 점선 직선 · 알림 「14 % 로 최소 ○ m 필요」).
- 20 m 다시 나누기 금지 — 찾은 선을 선 따라 20 m 로 다시 나누면 꺾임 모서리가 잘려 최대 기울기 31~55 % (실측). 격자 꼭짓점 그대로 씀.
### 3. 시제품 실측
검증 D 지형(가이드_예정노선_용화 `6067750f` · 가이드_예정노선 `87d47800` · 읽기만) · 지점 = 그 프로젝트 지점 · 권함 설정(A\* × 3 · 급경사 3 · 기울기 0.3 · 꺾임 1).
| 구간 | 직선 m · 평균 기울기 | 선 m(배) | 꼭짓점 | 최대 기울기 | 급경사 35°+ 지남 | 꺾임 > 90° | JS 첫/데움 ms | 파이썬 s |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 용화 시점→종점 | 1,189 · −3.4 % | 2,139 (1.8) | 107 | 13.9 % | 14.2 % | 4 | 53 / 34 | 0.41 |
| 가이드 p0→p3 | 525 · +22.6 % | 1,085 (2.1) | 55 | 14.0 % | 14.4 % | 6 | 70 / 54 | 0.89 |
| 가이드 p3→p1 | 436 · +16.2 % | 795 (1.8) | 41 | 13.9 % | 44.8 % | 15 | 30 / 26 | 0.43 |
| 지점 셋 p0→p3→p1 | 961 | 1,880 (2.0) | 95 | 14.0 % | 27.3 % | 21 | 117 / 80 | 1.33 |
| 가이드 p0→p1 | 953 · +19.9 % | 1,920 (2.0) | 96 | 14.0 % | 12.7 % | 23 | 258 / 247 | 4.66 |
| 가이드 p1→p2 | 544 · −26.8 % | 1,508 (2.8) | 76 | 15.2 % ※ | 6.3 % | 16 | 60 / 63 | 0.87 |
- ※ 넘는 걸음 = 첫 걸음(시작점 격자 맞춤 ≤ 1.4 m) 15.2 % · 끝 짧은 걸음(11 m) 17.0 % — 정확한 점에서 첫 고리 뽑기 · 끝 걸음 검사로 고칠 것.
- 걸음 길이 19.7~20.9 m(격자 방향 탓 · 지점 앞 끝 걸음만 짧음).
- 급경사 벌점 효과(벌점 0 대 3) — 급경사 지남 19~73 % → 6~45 % · 길이 +11~22 %.
- 사람 선 비교 — 용화 `main`(사람 · 부분 1,339 m) 급경사 34.0 % · 최대 25.5 % · 직선 715 m 를 1.87 배로 감 → 가이드 1.8 배와 비슷.
- 펼침 수(가중 A\*) 2.5~18.5 만 · 정확 A\*(× 1)는 5.5~37 만 · JS 50~595 ms.
- 못 닿음(기울기 상한 3 % 로 억지 시험) — 상자 두 배까지 다 뒤져 **2.1~2.3 s** → 펼침 상한(예 40 만 ≈ 0.5 s) 필요.
- 파이썬(순수 heapq)은 0.4~4.7 s → 서버 셈 비권함. JS 수치 = Node 22 타입 배열 · 이진 힙(브라우저 V8 과 같은 급).
시제품 핵심 줄(파이썬 · JS 같은 꼴):
```
offs = [(di,dj) for di,dj in 격자 if abs(hypot(di,dj) - L/cell) <= 0.5] # 56 방향
dz = abs(z[v]-z[u]); if dz > GMAX*len: continue # ±14 % 막음
c = len*(1 + 3*steep(1/4,1/2,3/4,끝)/4 + 0.3*(dz/len/GMAX)**2) + 1*L*(꺾임각/π)**2
push(g[u]+c + 3*hypot(목표-v)*cell) # 가중 A*
닿음 = dist(u,목표) <= L and abs(z목표-z[u]) <= GMAX*dist
```
### 4. 계산 자리 · 목표 수치
- 권함 = **TS 한 벌 · 브라우저만**(`A00_Common/map/logic/` · D03 · B05 같이 부름) — 가이드 선은 저장 · 설계 값 아님 → 「서버 검산 없이 저장」 금지에 안 걸림 · 선례 `Fan.ts:8`. ①(짝)은 쓸 곳 없음 · ③(서버)은 파이썬 0.4~4.7 s + 왕복. 나중에 가이드 선을 노선으로 [적용] 하게 되면 그때 ②(서버 Node 같은 코드).
- 목표 — 지점 둘 · 1 km 안: **≤ 0.3 s**(실측 26~258 ms) · 지점 셋 1 km: ≤ 0.3 s(80~117 ms) · 못 닿음 판정: ≤ 0.5 s(펼침 상한).
- 라이다 원천(1 m)일 때 = 2 칸 솎아 2 m 격자로 셈(칸 수 4 배 막음) · 라이다 빈칸 = 막힘.
- 메인 스레드로 시작 · 0.3 s 넘는 일이 잦으면 Web Worker.
### 5. 화면
- 도구줄 칸 = `A00_Common/map/map_toolbar.ts:58` `recommend` 줄 `pages: B05` → `BOTH` 로 · D03 은 `mapToolGroups("d03", { recommend: … })`(`D03_PlanAnalysis_UI_Map.ts:234`).
- 부품 = B05 와 같은 `createPickMenu`(`ui_template/ui_template_context_menu.ts:306-320` · B05 `B05_Profile_UI_RouteEdit_RecPreview.ts:44`) · D 항목 = 「가이드 선(지점 잇기)」 + 「끔」. 그리기(점선 노랑 · 검은 테 `RecPreview.ts:83-104`)는 공용으로 빼서 둘이 씀.
- 지점 입력 = **D03 지점 목록 그대로**(`D03_PlanAnalysis_UI_Points.ts:1-10` · 상한 40 `logic/D03_PlanAnalysis_PointEdit.ts:12`) · 목록 차례로 잇기 · 지점 둘 이상일 때만 열림 · 지점 고침 뒤 켜져 있으면 다시 셈.
- 표시 = 선 + 짧은 글(길이 · 최대 기울기 · 급경사 지남 %) · 못 닿은 구간 = 점선 직선 + 알림.
### 6. 결정 거리(브레인 권함)
1. 걸음 · 기울기 상한 — **그리기 「길이·기울기 고정」 칸 값을 따름(기본 20 m · 14 %)** / 고정 20 · 14.
2. 급경사 문턱 — **급경사 겹 범위 둘째 경계(기본 70 % = 35°)** / 고정 70 %.
3. 지점 — **D03 지점 목록 차례** / 따로 고르는 칸.
4. 지그재그 — **허용 + 꺾임 벌점** / 최소 곡선반지름 지킴(무거움).
5. 못 닿을 때 — **간 데까지 + 점선 직선 + 알림** / 선 안 그림.
6. B05 에도 「가이드 선」 항목 — **넣음(같은 부품 · 지점 = 예정노선 꼭짓점)** / D 만.
### 7. 일감 나눔
1. 셈 — `A00_Common/map/logic/map_guide_route.ts`(A\* · 상자 · 펼침 상한 · 첫/끝 걸음 정확) + 지킴 시험(`test_603` 처럼 tsc → node · 평지 · 상한 막힘 · 높이 차 지그재그 · 못 닿음 · 지점 셋).
2. 화면 공용 — `RecPreview` 의 메뉴 · 그리기를 `A00_Common/map/` 로 · 도구줄 `recommend` = BOTH.
3. D03 연결 — 지점 · 높이 · 지형 칩 원천 · 지점 고침 때 다시 셈 · ORCA 실측(ms · 선).
4. (결정 6 이면) B05 항목 추가.
### 8. 위험
- 시작 · 끝 격자 맞춤 → 첫 · 끝 걸음 15~17 %(실측) — 일감 1 에서 막음.
- 못 닿음 때 다 뒤지기 2 s 넘음(실측) — 펼침 상한 필수.
- 가이드 선이 직선의 1.8~2.8 배로 돎 · 지그재그 — 사용자 기대와 다를 수 있음(급경사 피함 ↔ 길이 맞바꿈 · 벌점 세기 = 조절 손잡이).
- 지형 상자 밖 · 라이다 빈칸 지점 = 바로 「닿지 못함」.
---
## C2. B05 에서도 라이다 올려 반영
### 1. 지금 길
- **D 올리기** `D03_PlanAnalysis/D03_PlanAnalysis_Lidar.py` — `POST /plan/lidar`(LAS/LAZ + .prj · 한 번에 · 파일당 30 GB `B03_FileInput_Engine.py:69-87`) → 좌표계 다르면 x·y 옮겨 적음(`place_las` `:84-109`) → **다시 올리면 옛 LAS 갈음**(`:122-123`) → B04 엔진 `run_surface_analysis(maps=False)`(`:131-138` · 지면 필터 자동 · DTM 1 m · 평활본) → 자리 = D 몫 `B04_PreProcess/lidar/`(`:32-36`) · `lidar_meta.json` → DB `surface_models` 넣기/고치기만(`D03_PlanAnalysis_Router.py:182-203`) · 뒤 일 + `/plan/progress` 1 초 묻기(`D03_PlanAnalysis_UI_LidarUpload.ts:25` · `:123-147`) · 끝나도 칩 안 바꿈(`:5`). 라이다 밖 = 빈칸(`Lidar.py:12`).
- D 전용 묶임 — `store.load_plan` 이 예정노선 아니면 400(`D03_PlanAnalysis_Store.py:77`) · 일 파일 `models_plan` · 하위 뿌리 `lidar/` 를 B05 높이 표본이 못 봄(B05 는 `<뿌리>/B04_PreProcess/models` 만 · `B05_Profile_Router_Terrain.py:49`).
- **지형 칩** `A00_Common/map/map_terrain_chip.ts:14-27`(수치지형도/라이다 · 없으면 「라이다 — 올린 LAS 없음」으로 막힘) · D03 · B05 같이 씀.
- **B05 지형 바꿈** `POST /route/design-terrain`(`B05_Profile_Router_TerrainSwitch.py:1-8`) — 확인창(`B05_Profile_UI_RouteEdit_Terrain.ts:45-67` · 600 s · 덮개) → stage-1 확정값 바꿈 → 노선 저장 체인(종단 · 횡단 · 배수 관 · 구조물 · B06 · 3D) · 노선 · 노드 · **초기값 안 씀** · 실패면 되돌림 · **같은 지형 = 할 일 없음**.
- 라이다 고를 수 있나 = `analysis_terrain_sources`(`common_util/common_util_surface_confirmation.py:112-113`) — 지금 수치지형도면 `las_selection` 적힌 게 있어야 「라이다」 열림.
- **B 입력 길** — B03 올림 → `B03_FileInput/input/las/` → B04(LAS 239 s · `docs/raw/요구_1025/_분석_486_미리계산_지형분석.md:9`) → 자동설계 체인(`B03_FileInput_Service_Chain.py:157` · 초기값 찍기 `:345`). 나중에 B03 에서 다시 올리면 **통째로 지움**(초기값 버림 · B04~B09 결과 · DB 행 `B03_FileInput_Router_Helpers.py:263-274`).
### 2. 나중에 LAS 를 올리면 다시 돌 것
- 지형면(라이다 DTM · 평활) — 새로 지음(239 s 급 · 뒤 일).
- 설계 지형을 라이다로 바꾸면 — 기존 `/route/design-terrain` 체인이 종단 지반선 · 횡단 · 토공 · 배수 관 · 구조물 · B06 · 3D 다시 셈 · 계획고 · 사용자 횡단 입력 · 노선은 그대로.
- 안 바뀜 — 배수유역(도엽 등고선 · 세류선 기반 `B04_PreProcess_Router_Watershed.py:1-5`) · 노선 · 노드 · 예정노선.
- 화면 파생 — 1 m 등고선(라이다일 때만) · 급경사 · 음영 · 0차곡 겹은 격자 파일 이름 열쇠라 저절로 새로.
- 자동설계 체인(노선 다시 풂)은 안 돎 — 노선은 사용자 것.
- 데이터 3층 — 올리기 = 원천 자료 추가(작업본 아님) · 설계 지형 바꿈 = 저장과 같은 잠금 · 덮개 · 초기값은 안 씀(5장 「초기값 = 체인 직후 · [적용] 직후만」과 맞음).
- **어긋남(이미 있는 흠)** — 초기값 = 파일 넷 + stage-2 params 만 · stage-1(설계 지형) 없음(`common_util/common_util_initial_snapshot.py:38-43` · `:221-222`) → 지형 바꾼 뒤 [초기화] = 옛 지형으로 센 횡단이 돌아오고 설계 지형은 새것(`B05_Profile_Router_Lifecycle.py:234` · 코드 읽기 판단 · 시험 없음).
### 3. 공용 · B 전용
- 공용으로 뺌(`common_util/`) — 파일 이름 검사 · LAS 좌표계 읽기 · 옮겨 놓기(`check_names` · `las_epsg` · `place_las`) · 올림 받기 고리 · 라이다 짓기(`run_surface_analysis(base, maps=False)`) · 뒤 일 · 진행 기록(`_start_job` · `_note_job`) · DB 넣기/고치기만(`_save_models`) · B03 합침 틈 검사(`merge_gap_error` · D 는 아직 안 함) · 화면 올리기 · 진행 서클(`UI_LidarUpload.ts` send/follow).
- B 전용 — 창구 `POST /route/lidar`(예정노선 검사 없음) · 짓는 자리 = 프로젝트 뿌리 `B04_PreProcess/models`(B05 표본이 거기만 읽음) · stage-1 에 `las_selection` 적기(칩 열림) · 일 파일 자리 · `save_guard` 잠금 · 이미 LAS 있는 B 의 갈음 = 같은 지형이라도 강제 다시 셈.
- 쓰면 안 됨 — `save_surface_analysis_to_db`(`B04_PreProcess_Repository.py:496-505` · 이번 결과에 없는 행 지움 → 수치지형도 행 삭제 · `routes.surface_model_id` 비움) · `maps=True`(GIS 다시 받음 · 배수 입력 흔듦).
- 다시 올림 — LAS 없던 B = 덧붙임(수치지형도 그대로 + 라이다 추가) · LAS 있던 B = 갈음(D 와 같음) → 지금 설계 지형이 라이다면 체인 강제.
### 4. 결정 거리(브레인 권함)
1. 올린 뒤 — **확인창 「설계 지형을 라이다로 바꿈?」(기존 칩 확인창 그대로)** / 자동 바꿈 / 칩만 열고 끝.
2. 다시 올림 — **갈음(D 와 같음)** / 덧붙임(B03 합침 검사).
3. 초기값 · [초기화] — **초기값 그대로(현행 칩 규칙)** / 올린 뒤 초기값 다시 찍기 / [초기화]가 설계 지형도 되돌림. (어긋남은 별도 일감)
4. 라이다가 노선을 다 못 덮을 때 — **올린 뒤 노선 덮임 검사 · 모자라면 라이다로 바꿈 막고 알림** / 빈칸 그대로(D 결정 A⑥).
5. 올리기 단추 자리 — **지형 칩 옆(D03 과 같은 자리)** / 좌측 패널.
### 5. 일감 나눔
1. 공용 모듈로 옮김(D03 동작 그대로) + 지킴 시험(임시 storage · 작은 LAS).
2. B 창구 `POST /route/lidar` + 진행 — 뿌리 `models` 에 짓기 · 넣기/고치기만 · `las_selection` 적기 · 잠금.
3. B05 화면 — 칩 옆 올리기 · 진행 서클 · 끝나면 결정 1 대로 → 기존 `/route/design-terrain`.
4. LAS 있던 B 갈음 — 같은 지형 강제 다시 셈 길(TerrainSwitch 에 force).
5. ORCA 검증 — 검증 B 프로젝트(복제)에서 올림 → 칩 → 종단 · 횡단 바뀜 수치.
### 6. 위험
- 뿌리에서 `run_surface_analysis` — LAS 바뀜이 `manifest.json` 을 버리고 다시 지음(`B04_PreProcess_Engine.py:233-242` · `B04_PreProcess_Engine_Pipeline.py:198-205`) → 수치지형도 모델 줄 · 파일이 같이 사라지는지 일감 2 앞에서 실측.
- LAS 있던 B 를 갈음 = 같은 파일 이름 덮어씀 → 체인 안 돌면 설계 값이 옛 지형 것 그대로(조용한 어긋남).
- 239 s 급 뒤 일 · 서버 다시 켜지면 끊김(D 는 「끊김」 표시) · 그 사이 [저장] 과 겹침 = 잠금.
- 큰 LAS 를 한 번에 올림(나눠 올리기 없음 · 30 GB 상한).
- [초기화] 지형 어긋남(2 절) — 올리기를 열면 더 자주 드러남.
@@ -0,0 +1,111 @@
# 요구서 546 — B05 평면 · 예정노선 지도 아이콘 그룹화 · 노선 그리기 한 벌 · 예정노선 가이드 추천선 · B05 라이다
원문 = `사용자요구_1101.md` 요구 546(전문 · 아이콘 표 둘).
근거 조사:
- `_분석_546-A_아이콘그룹.md` · `_분석_546-B_노선로직공용.md` · `_분석_546-C_추천노선_라이다.md`.
## 1. 요구 요지
| # | 영역 | 요구 |
|---|---|---|
| 1 | 지도 아이콘 | 2 영역(그룹1 지도 겹 · 그룹2 도구) 1 행 · 모자라면 그 영역만 가로 밀기 |
| 2 | 지도 아이콘 | 표 「아이콘 그룹명」대로 묶어 드롭다운 · 복수 고름 · 골라도 안 닫힘 |
| 3 | 지도 아이콘 | 호버 = 표 「호버제목」만(예외 임도(업로드)) |
| 4 | 지도 아이콘 | 표 「미사용」 = 그 페이지에서 숨김 |
| 5 | 노선 그리기 | D03 · B05 기본 로직 한 벌 · 이원화 최소 · 같게 만들고 사용자 확인 뒤 숨김으로만 가름 |
| 6 | 노선 그리기 | B05 = D03 왼쪽 판 그리기 · 위치 칸 · 노드 제어 · 지움 · 다시 긋기 |
| 7 | 노선 그리기 | 한 · 여러 연도 받음 · 내 몫만 고침 · 다른 연도 · 구역은 흐리게 보기만 |
| 8 | 노선 그리기 | 고친 뒤 전후 비교 · 초기화 = 받은 노선 |
| 9 | 노선 그리기 | 고친 뒤 = 지금 B 로직 이어감 |
| 10 | 노선 그리기 | 도구줄 「예정노선 변경」 · 「예정노선 원본」 걷음 → 왼쪽 그리기 + 새 「예정노선 수정」 |
| 11 | 노선 그리기 | 수정 켜면 다른 계획노선 선 조금 어둡게 |
| 12 | 예정노선 추천노선 | 기준지점 거치는 가이드 선 · 20 m · ±14 % · 급경사 참고 · 빠르게 · 보기만 |
| 13 | B05 라이다 | 프로젝트 만든 뒤에도 LAS 올려 반영 |
## 2. 조사 결과 요지
- 아이콘: 그룹1 22 겹 모두 있음(B05 숨김 = 계류100m · 임도(업로드)) · 그룹2 표 17 줄 · 차이 = B05 「예정노선 변경」 · 「원본」 보임 · 예정노선 추천 없음 · B05 LAS 올리기 없음 · 지금 B05 = 두 줄(도구 947 + 겹 801 px) · 예정노선 = 1366 폭에서 두 줄로 감김 · 묶으면 그룹1 약 360 px → 1920 한 줄.
- 부품: 여럿 고르기 · 안 닫히는 메뉴 없음(`createPickMenu` = 하나 고름 · 누르면 닫힘) → 부품 상자에 더함 · 호버 글 = 사전 밖 표 둘 + 페이지 덮어쓰기 아홉 곳.
- 노선 그리기: 긋기 · 고르기 · 메뉴 · 속성 판은 이미 같은 함수 · 두 벌 = 부품 엮기 · 지도 입력 · 키 · 왼쪽 칸 · 숨김이 표 없이 `oneLine` 열한 곳 + 가짜 값 = 「일원화 안 됨」 까닭.
- 자료 꼴: B05 예정노선 = 조밀 점 331(원본 꼭짓점 121) → 예정노선처럼 노드 몇 개 고치기 꼴이 안 됨.
- 여러 연도 · 흐리게: 지금 길 없음(연결 = B 하나에 조각 하나) · 좌표계 B Bessel(5176 등) ↔ 예정노선 GRS80 → 서버 변환.
- 가이드 선: 2 m 격자 A*(20 m · 56 방향 · ±14 % 막음 · 급경사 35°+ · 꺾임 벌점) 시제품 용화 6 구간 모두 닿음 · 브라우저 셈 26~258 ms · 길이 = 직선 1.8~2.8 배(지그재그).
- B05 라이다: 예정노선 올리기 코드 대부분 공용 가능 · 지형 칩 · 설계 지형 바꿈 체인 있음 · 빠진 것 = B 올리기 창구 · `las_selection` 적기 · LAS 있던 B 갈음 때 강제 다시 셈 · ⚠ `save_surface_analysis_to_db` = 수치지형도 행까지 지움(안 씀).
- 이미 있는 흠: 설계 지형 바꾼 뒤 [초기화] = 옛 지형으로 센 횡단이 돌아옴(초기값에 지형 고름 없음).
## 3. 정함(브레인 · 사용자가 바꿀 수 있음)
아이콘:
- 한 행 = 그룹1 왼쪽 · 그룹2 오른쪽 · 각자 가로 밀기 · 모자라면 그룹2 먼저 밀림.
- 묶음 단추 = 묶음 아이콘 + ▾ + 켠 수 배지 · 하나라도 켜면 눌림 · 호버 = 그룹명 · 메뉴 줄 = 아이콘 + 호버제목 + ✓ · 막힌 줄 흐림.
- 그룹명 「-」 항목 · 그룹2 전부 = 단독 아이콘(그룹2 는 묶지 않음).
- 겹친 아이콘 셋(ripple · road · lineDashed) 바꿈 · 묶음 아이콘 넷 새로.
- 계류100m = 계류 100 m 띠만 · 도로 300 m 띠는 「도로」 묶음 안 한 줄로 남김(기능 안 지움).
- 그래픽 카드 단추(표 밖) = 그룹1 끝 단독 · 호버 「그래픽 카드」.
- 막힘일 때만 「제목 — 까닭」 · 지금 긴 설명 걷음(도움말 판 글 그대로).
- 스냅 간격 날 `<select>` → 고르기 메뉴(하나).
- 켬끔 기억 열쇠 · 측점 · 길이·기울기 처음 값 그대로.
- B05 임도(업로드) = 표대로 아이콘 보임 · 받은 자료 없으면 막힘 + 까닭.
노선 그리기:
- 공용 자리 = 예정노선 폴더 제자리 + 「키트」 하나(부품 엮기 · 칸 · 겹 차례 · 키 · 지도 입력) + 페이지 기능 표(도구줄 표와 같은 꼴) · `oneLine` · 가짜 값 걷고 표로 숨김.
- 숨김 처음 값 = 사용자 말대로 「같게 켬」 · B 에서 기술상 못 쓰는 것만 숨김(4장) → 사용자가 화면 보고 숨길 것을 알려 주면 표만 고침.
- B 에서 고칠 선 = 받은 원본 꼭짓점(조밀 점 안 씀) · 같은 받은 노선 → 체인 초기선 거리 0 시험 먼저.
- 「예정노선 수정」 = 왼쪽 「그리기」 칸 머리 켬끔 · 켜면 지도 누름 = 예정노선 몫 · 다른 계획노선 선(계획선 · 노드 · 곡선 손잡이 · 절성토선 · 측점 · 기울기 글 · 구조물 마커 · 추천 보기) 불투명 0.35.
- 전후 비교 = 고친 뒤 받은 노선 옅은 점선 늘 보임 + 그리기 칸 「받은 노선」 켬끔 + 길이 비교 한 줄.
- 초기화 = 그리기 칸 「받은 노선으로」(예정노선만 되돌림 · 한 걸음 · 뒤 B 로직 다시 셈) + 페이지 [초기화](초기값 통째) 그대로.
- 다른 연도 · 구역 = 예정노선 원본 실시간 읽기(보기 전용 · 파일 안 만듦) · 업체 이름 안 보임 · 흐린 선은 이음점 붙기만 · 고침 막음 · 이음점 고정 안 함(벗어나면 안내 한 줄).
- 다시 추적 확인창 = 지금 그대로(켠 뒤 처음만).
예정노선 가이드 추천선:
- 셈 = TS 한 벌 · 브라우저만(`A00_Common/map/logic/` · 저장 안 하는 화면 셈) · 2 m 격자 A* · 펼침 상한(못 닿음 ≤ 0.5 s) · 첫 · 끝 걸음 정확 · 꼭짓점 그대로(20 m 다시 나누기 금지).
- 걸음 · 기울기 = 그리기 「길이·기울기 고정」 칸 값(기본 20 m · 14 %) · 급경사 문턱 = 급경사 겹 범위 둘째 경계(기본 70 % = 35°).
- 지점 = 예정노선 지점 목록 차례 · 지점 둘 이상일 때 열림 · 지그재그 허용 + 꺾임 벌점 · 못 닿으면 간 데까지 + 점선 직선 + 알림 · 목표 = 지점 둘 1 km ≤ 0.3 s.
- 화면 = B05 「추천노선」 드롭다운 · 점선 그리기를 공용으로 · 예정노선 항목 = 「가이드 선(지점 잇기)」 · B05 는 지금 저장본 넷 그대로.
B05 라이다:
- 자리 = 지형 칩 옆 [LAS 올리기](예정노선과 같은 자리) · 올리기 · 짓기 = 예정노선 길을 공용 모듈로 · B 창구 따로.
- 올린 뒤 = 지금 칩 확인창 「설계 지형을 라이다로 바꿈?」 → 기존 설계 지형 바꿈 체인 · 다시 올림 = 갈음(설계 지형이 라이다면 강제 다시 셈).
- 라이다가 노선을 다 못 덮으면 라이다로 바꿈 막고 알림.
- 초기값은 안 씀 · 이미 있는 흠 = 초기값에 설계 지형 고름을 담아 [초기화] 때 함께 되돌림.
## 4. B05 숨김 표(처음 값 · 사용자 확인 뒤 표만 고침)
| 기능 | 예정노선 | B05 | 까닭 |
|---|---|---|---|
| 주소 · 장소 찾기 | 사용 | 사용(지도 이동만) | — |
| 긋기 네 방식 · 길이 · 기울기 · Tab · Shift · 부채꼴 · ± 색 | 사용 | 사용 | — |
| 이어 긋기 · 다시 긋기 · 빈 땅 새 선(선 없을 때) | 사용 | 사용 | — |
| 고름 노드 → 선 → 전체 · 끌어 고르기 · 노드 끌기 · 꺾임점 · 지움 | 사용 | 사용 | — |
| 속성 판 지반고 · 측점 · 길이 · 기울기 · 경위도 | 사용 | 사용(경위도 = 서버 변환) | — |
| 되돌리기 · 다시하기 · 길이측정 · 3D | 사용 | 사용(B05 것) | — |
| 기준점 · 지형 받기 · 다시 받기 · 10 km 알림 | 사용 | 숨김 | B 지형 = 전처리 확정 |
| 임도(업로드) 올리기 · 묶음 목록 | 사용 | 숨김 | 서버 B 400 · 받은 자료로 보임 |
| 갈래 · 둘째 선 · 다른 선과 잇기 · 가운데 토막 지움 | 사용 | 숨김(끝 토막 지움은 사용) | B 계획선 한 줄 |
| 연도 구역 마커 · 구역 · 연도 고침 · 선 이름 | 사용 | 보기만 | 받은 몫 고정 |
| 지점 칸 · 핀 · 지점에서 긋기 | 사용 | 숨김 | B 저장 자리 없음 |
| 등록 기준점 · 확정 · 업체 지정 · 배포 · 산림청 [저장] | 사용 | 없음 | 예정노선 업무 |
## 5. 사용자 결정 거리
1. 여러 연도 받기 단위 — B 계획선은 한 줄. 떨어진 조각 · 다른 선까지 받으면:
- 가(권함) 같은 선 위 이어진 조각만 한 노선으로 합침 · 떨어진 조각 · 다른 선 = 따로 B 프로젝트.
- 나 한 B 프로젝트에 다 받고 계획선은 그중 하나 고름 · 나머지 보기만.
## 6. 단계 · 창
- 1 물결(동시): 634 아이콘(sub1) · 635-1 예정노선 키트(sub2) · 635-2 서버 연결 · 문맥(sub3) · 636-1 가이드 셈(sub4) · 637-1 · 637-2 라이다 공용 · B 창구(sub5) — 모두 Opus.
- 2 물결: 635-3 B05 왼쪽 칸(634 · 635-1 · 635-2 뒤) · 636-2 가이드 화면(634 뒤) · 637-3 · 637-4 B05 LAS 화면 · 초기화 지형(634 뒤).
- 3 물결: 635-4 흐린 다른 연도 · 구역(635-3 뒤 · 검증용 연결 B 는 브레인이 마련).
- 파일 경계: 634 = 부품 상자 · `A00_Common/map` 표 · 두 페이지 호버 · 자리 CSS(예정노선 `UI_Map` 은 도구 표 부르는 줄만) / 635-1 = 예정노선 `UI_Page` · `UI_Map` 입력 줄 · `UI_Draw` · `UI_Menu` · `UI_Props` · `UI_DrawPanel` · 새 `UI_Kit` · `UI_Features` / 635-2 = `D04_PlanConfirm_Link` · 새 문맥 파일 · B03 가져오기 · 새 B05 라우터 파일 / 636-1 = 새 `map_guide_route.ts` 만 / 637-1 · 637-2 = `D03_PlanAnalysis_Lidar.py` · 새 공용 모듈 · 새 B05 라우터 파일.
## 7. 지킴
- B 설계 값: 키트 = 화면 엮기만 · 626-3 지킴 대조(`planned_route*` · `initial_snapshot` · `route_recommend` · `expected_route.csv` 지문) 다시.
- 700 줄: `B05_Profile_UI_RouteEdit.ts` 683 · `D03_PlanAnalysis_UI_Page.ts` 680 · `D03_PlanAnalysis_UI_Layers.ts` 672 = 늘리지 않음.
- 새 파일을 `B05_Profile/route` 에 두지 않음([초기화]가 지움).
- `save_surface_analysis_to_db` · `maps=True` 안 씀 · 뿌리에서 지형 짓기 전 `manifest` 실측.
- 데스크탑 임시 배포 = DB · storage 공유 · 스키마 안 바꿈 · 반영은 전역 깃 싱크 때.
- 사용자 설명서 다시 찍기 = 사용자 지시 때.
- 낡은 시험 고침(`test_626_3` · `625_draw` · `553_4` · `624_2` · `624_3` · `626_1` · `568_1` · `b05_routeedit_initial` · `551_2` 등) · 까닭은 커밋 글.