chore(요구): 요구 395 분석 둘 — 화면 제어 단추 한 벌 · 노선분석 지도 겹
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,108 @@
|
||||
# 395-A 분석 — B05 평면 화면 제어 단추 = D03 와 같은 아이콘 한 줄
|
||||
|
||||
요구 395-1 원문 — 「b05의 평면도 상단의 화면제어 버튼셋 전체를 예정노선 프로젝트의 화면제어와 동일하게 아이콘으로 구성」.
|
||||
- 글 그대로 읽으면 바뀌는 곳 = B05(D03 꼴 아이콘으로). D03 에 B05 단추 전부를 들이는 것은 브레인의 넓힌 해석 — 아래 조각 3 으로 떼어 둠(빼도 1 · 2 는 그대로 성립).
|
||||
|
||||
## 1. B05 평면 도구줄 — 지금
|
||||
|
||||
자리 = `B05_Profile/B05_Profile_UI_RouteEdit_Chrome.ts:82-122`(innerHTML 한 덩어리) · 감싼 칸 `.b05-route__view-controls.b05-routeedit__tools` 지도 왼쪽 위(`B05_Profile_UI_Style.css:184-199` · `B05_Profile_UI_Style_RouteEdit.css:18-26`) · 단추마다 따로 뜬 유리 단추(`ui-btn ui-btn--glass` data-size 32) · 나눔선 `<i class="b05-route__view-separator">` 다섯 · `ui-toolbar` 부품 안 씀.
|
||||
|
||||
| # | data-act | 지금 꼴 | 하는 일 | 구현 | B05 전용 여부 |
|
||||
|---|---|---|---|---|---|
|
||||
| 1 | `hint-toggle` | 글자 「?」 (Chrome:83-84) | 조작 안내 펼침 · 접음(기본 접힘 · 페이지 동안 기억) | Chrome:180-189 · CSS Style_RouteEdit:61-90 | 일반(안내 글만 페이지 몫) |
|
||||
| 2 | `undo` | SVG `HISTORY_ICON.undo` (Chrome:40-47, 86-87) | 노선 편집 한 걸음 되돌림 | `_History.ts:148-183`(페이지 사진첩 `onPageHistory`) | 페이지 상태(B05 사진첩) |
|
||||
| 3 | `redo` | SVG `HISTORY_ICON.redo` (Chrome:88-89) | 다시 함 | 같음 | 같음 |
|
||||
| 4 | (tools 칸) 3D | 글자 「3D」 `createButton`(`A00_Common/design/design_view_profile_3d_modal.ts:76-78` · 클래스 `b05-route__3d-open`) · 끼움 `design_view_profile.ts:551` `tools: [view3d.modal.button]` · Chrome:153-157 이 유리로 바꿈 | 3D 큰 창 | `_3d_modal.ts` | B05 3D(코리도) |
|
||||
| 5 | `rotate-ccw` | SVG `HALF_TURN_ICON.ccw` (Chrome:29-36, 93-94) | 반시계 15° | `_Rotate.ts:52-79`(`[data-act]` 찾아 붙음) | 일반(D03 도 씀) |
|
||||
| 6 | `rotate-cw` | SVG `HALF_TURN_ICON.cw` (Chrome:95-96) | 시계 15° | 같음 | 일반 |
|
||||
| 7 | `contour-minor` | 글자 「1m 등고선」 · 기본 꺼짐 (Chrome:97-99) | 1m 잔 등고선 켬끔 | `_Contour.ts:249-261` · 열림 = LAS 1m 선 있을 때만 `_RouteEdit.ts:661-664` | 반일반(LAS 있을 때만) |
|
||||
| 8 | `stations` | 글자 「측점」 (Chrome:100-101) | 측점 눈금 · 번호 켬끔(기본 켬) | `_Marks.ts:14-30` · Chrome:254 | 뜻 일반(D03 도 측점 눈금 그림) |
|
||||
| 9 | `slopes` | 글자 「기울기」 (Chrome:102-103) | 측점 사이 기울기 % 켬끔(기본 끔) | `_Marks.ts` · 그림 `_Slope.ts`(서버 높이 묻기) | 뜻 일반 · 구현 B05 |
|
||||
| 10 | `footprint` | 글자 「절/성토선」 (Chrome:104-105) | 도로 끝 · 비탈 끝 선 켬끔(기본 켬) | `_Footprint.ts:80-91` · 값 = 설계 가게 `footprint` | B05 전용(설계 결과) |
|
||||
| 11 | `measure` | 글자 「거리 재기」 (Chrome:106-107) | 노선 위 두 점 거리 · 기울기 · 잰 값 창 | `_Measure.ts:155-182`(`is-active` 만 · `aria-pressed` 없음) | 뜻 일반 · 구현 B05(노선 위 · 서버 지반고) |
|
||||
| 12 | `station-snap` | 글자 「측점 스냅」 (Chrome:109-111) | 곡선 MC 를 간격 배수에 맞춤 | `_SnapStep.ts:29-32, 61-75` · `_RouteEdit.ts:150-159` | B05 전용(곡선) |
|
||||
| 13 | `snap-step` | 고르기 「간격 10 m / 측점 No.」 (Chrome:112-118) | 스냅 간격 | `_SnapStep.ts:67-73`(sessionStorage) | B05 전용 · 단추 아님 |
|
||||
| 14 | `terrain-name` 칸 | 글 칩 「지형 라이다/수치지형도」 · 기본 숨김 (Chrome:120-121) | 설계 지형 이름(둘 다 있을 때) | `_RouteEdit.ts:639-640` | B05 전용 · 단추 아님 · 상태 글에도 같은 말(`_RouteEdit.ts:666-671`) |
|
||||
|
||||
도구줄 밖(제외) — 잰 값 창 닫기 ✕(Chrome:231-233) · 상태 글판 접기 ▾(Chrome:145-146).
|
||||
|
||||
## 2. D03 평면 도구줄 — 지금
|
||||
|
||||
- 만듦 = `D03_PlanAnalysis/D03_PlanAnalysis_UI_Map.ts:135-165` — `createToolbar({ glass, size 32, label "평면 도구" })` + 지역 함수 `tool()` 로 `createIconButton`(ghost) + `data-act`.
|
||||
- 단추 여섯 — `undo`(icon `undo`) · `redo`(`redo`) | `view3d`(`cube`) · `rotate-ccw`(`rotateCcw`) · `rotate-cw`(`rotateCw`) | `measure`(`ruler` · `aria-pressed`).
|
||||
- 배선 — 사건 `PlanMapEvents{onUndo,onRedo,on3d,onMeasure}`(Map:76-81) ← `_UI_Page.ts:119-124` · 켜짐 `setTools`(Map:334-340) ← `_UI_Page.ts:222-229` · 회전 `createMapRotation({ overlay: toolbar })`(Map:180-184) · 되돌리기 = 페이지 스택(`_UI_Page.ts:181-208`) · 재기 = `_UI_Measure.ts`(받은 격자 높이 · 서버 안 감) · 3D = `_UI_3D.ts`.
|
||||
- 자리 = 지도 오른쪽 위(`D03_PlanAnalysis_UI_Style.css:28-32`).
|
||||
- D03 그림 — 측점 눈금 늘 그림(`_UI_Draw.ts:363-373`) · 구간 글 「길이 m · 기울기 %」 늘 그림(`_UI_Draw.ts:374, 448-460`) · 등고선 = 도엽뿐(`_UI_Page.ts:436-444` · 1m 선 없음).
|
||||
|
||||
## 3. 빈칸 표 — B05 에 있고 D03 에 없는 것 · 아이콘
|
||||
|
||||
| act | D03 지금 | D03 에서 뜻 | 아이콘 | 부품 상자 |
|
||||
|---|---|---|---|---|
|
||||
| `hint-toggle` | 없음 | D03 조작 안내(누름 = 점 · Enter 끝 · Esc · Backspace · 가운데 끌기 = 이동 · 휠 · Ctrl+휠) | `help` | 있음 |
|
||||
| `undo` · `redo` | 있음 | — | `undo` · `redo` | 있음 |
|
||||
| 3D | 있음(`view3d`) | — | `cube` | 있음 |
|
||||
| `rotate-ccw` · `rotate-cw` | 있음 | — | `rotateCcw` · `rotateCw`(B05 반 바퀴 그림을 옮긴 것 · icons:96-98) | 있음 |
|
||||
| `contour-minor` | 없음 | 도엽뿐 → 꺼진 채 · 글 「도엽 등고선 — 1m 선 없음」(B05 LAS 없을 때와 같은 꼴) | 새 — Tabler `ripple` | **없음** |
|
||||
| `stations` | 없음 | 측점 눈금 켬끔 | 새 — Tabler `tallymarks`(대안 `hash`) | **없음** |
|
||||
| `slopes` | 없음 | 구간 글 「m · %」 켬끔 | 새 — Tabler `percentage` | **없음** |
|
||||
| `footprint` | 없음 | 없음(설계 전) | `road`(있음 · 대안 Tabler `border-sides`) | 있음 |
|
||||
| `measure` | 있음 | — | `ruler` | 있음 |
|
||||
| `station-snap` | 없음 | 없음(곡선 없음) | 새 — Tabler `magnet` | **없음** |
|
||||
| `snap-step` | 없음 | 없음 | 아이콘 안 됨 — `ui-select` 고르기 그대로(앞 글 「간격」 빼고 title 로) | — |
|
||||
| `terrain-name` | 없음 | 없음 | 글 칩 그대로(단추 아님) | — |
|
||||
|
||||
더할 아이콘 넷 — `ripple` · `tallymarks` · `percentage` · `magnet`(Tabler 에서 옮김 · 머리 MIT 그대로 · `ui_template_icons.ts:38-126`).
|
||||
|
||||
D03 의 B05 전용 셋(`footprint` · `station-snap`+`snap-step` · `terrain-name`) — **⬜ 정할 것**: (가) 안 보임(권장 · 늘 꺼진 단추는 군더더기) / (나) 꺼진 채 보임 + title 「노선설계에서만」. 차례 · 아이콘 · 이름은 두 페이지 같음.
|
||||
|
||||
## 4. 제안 — 공용 부품 하나
|
||||
|
||||
새 부품 `ui_template/ui_template_map_tools.ts`(+ `.css` 안내 판 몫) — 지도 화면 제어 단추 목록 한 벌.
|
||||
- `MAP_TOOLS` — act → 아이콘 · 짧은 title · 켬끔 여부(위 표 차례 그대로).
|
||||
- `mapToolButton(act, { onClick?, title? })` — `createIconButton` + `data-act` + 켬끔이면 `aria-pressed`. title 덮어쓰기 = B05 긴 설명 유지(시험이 잡는 글).
|
||||
- `createMapTools({ groups: (MapToolAct | HTMLElement)[][], hint?: string[], label })` — `createToolbar({ glass, size: 32 })` · 묶음 사이 `"divider"` · `hint` 있으면 [?] + 2열 안내 판(지금 B05 `.b05-routeedit__hint` 꼴을 부품으로) · 돌려줌 `{ root, bar, button(act) }`.
|
||||
- 부품 모음 견본 한 줄(`ui_template_ui_kit_parts.ts` frame 묶음 끝 · 견본 `ui_template_ui_kit_frames.ts`).
|
||||
|
||||
옮기는 것 · 남는 것
|
||||
- 옮김 — 단추 꼴 · 아이콘 · 차례 · 나눔선 · [?] 안내 판.
|
||||
- 페이지에 남음 — 배선 전부(B05 `_History` · `_Rotate` · `_Marks` · `_Footprint` · `_Contour` · `_Measure` · `_SnapStep` 는 `[data-act]` 로 찾으므로 그대로 붙음 · D03 사건 · `setTools`) · 자리(B05 왼쪽 위 · D03 오른쪽 위) · B05 `snap-step` 고르기 · `terrain-name` 칩(페이지가 HTMLElement 로 끼움).
|
||||
- B05 3D 단추 — `_3d_modal.ts:76` 을 `mapToolButton("view3d", { onClick: open })` 로 · 클래스 `b05-route__3d-open` 유지 · `tools: [view3d.modal.button]` 길 그대로.
|
||||
- B05 `_Measure.ts:169-178` — `is-active` 와 함께 `aria-pressed` 맞춤(아이콘 단추 눌림 꼴이 `aria-pressed` 만 봄 · `ui_template_button.css:153`).
|
||||
- B05 `_RouteEdit.ts`(691 줄) — 안 건드림 · Chrome 이 같은 손잡이(`measureButton` · `minorContourButton` · `stationSnapButton` · `terrainName`)를 계속 돌려줌.
|
||||
- `HALF_TURN_ICON` · `HISTORY_ICON`(Chrome:29-47) — 종단 도구줄(`_Profile_Tools.ts:203-205`) · 추천 창 지도(`_Recommend_Map.ts:34-37`)가 계속 씀 → 남김(같은 아이콘으로 바꾸기는 따로).
|
||||
- CSS — B05 도구줄 자리 규칙을 `.b05-routeedit__tools` 로 옮기고 `b05-route__view-controls` 클래스는 뗌(3D 창 도구줄이 계속 씀 · `ui-toolbar` gap 과 겹침 방지) · 안내 판 top(지금 `16 + 32 + 8` · Style_RouteEdit:63)은 유리 줄 높이(패딩 4 · 테두리)에 맞춤 · 나눔선 숨김 규칙(Style_RouteEdit:368)은 `.ui-toolbar__divider:has(+ .b05-routeedit__terrain[hidden])` 로.
|
||||
- D03 켬끔 — 측점 · 기울기 상태는 `_UI_Map.ts` 가 쥐고 `ScreenMap` 에 실어 줌 → `_UI_Draw.ts` 가 `drawStationTicks` · `segmentLabels` 앞에서 봄(줄 넷 · 615 줄).
|
||||
|
||||
### 깨질 시험 · 촬영 장면
|
||||
|
||||
B05 시험(Chrome 글을 읽음)
|
||||
- `test_b05_routeedit_initial.py:203-250` — `data-act` 차례 · `b05-route__view-separator` 다섯 · CSS 두 선택자 → **고침**(부품 부름 차례로).
|
||||
- `test_345_5c_info_hint_collapse.py:29-39` — `data-act="hint-toggle" aria-expanded="false"` · `">?</button>"` · `.b05-routeedit__hint-toggle.ui-btn[data-size]` → **고침**(안내 판이 부품으로 가면 부품 쪽 확인으로).
|
||||
- `test_346_2_footprint_draw.py:107` — `'data-act="footprint"' in chrome` → **고침**.
|
||||
- `test_353_1_cut_fill_line_smooth.py:197-199` — `">절/성토선</button>"` → **고침**(title 글로).
|
||||
- `test_345_2_3d_modal.py` + `helper_345_2_3d_modal.cjs:54-61` — 막이(stub)에 새 부품 함수 더함.
|
||||
- 그대로 지나감(손잡이 · 글 남김) — `test_366_3:104-105`(스냅 title) · `test_390_4:69-72`(snap-step option) · `test_133_1:163-167` · `test_509_5:144-147`(terrain-name) · `test_553_8:16-24`(아이콘 상수 남김) · `test_345_3:61` · `test_408_2` · `test_408_4` · `test_345_5b`.
|
||||
|
||||
D03 시험
|
||||
- `test_553_4_de_parts.py:35-40` — `_UI_Map.ts` 에 `createToolbar({` · `createIconButton(` · `"rotateCcw"` → **고침**(부품 부름으로).
|
||||
- `test_551_2_draw_tokens.py:37`(`--draw-primary`) — 그대로.
|
||||
|
||||
부품 시험 — `test_552_2_button.py:94-99`(아이콘 이름 겹침 없음 · 60 이상) · `test_552_1_ui_kit.py` · `test_552_4_frames.py`.
|
||||
|
||||
촬영 장면 · 설명서(`A05_EduDetail/guide`)
|
||||
- B05 `_scenes.json` — `.b05-routeedit__tools`(00_overview 2번 · 01_plan_tools clip) = 클래스 유지 · `[data-act="hint-toggle"]` + `.b05-routeedit__hint.is-open`(01_plan_hint) → 안내 판 클래스 바뀌면 고침 · `.b05-route__3d-open`(08) = 유지.
|
||||
- D03 `_scenes.json` — `.d03-plan__tools [data-act=undo|redo|view3d|rotate-ccw|rotate-cw|measure]`(00 · 11 · 12 · 13) = 클래스 · act 유지 · D03_11_tools 번호표 늘림.
|
||||
- 글 — B05 `00_설명서.md:17` · `01_평면_노선_편집.md:31-43`(단추 글 → 아이콘 설명) · D03 `00_설명서.md:22, 32` · `06_도구_여섯.md`(「여섯」 이름 · 표).
|
||||
- 다시 찍음 — B05_00_overview · B05_01_plan_tools · B05_01_plan_hint · D03_00_overview · D03_11_tools · D03_12_rotate · D03_13_measure.
|
||||
|
||||
## 5. 코더 조각 · 차례
|
||||
|
||||
1 → (2 ∥ 3). 3 은 395-2(D03 겹 켬끔)와 같은 `_UI_Map.ts` — 같은 창에 잇거나 395-B 와 차례로.
|
||||
|
||||
| 조각 | 파일 | 시험 |
|
||||
|---|---|---|
|
||||
| 1 공용 부품 | `ui_template/ui_template_icons.ts`(넷 더함) · 새 `ui_template/ui_template_map_tools.ts` · 새 `ui_template/ui_template_map_tools.css` · `ui_template/ui_template_ui_kit_parts.ts` · `ui_template/ui_template_ui_kit_frames.ts` | `test_552_2_button.py` · `test_552_1_ui_kit.py` · `test_552_4_frames.py` |
|
||||
| 2 B05 받음 | `B05_Profile/B05_Profile_UI_RouteEdit_Chrome.ts` · `B05_Profile/B05_Profile_UI_Style_RouteEdit.css` · `B05_Profile/B05_Profile_UI_RouteEdit_Measure.ts` · `A00_Common/design/design_view_profile_3d_modal.ts` · 시험 위 다섯 + `helper_345_2_3d_modal.cjs` · `A05_EduDetail/guide/B05/{00_설명서,01_평면_노선_편집}.md` · `_scenes.json`(안내 판만) | 위 B05 목록 + 그대로 지나갈 것들 |
|
||||
| 3 D03 받음 | `D03_PlanAnalysis/D03_PlanAnalysis_UI_Map.ts` · `D03_PlanAnalysis/D03_PlanAnalysis_UI_Draw.ts` · `D03_PlanAnalysis/D03_PlanAnalysis_UI_Style.css`(안내 판 자리) · `test_553_4_de_parts.py` · `A05_EduDetail/guide/D03/{00_설명서,06_도구_여섯}.md` · `_scenes.json` | `test_553_4_de_parts.py` · `test_551_2_draw_tokens.py` · `test_562_1_plan_draw.py` |
|
||||
|
||||
화면 확인(ORCA) — B05 · D03 같은 차례 · 같은 아이콘 · 눌림 꼴(측점 · 기울기 · 재기 · 스냅) · B05 1m 꺼짐(도엽 프로젝트) · D03 1m 꺼짐 · 회전 · 3D 열림 · [?] 안내 판 자리(도구줄과 안 겹침).
|
||||
@@ -0,0 +1,196 @@
|
||||
# 395-B 분석 — 노선분석(D03) 겹 켜고 끔 (요구 395-2)
|
||||
|
||||
## 결론
|
||||
|
||||
- 지금 D03 = 위성 한 장(그림) + 도엽 등고선(벡터)을 **따로** 그림. 그래서 켜고 끄기는 값이 쌈(그리기 조건 한 줄씩).
|
||||
- **세류선은 이미 우리 손에 있음**: 지형 받기 때 `도엽_하천중심선.geojson` 이 같이 생김(구분 = 세류 · 소하천 · 지방하천). 새로 받거나 셀 일 없음.
|
||||
- **지적도**는 B04 가 이미 브이월드 WFS(`lt_c_landinfobasemap`)로 받는 길이 있음. D 프로젝트는 그 길을 안 타서 파일이 없음. 브이월드 WFS 는 한 번에 1,000 필지까지라 범위를 쪼개 받아야 함.
|
||||
- **기존 도로**는 도엽 zip 안에 이미 있음(`N3L_A0020000` 도로중심선). 파서 목록에 한 줄만 넣으면 됨.
|
||||
- **급경사 색 · 음영기복**은 서버 격자(2 m)에서 그림 한 장으로 만듦. E07 경사 함수와 B07 음영 함수를 그대로 다시 씀.
|
||||
- 타당성평가 점수 항목(35° 이상 급경사 비율 · 계류 100 m · 도로 300 m)과 노선배치 회피 기준(40° 연속 · 0차곡)이 이 겹들과 바로 이어짐. 그래서 위성 · 등고선 · 세류 · 지적 · 도로 · 급경사를 묶어 권함.
|
||||
- 켜고 끄기 = 지도 왼쪽 위에 **아이콘 단추 한 줄**(유리 도구줄). 오른쪽 위 도구줄(395-A 몫)과 겹치지 않음. 고른 값은 `aislo:pref:d03.layers` 에 기억.
|
||||
|
||||
## 1. 지금 D03 겹
|
||||
|
||||
| 겹 | 만드는 곳 | 그리는 곳 | 꼴 |
|
||||
| --- | --- | --- | --- |
|
||||
| 위성 | `D03_PlanAnalysis_Terrain.py:186-218` `_satellite` → B04 `download_vworld_satellite_map`(브이월드 WMTS Satellite 타일을 PNG 한 장으로 이어 붙임 · 한 변 타일 수 한도 넘으면 줌을 낮춤) · `B04_PreProcess_Engine_VWorld.py:72-197` | `D03_PlanAnalysis_UI_Map.ts:232-236` `drawImage` · 불러오기 `D03_PlanAnalysis_UI_Page.ts:420-427` | 그림 1장(`vworld_satellite.png` · 표본 D 프로젝트 22.8 MB · 7.5 × 5.8 km) |
|
||||
| 도엽 등고선 | 지형 받기의 도엽 병합 `D03_PlanAnalysis_Terrain.py:174-183` → `도엽_등고선.geojson` | `D03_PlanAnalysis_UI_Map.ts:237-261` `drawPreparedLayer`(가닥 수로 간격 고름 `pickLevelStep`) + `drawPreparedLabels`(25 m 마다 수치) · 받기 `D03_PlanAnalysis_UI_Page.ts:428-444`(그은 선 + 600 m 범위만 잘라 받음) | 벡터 |
|
||||
| 그은 선 · 측점 · 마크 · 재기 | — | `setLayers` 겹(`D03_PlanAnalysis_UI_Map.ts:69-75` · `:263-267`) · `D03_PlanAnalysis_UI_Page.ts:213` | 벡터 |
|
||||
|
||||
- 위성과 등고선은 이미 따로 그림. 끄기 = 위성은 `image: null`, 등고선은 `contours: null` 을 넘기면 끝. 값이 쌈.
|
||||
- 계곡선(計曲線 = 25 m 굵은 등고선 · 골짜기 선 아님)과 주곡선(5 m)은 도엽 `구분` 칸에 들어 있음(표본 D 프로젝트 계곡선 453 · 주곡선 1,779). 지금은 둘 다 같은 굵기(0.8 px)로 그림. 수치는 25 m 마다 이미 나옴.
|
||||
- 계곡선을 굵게 하는 법 = `drawPreparedLayer(..., everyM 25)` 를 굵은 선으로 한 번 더 그림(`B04_PreProcess_UI_MapRender.ts:555-575`). 몇 줄이면 됨.
|
||||
- 위성이 흐린 까닭(이어 붙인 한 장 · 넓으면 줌이 낮아짐)은 389-C 의 줌별 타일 과제와 뿌리가 같음. 이번 범위 밖.
|
||||
|
||||
## 2. 후보 겹 · 출처
|
||||
|
||||
### 도엽 zip 안에 든 것(표본 도엽 33매 실측)
|
||||
|
||||
| 코드 | 이름 | 쓸모 | 지금 파서 |
|
||||
| --- | --- | --- | --- |
|
||||
| `N3L_F0010000` | 등고선(구분 계곡선 · 주곡선 · 등고수치) | 긋기의 바탕 | 있음 |
|
||||
| `N3L_E0020000` | 하천중심선(구분 세류 4,502 · 소하천 506 · 지방하천 253 · 연결선 13) | 세류선 | 있음 |
|
||||
| `N3L_A0020000` | 도로중심선(도로구분 미분류 · 면리간도로 · 소로 · 지방도 · 일반국도 · 포장재질 · 도로폭) | 기존 도로 · 시점 접속 · 도로 300 m | **없음** |
|
||||
| `N3P_H0040000` | 지명(형태 계곡 · 령 · 부락 · 법정명) | 위치 읽기 | 있음 |
|
||||
| `N3A_G0010000` | 행정경계(도 · 군 · 면) | 낮음 | 없음 |
|
||||
| `N3A_B0010000` · `N3A_D0010000` · `N3A_E0010001` | 건물 · 경지(밭 · 논) · 실폭하천 | 인가 · 경작지 회피 | 없음 |
|
||||
|
||||
- 파서 목록: `B04_PreProcess_Engine_SheetParser.py:27-36`(`SHEET_LAYERS`). 산출 = `도엽_{키}.geojson`. 내보내기 = `/geojson?layer=도엽_{키}`(`B04_PreProcess_Router_GIS.py:29` 가 목록을 따라 자동으로 늘어남).
|
||||
- 도엽 이용 조건 = 국토지리정보원 수치지형도. 공공데이터포털 수치지도 표기 = 공공누리 제1유형(출처표시 · 상업 이용 가능). 화면 귀퉁이에 출처 한 줄 표시 권함.
|
||||
|
||||
### 겹별 판정
|
||||
|
||||
| 겹 | 출처 · 이용 조건 | 만드는 법 | 손 | 노선 긋기에 쓸모 |
|
||||
| --- | --- | --- | --- | --- |
|
||||
| a. 도엽 등고선 | 수치지형도 · 공공누리 1유형 | 있음. 계곡선만 굵게 한 번 더 그림 | 아주 작음 | 필수. 등고선 간격 = 원지반 기울기 |
|
||||
| b. 위성 | 브이월드 WMTS Satellite · 공공누리 1유형 · 무료(389-C 참조) | 있음. 끄기만 | 아주 작음 | 필수. 숲 · 개간지 · 기존 길 |
|
||||
| c. 세류선 | 도엽 하천중심선(이미 받음) | `fetchCachedSheetLayer(…, "도엽_하천중심선")` → `구분` 으로 나눠 세류는 가는 파랑, 소하천 · 지방하천은 굵은 파랑 | 작음 | 필수. 계류 횡단 = 배수 시설. 계류 100 m 는 타당성평가 점수 |
|
||||
| c'. 지형 추정 골짜기(0차곡) | 우리 2 m DEM | B05 `extract_skeleton_from_grid`(whitebox D8 흐름누적 · `B05_Profile_Engine_Skeleton.py:235-267` · 공개 순수 함수)를 `models_plan` 격자에 돌림 | 중간 | 나중. 도엽에 없는 0차곡 곡두(노선배치 △)를 보임. 임계값 협의가 필요함 |
|
||||
| d. 지적도 | 브이월드 WFS `lt_c_landinfobasemap`(LX맵 · 속성 = 지번 · 지목 · 소유구분 `owner_nm` · 공시지가) 또는 `lp_pa_cbnd_bubun`. 국토교통부 연속지적도 = 이용허락 제한 없음 · 무료. **참고용(법적 효력 없음)** | 서버: B04 `request_vworld_wfs`(`B04_PreProcess_Engine_GisVector.py:31-65`) 꼴로 범위를 1 km 칸으로 쪼개 받아 합침 → `연속지적도_bounds.geojson`. 기존 `/geojson?layer=지적도` 가 그대로 내보냄(`B04_PreProcess_Router_GIS.py:125`). 화면: `prepareLayer` → `drawPreparedLayer`(B04 지도와 같음) | 중간 | 필수. 국유림 · 사유림 경계. 사유림은 산주 동의 대상(임도망_편성 L54-56) |
|
||||
| e1. 기존 도로 | 도엽 도로중심선 | 파서 목록에 `"도로중심선": ("N3L", "A0020000")` 한 줄. 이미 받은 D 프로젝트는 그 겹만 따로 풀어 냄(아래 3절) | 작음 | 높음. 노선배치 원칙 「기존 도로 최대 이용 · 연결」(노선_배치 L63). 도로 300 m 는 타당성평가 점수 |
|
||||
| e2. 급경사 색 | 우리 2 m DEM(평활 안 한 `dtm_sheet_laplace.npz`) | 서버 ③: E07 `slope_rad`(Horn · `E07_StabArea_Engine.py:86-99`)로 경사 → 단계 색 PNG(data URL) + 상자. 저장본은 `models_plan/_derived/`, 열쇠 = 격자 지문 | 중간 | 높음. 35° 이상 급경사 비율 = 타당성평가 점수(타당성평가 L42 · L59) · 40° 연속 = 회피(노선_배치 L29) |
|
||||
| e3. 음영기복 | 같은 DEM | B07 `hillshade_png`(`B07_DesignDetail_Engine_Cad_Lidar.py:59`)를 그대로 부름. e2 와 같은 길 | 작음(e2 뒤) | 중간. 위성을 껐을 때 산 모양 읽기 |
|
||||
| e4. 지명 | 도엽 지명(이미 받음) | 점 + 글자 그리기 | 작음 | 낮음~중간. 계곡 · 령 이름 |
|
||||
| e5. 산림 주제도 | 브이월드 WMS/WFS 산림입지도 `lt_c_fsdifrsts` · 산림보호구역 `lt_c_uf151` · 산불위험예측 `lt_c_kfdrssigugrade`. 산사태위험지도는 산림청 · 행안부 WMS(이용 조건 확인 못 함) | WFS 쪼개 받기 또는 WMS 그림 | 중간~큼 | 나중. 산사태지역 = 회피(노선_배치 L32) · 타당성평가 등급 항목 |
|
||||
| e6. 계류 100 m · 도로 300 m 띠 | c · e1 에서 파생 | 띠 채움 | 중간 | 나중. 타당성평가 비율을 눈으로 봄 |
|
||||
| — 행정경계 | 도엽 · 브이월드 | — | — | 뺌(긋기에 쓸모 낮음) |
|
||||
| — 시점 · 종점 · 측점 이름 | 그리기 겹(이미 있음) | — | — | 측점 켜고 끄기는 395-A 도구줄 몫 |
|
||||
|
||||
- 지적도 그림 좌표: 브이월드 WMS · 데이터 API 둘 다 EPSG:5186 · 5185 · 5187 · 4326 · 3857 을 받음. 그래서 투영은 걸림돌이 아님.
|
||||
- 우리 그림 틀은 경위도 선형(`createNormalizer` · `B04_PreProcess_UI_MapRender.ts:98`)이고 위성 그림과 같은 틀임.
|
||||
- WFS 를 EPSG:4326 로 받으면 등고선과 같은 길(`prepareLayer`)로 바로 겹침.
|
||||
- 벡터(WFS)를 권하는 까닭:
|
||||
- 확대해도 선이 깨지지 않음.
|
||||
- 나중에 필지에 마우스를 올려 지번 · 지목 · 소유를 볼 수 있음.
|
||||
- 그림(WMS)은 확대하면 흐림.
|
||||
- 브이월드 한도:
|
||||
- WFS `maxFeatures` 최대 1,000.
|
||||
- 데이터 API 는 상자 하나 2 km² 이하, `size` 최대 1,000 + `page`.
|
||||
- 표본 D 프로젝트 지형 상자 = 4.7 × 2.5 km(약 12 km²) → 1 km 칸 12번 요청. 1,000 이 꽉 차면 그 칸을 넷으로 다시 쪼갬.
|
||||
- 지금 B04 는 쪼개지 않음(1,000 넘으면 잘림). 이번 범위 밖이라 메모만 남김.
|
||||
- 카카오 지적편집도(`USE_DISTRICT`)는 카카오 지도 안에서만 됨. 서버 저장 금지 · 카카오 고유 타일 격자라 D03 캔버스엔 못 씀. D02(카카오) 겹침 단추로는 몇 줄이면 가능함(이번 범위 밖).
|
||||
- 브이월드 키 = 신청 때 적은 서비스 주소에 묶임. 서버 요청의 `domain=localhost`(`B04_PreProcess_Engine_GisVector.py:44`)는 운영 도메인으로 맞출 일.
|
||||
|
||||
## 3. 켜고 끄기 화면
|
||||
|
||||
- 부품:
|
||||
- `createIconButton({ icon, title, pressed })` — 켬 = `aria-pressed`. 눌림 꼴은 이미 있음(`ui_template_button.css:153`). D03 [거리재기] 와 같은 방식.
|
||||
- 묶음은 `createToolbar({ glass: true, size: 32 })`.
|
||||
- 글자 칩 대안 = `createToggle({ kind: "chip", dot })`(`ui_template_toggle.ts`) — 아이콘이 안 될 때.
|
||||
- 아이콘(`ui_template_icons.ts` · Tabler 선 아이콘 MIT):
|
||||
|
||||
| 겹 | 아이콘 | 있음 / 더함 |
|
||||
| --- | --- | --- |
|
||||
| 위성 | `satellite` | 더함 |
|
||||
| 등고선 | `mountain` | 있음 |
|
||||
| 세류선 | `droplet` | 더함 |
|
||||
| 지적도 | `borderAll` | 더함 |
|
||||
| 기존 도로 | `road` | 있음 |
|
||||
| 급경사 | `angle` | 더함 |
|
||||
| 음영기복 | `sun` | 있음 |
|
||||
|
||||
- 단추 제목에 색 뜻을 적음. 예: 「세류선(가는 파랑) · 하천(굵은 파랑)」 · 「지적도(참고용 · 법적 효력 없음)」.
|
||||
- 자리 = 지도 **왼쪽 위** 유리 도구줄 한 줄(`.d03-plan__layers`). 오른쪽 위 도구줄(`.d03-plan__tools` · `D03_PlanAnalysis_UI_Style.css`)과 따로 있음. 왼쪽 판은 이미 지형 · 그리기 · 구역 세 칸이라 더하지 않음.
|
||||
- 그리는 차례(아래 → 위): 위성 → 음영 · 급경사 → 지적도 → 등고선(계곡선 굵게 · 수치) → 기존 도로 → 세류 · 하천 → 그은 선 · 측점 → 재기.
|
||||
- 받기 = 켤 때만(B04 `fetchGisLayer` 의 「꺼진 층은 켤 때 부름」 규칙 · `B04_PreProcess_UI_MapLayers.ts:54-65`).
|
||||
- 자료가 없으면 단추를 막고 제목에 「지형 받기 뒤 보임」을 적음.
|
||||
- 세류 · 도로 파일은 1~2 MB 라 범위 자르기(`scope=route`) 없이 통째로 받음. 범위 사본 지우기 `keep=4`(`B04_PreProcess_Engine_SheetClip.py:257`)와 부딪히지 않음.
|
||||
- 기억 = `aislo:pref:d03.layers`(JSON · 켬끔 한 벌 · 전역). `readByKey` · `writeByKey`(`A00_Common/b_page_state.ts:306-310`). D02 지도 종류가 같은 방식(`D02_PlanBase_UI_Page.ts:47` · `:118` · `:129`).
|
||||
- localStorage + 서버 취향 동기화가 이미 붙어 있음.
|
||||
|
||||
## 4. 코더 나눔(파일로 경계)
|
||||
|
||||
### 조각 1 — 서버 겹 만들기(Python)
|
||||
|
||||
- 새 파일 `D03_PlanAnalysis/D03_PlanAnalysis_Layers.py`(약 150줄):
|
||||
- `fetch_cadastral(project_root, box, epsg)`: 1 km 칸으로 쪼개 WFS 를 받음 · 1,000 꽉 차면 넷으로 다시 쪼갬 · `UFID`(없으면 `pnu`)로 겹친 것 걸러 냄 → `processed/연속지적도_bounds.geojson` + 열쇠(상자).
|
||||
- `ensure_sheet_layer(project_root, key)`: `sheet_merge.key.json` 의 도엽으로 `parse_and_merge_sheets(..., layers=[key])` · 파일이 없을 때만.
|
||||
- `terrain_raster(project_root, kind)`: kind = slope · shade · `_derived/` 저장본 · `{box_m, image}`.
|
||||
- `D03_PlanAnalysis_Terrain.py`: 위성 다음(`:255-256`)에 지적도 받기 한 단계. 실패해도 지형 받기를 막지 않음(위성과 같음).
|
||||
- `D03_PlanAnalysis_Router.py`:
|
||||
- `GET plan/layers/cadastral`(없으면 지금 받음 → 파일)
|
||||
- `GET plan/layers/sheet?key=도로중심선`(없으면 풀어 냄 → 기존 `/geojson` 로 넘김)
|
||||
- `GET plan/layers/raster?kind=slope|shade`
|
||||
- 권한은 기존 D03 와 같음.
|
||||
- `B04_PreProcess/B04_PreProcess_Engine_SheetParser.py:27-36`: `"도로중심선": ("N3L", "A0020000")` 한 줄.
|
||||
- B 프로젝트도 다음 병합 때 파일이 하나 늘어남(해 없음).
|
||||
- `PARSER_VERSION` 은 올리지 않음 → 모든 B 프로젝트 다시 병합을 피함.
|
||||
- 시험 `resources/tester/test_395_d03_layers.py`: 칸 쪼개기(1,000 꽉 참 → 넷) · 겹친 필지 거르기 · 급경사 단계(합성 경사면 격자) · 저장본 열쇠.
|
||||
|
||||
### 조각 2 — 화면 겹 판 + 그리기(TS)
|
||||
|
||||
- 새 파일 `D03_PlanAnalysis/D03_PlanAnalysis_UI_Layers.ts`(약 200줄):
|
||||
- 겹 목록(키 · 아이콘 · 제목 · 처음 값 · 받기 · 그리기)
|
||||
- 아이콘 도구줄 · 취향 기억 · 켤 때 받기
|
||||
- 겹마다 `PlanMapLayer` 를 돌려줌
|
||||
- Page 의 `loadBackground`(`D03_PlanAnalysis_UI_Page.ts:420-444`)를 이리 옮김 → Page 가 줄어듦(586줄)
|
||||
- `D03_PlanAnalysis_UI_Map.ts` — **고칠 자리 = `ScreenMap` · `PlanMapScene` · `draw()` 몸통만**:
|
||||
- `ScreenMap` 에 `view` 를 더함 → 밖의 겹이 B04 `drawPreparedLayer` · `drawPreparedLabels` 를 부를 수 있음.
|
||||
- 등고선 덩이(`:237-261`)는 Layers 쪽 겹으로 옮김. 계곡선은 굵게 한 번 더 그림.
|
||||
- 위성은 `scene.image` 그대로. 끄면 null.
|
||||
- `D03_PlanAnalysis_UI_Page.ts`: 겹 판을 `map.root` 에 붙임 · `setLayers` 차례 = 바탕 겹 + 그리기 · 재기(`:213` · `:560`).
|
||||
- `D03_PlanAnalysis_Api.ts`: 위 세 GET.
|
||||
- `D03_PlanAnalysis_UI_Style.css`: `.d03-plan__layers`(왼쪽 위 자리만).
|
||||
- `ui_template/ui_template_icons.ts`: `satellite` · `droplet` · `borderAll` · `angle` 더함(Tabler 경로 복사).
|
||||
- 시험: 화면 겹은 `tmp/` 의 ORCA 확인으로. 순수 계산이 생기면(세류 `구분` 나누기 등) `logic/` + 지킴 시험 하나.
|
||||
|
||||
### 395-A(도구줄)와 맞닿는 곳
|
||||
|
||||
- `D03_PlanAnalysis_UI_Map.ts` 의 `createPlanMap` 앞부분(`:135-166` `tool` · `createToolbar` · 단추)은 **조각 2 가 손대지 않음**. 395-A 몫.
|
||||
- 조각 2 는 같은 파일의 `:49-75`(형) · `:225-268`(`draw`)만 고침. 두 창이 같은 파일을 만지므로 **395-A 먼저 합류 → 조각 2 가 받은 뒤 착수**가 안전함.
|
||||
- 395-A 가 B05 · D03 공용 도구줄에 「겹」 자리를 둔다면 조각 2 는 단추 배열만 넘김(`UI_Layers.ts` 가 `buttons: HTMLButtonElement[]` 를 내보냄). 자리 결정은 아래 표 2번.
|
||||
- 조각 1 · 2 는 파일이 겹치지 않음. 위 세 GET 꼴만 먼저 정하면 같이 돌 수 있음.
|
||||
- 위성 · 등고선 · 세류는 서버 손 없이 조각 2 만으로 먼저 됨.
|
||||
|
||||
## 권하는 겹
|
||||
|
||||
| 차례 | 겹 | 출처 | 처음 값 | 손 | 까닭 |
|
||||
| --- | --- | --- | --- | --- | --- |
|
||||
| 지금 | 위성사진 | 브이월드 WMTS(있음) | 켬 | 아주 작음 | 숲 · 개간지 · 기존 길 |
|
||||
| 지금 | 도엽 등고선(계곡선 굵게 · 25 m 수치) | 수치지형도(있음) | 켬 | 작음 | 긋기의 바탕 · 원지반 기울기 |
|
||||
| 지금 | 세류선 · 하천 | 도엽 하천중심선(있음) | 켬 | 작음 | 계류 횡단 · 계류 100 m(타당성평가) |
|
||||
| 지금 | 지적도 | 브이월드 WFS LX맵 · 제한 없음 · 참고용 | 끔 | 중간 | 국유 · 사유 경계 · 산주 동의 |
|
||||
| 지금 | 기존 도로 | 도엽 도로중심선(파서 한 줄) | 끔 | 작음 | 시점 접속 · 도로 300 m(타당성평가) |
|
||||
| 지금(경계값 정하면) | 급경사 색 | 2 m DEM · E07 경사 함수 | 끔 | 중간 | 35° 이상 비율(타당성평가) · 40° 연속 회피 |
|
||||
| 다음 | 음영기복 | 같은 DEM · B07 음영 함수 | 끔 | 작음 | 위성 끈 채 산 모양 |
|
||||
| 다음 | 지명 | 도엽 지명(있음) | 끔 | 작음 | 계곡 · 령 이름 |
|
||||
| 나중 | 지형 추정 골짜기(0차곡) | 2 m DEM · B05 whitebox 흐름누적 | 끔 | 중간 | 도엽에 없는 곡두 회피 |
|
||||
| 나중 | 산림 주제도(산사태 · 보호구역 · 입지) | 산림청 · 브이월드(조건 확인 필요) | 끔 | 중간~큼 | 회피 지역 · 등급 항목 |
|
||||
| 나중 | 계류 100 m · 도로 300 m 띠 | 위 겹에서 파생 | 끔 | 중간 | 타당성평가 비율을 눈으로 봄 |
|
||||
|
||||
## 갈래 갈리는 결정
|
||||
|
||||
| # | 물음 | 갈래 | 권함 |
|
||||
| --- | --- | --- | --- |
|
||||
| 1 | 급경사 단계 경계 | (가) 15° · 35° · 40°(임도망_편성 L20 완 · 중 · 급경사지 + 별표1 35° + 노선_배치 40°) (나) 35° 하나(타당성평가만) (다) % 단위 | (가) — 지식DB 근거 셋이 맞물림. 사용자 확정 필요 |
|
||||
| 2 | 겹 단추 자리 | (가) 지도 왼쪽 위 따로 한 줄 (나) 395-A 공용 도구줄 안 「겹」 묶음 (다) 「겹」 아이콘 하나 → 펼침 판 | (가) — 395-A 와 파일 자리가 덜 겹침. 아이콘이 일곱 넘으면 (다) |
|
||||
| 3 | 지적도 받는 때 | (가) 지형 받기 때 같이 + 없으면 켤 때 받음 (나) 켤 때만 | (가) — 이미 받은 D 프로젝트도 켜면 받아짐 |
|
||||
| 4 | 지적도 출처 | (가) WFS LX맵(`lt_c_landinfobasemap` · 소유 · 지목 있음 · B04 와 같음) (나) 연속지적도 `lp_pa_cbnd_bubun`(데이터 API · 2 km² 상자) (다) WMS 그림 | (가) |
|
||||
| 5 | 급경사 · 음영 셈 자리 | (가) 서버 ③ PNG(E07 · B07 함수 재사용 · 평활 안 한 격자) (나) 브라우저가 받은 평활 격자로 셈 | (가) — 계산 자리 규칙과 맞고 평활본은 경사를 낮춰 보임 |
|
||||
| 6 | 처음 켜진 겹 | 위성 · 등고선 · 세류 켬 / 나머지 끔 | 이대로. 고른 값은 취향으로 기억 |
|
||||
| 7 | 지적도 마우스 정보(지번 · 지목 · 소유) | 지금 / 나중 | 나중 — `prepareLayer` 가 속성을 버려서 따로 손이 듦 |
|
||||
|
||||
## 출처
|
||||
|
||||
- 브이월드 WMS 안내(지원 좌표계 5185 · 5186 · 5187 · 4326 · 3857 · 연속지적도 `lp_pa_cbnd_bubun`): https://www.vworld.kr/dev/v4dv_wmsguide_s001.do
|
||||
- 브이월드 WMS/WFS 레이어 목록 · WFS `maxFeatures` 최대 1,000 · 산림 레이어명: https://www.vworld.kr/dev/v4dv_wmsguide2_s001.do
|
||||
- 브이월드 2D 데이터 API 연속지적도(상자 2 km² · size 1,000 · page): https://www.vworld.kr/dev/v4dv_2ddataguide2_s002.do?svcIde=cadastral
|
||||
- 국토교통부 연속지적도형정보(WMS/WFS · 이용허락 제한 없음): https://www.data.go.kr/data/15123899/openapi.do
|
||||
- 국토교통부 연속지적도: https://www.data.go.kr/data/15056910/openapi.do
|
||||
- 국토교통부 지적도(WMS/WFS · 공공누리 1유형): https://www.data.go.kr/data/15057570/openapi.do
|
||||
- 공공데이터포털 수치지도 메타(공공누리 1유형 표기): https://www.data.go.kr/dcat/metadata/15133054
|
||||
- 브이월드 WMTS(위성 · 공공누리 1유형): https://www.data.go.kr/data/3046388/openapi.do
|
||||
- 산림청 과거산사태 정보(API · 조건 미확인): https://www.data.go.kr/data/15074816/openapi.do
|
||||
- Tabler Icons(MIT): https://tabler.io/icons
|
||||
- 지식DB:
|
||||
- `resources/knowledge/technical_info/01_임도/01_계획노선/타당성평가.md` L42 · L46-47 · L59 · L62-63
|
||||
- `노선_배치.md` L29 · L32 · L55 · L63
|
||||
- `임도망_편성.md` L20 · L54-56
|
||||
- 원문 `resources/knowledge/original/법률/산림자원의 조성 및 관리에 관한 법률 시행규칙/별표/별표1_…md` L117-122
|
||||
|
||||
## 확인 못 한 것
|
||||
|
||||
- 브이월드 WFS 하루 한도 숫자 · 상자 면적 한도(문서에 없음). 운영 도메인 키 등록 범위.
|
||||
- 산사태위험지도 · 산림입지도의 상업 이용 조건.
|
||||
- 도엽 `도로구분` 에 임도가 따로 없음(미분류 · 소로에 섞임으로 보임). 기존 임도망은 산림청 자료가 따로 필요할 수 있음.
|
||||
Reference in New Issue
Block a user