From aa0e7e1b4c0f5d2711af75177dce5e144d8655aa Mon Sep 17 00:00:00 2001 From: umsangdon Date: Fri, 30 Oct 2026 18:08:18 +0900 Subject: [PATCH] =?UTF-8?q?knowledge(=EC=9A=94=EA=B5=AC):=20=EC=9A=94?= =?UTF-8?q?=EA=B5=AC=EC=84=9C=20475=20=C2=B7=20=EB=B6=84=EC=84=9D=20?= =?UTF-8?q?=EB=91=98=20=E2=80=94=20=EC=98=81=EC=97=AD=20=EB=A3=A8=ED=8B=B4?= =?UTF-8?q?=20=C2=B7=20=EB=8F=84=EC=97=BD=20=EC=A1=B0=EA=B0=81=20=ED=99=94?= =?UTF-8?q?=EB=A9=B4=20=EB=A7=9E=EC=B6=A4=20=C2=B7=20=EC=98=AC=EB=A6=B0=20?= =?UTF-8?q?=EC=9E=84=EB=8F=84=EB=A7=9D=20=EC=83=89=20=C2=B7=20=EB=AA=A9?= =?UTF-8?q?=EB=A1=9D=20=C2=B7=20=EC=84=9C=ED=81=B4=20=EC=9E=90=EB=A6=AC=20?= =?UTF-8?q?=C2=B7=20PLAN=20604~606=20=EC=8A=B9=EC=9D=B8=20=EB=8C=80?= =?UTF-8?q?=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- docs/raw/요구_1025/_분석_475_영역_겹_루틴.md | 160 ++++++++++++ .../_분석_477_수치지형도_화면맞춤.md | 228 ++++++++++++++++++ ...요구서_475_영역루틴_도엽조각_임도망목록.md | 38 +++ 3 files changed, 426 insertions(+) create mode 100644 docs/raw/요구_1025/_분석_475_영역_겹_루틴.md create mode 100644 docs/raw/요구_1025/_분석_477_수치지형도_화면맞춤.md create mode 100644 docs/raw/요구_1025/요구서_475_영역루틴_도엽조각_임도망목록.md diff --git a/docs/raw/요구_1025/_분석_475_영역_겹_루틴.md b/docs/raw/요구_1025/_분석_475_영역_겹_루틴.md new file mode 100644 index 000000000..74e78a31a --- /dev/null +++ b/docs/raw/요구_1025/_분석_475_영역_겹_루틴.md @@ -0,0 +1,160 @@ +# 분석 475 — 받은 범위 밖 지점 · 겹 표기 흠 · 영역 루틴 (요구 475 · 다) + +읽기 전용 · 줄 = main_laptop_1 `c26119ef8` · 코드 · git · storage · DB 안 고침 · 서버 요청 없음(파일 시각 · 로그 · 저장본 상자로 판정). +재현 자리 = `가이드_예정노선_용화` `6067750f`(오늘 17:2x~17:43 · 이 시간대 D 받기는 이 프로젝트뿐) · 서버 로그 `tmp/server.log` 1597926 · 1598027 · 1598041 줄. + +## 0. 결론 + +1. **흠 뿌리 = 받기 끝 차례 경합 하나** — `follow()` 가 지형면 읽기(`loadSurface` · 이 안에서 `have` 바꿈)와 겹 다시 읽기(`backdrop.load` · `opts.have()` 를 읽음)를 **동시에** 돌림(`UI_Page.ts:454`). 겹 쪽이 늘 먼저 읽어 **옛 받은 범위**로 판정 · 지문 · 자르기. +2. 같은 도엽 안에서 늚 = 「바뀜 없음」 판정 → 켠 겹 하나도 안 다시 받음(급경사 포함). 새 도엽 = 위성 틀이 바뀌어 다 다시 받음 → 서버가 범위를 정하는 겹(급경사 등)은 새 범위 · **화면이 범위를 정하는 등고선 = 옛 상자로 잘림 · 세류 = 옛 지문 주소 = 브라우저 보관함 옛 파일**. +3. 사용자 화면 그대로 재현 — 받기 둘(같은 도엽 → 새 도엽) · 둘째 받기 뒤 급경사 = 새 DEM · 등고선 = 첫 받기 범위 + 600 m 로 잘림(서쪽 1.9 km · 남쪽 0.7 km 띠 빔). +4. 서버는 이미 거의 「받은 범위 하나」 — 예외 = 등고선(화면이 보낸 상자 · B04 길) · 도엽 겹 안 자름. 받기 끝 알림 = 화면이 진행을 1 s 마다 읽어 이미 앎. +5. **영역 루틴 찬성** — 새 틀은 거의 필요 없음: 사건 → `ensureCovered`(한 곳 · 이미 있음) → 받기 → **받은 범위 먼저 읽고 그 값을 겹에 넘김** → 겹 = 「받은 범위 지문 바뀜 → 켠 겹 모두 다시(차례 번호로 옛 답 버림)」 한 규칙 · 범위는 서버가 정함. 겹마다 다른 규칙 · 코드 등록부 안 만듦(ponytail). +6. 지운 지점 영역 = **그대로 둠(가 · 권함)** — 줄이면 DEM 통째 다시 셈 + storage 다시 씀(Synology 번짐) + 되돌리기 때 또 받음. + +## 1. 재현 근거(6067750f · 2026-10-30) + +| 때 | 일 | 근거 | +| --- | --- | --- | +| 받기 1 | 격자 1000 × 1316(서 207,443 · 남 467,243 · 2.63 × 2.0 km) 44.5 s · 도엽 병합 없음 · 위성 건너뜀(같은 도엽) | 로그 1597926 · 병합 줄 0 | +| 받기 1 끝 | 겹 다시 받은 자국 없음 — 같은 도엽 = 위성 틀 같음 · 경합으로 옛 `have` = 「바뀜 없음」 | 로그 · 파일 시각 | +| 17:33:50~57 | 받기 2 — 새 도엽 4 매 → 병합 6 매 · 위성 틀 바뀜 | `processed/sheet_merge.key.json` · `vworld_satellite_meta.json` 시각 | +| 17:35:38~40 | 지형면 1341 × 2259(서 205,558 · 남 466,562 · 4.52 × 2.68 km) 102 s · `plan_terrain.json` · 일 끝 | `models_plan/` 시각 · 로그 1598027 | +| 17:35:43 | 도로 표시본 새로 = 새 도엽(서버가 정함 ✓) | `도엽_도로중심선.display.geojson` | +| 17:35:44~48 | **등고선 범위 사본 — 자른 상자 서 206,800 · 남 466,598 = 받기 1 범위 + 600 m** · 새 범위면 서 204,958 · 남 465,962 ✗ | `_derived/sheet_route/bc53fb34….json` 지물 상자 셈 · 로그 1598041 | +| 17:35:46 | 급경사 저장본 새로(새 DEM 지문 ✓) · **지형면 격자(`smooth_grid.bin`) 이때 끝 → `have` 새 값은 그 뒤** | `_derived/plan_slope` · `models_plan/dtm_sheet_laplace_smooth_grid.bin` | +| 17:41:33 | 음영 새로(뒤에 켬 = 새 범위 ✓) | `_derived/plan_hillshade` | +| 17:43:31 | 세류 표시본 처음(뒤에 켬 = 새 범위 ✓) — 17:35 에는 요청 안 감(꺼져 있던 것으로 봄) | `도엽_하천중심선.display.geojson` | + +- 오류 · 실패 줄 없음 · 지적 · WFS 겹은 이 시간대 안 켬. +- 596-4 「범위 늘린 뒤 등고 · 세류 새로」 검증 통과 = 새로 열기 길(`UI_Page.ts:629-631` 차례대로)로 본 것으로 추정 — 받기 끝 길은 격자 셈(약 5 s) 때문에 겹 쪽이 거의 늘 먼저. + +## 2. 겹마다 표 + +범례 — 판정 = 화면 `load()` 「바뀜」(`UI_Layers.ts:549-567` · 받은 범위 문자열 ∨ 위성 틀) · 같은 도엽 = 범위가 같은 5천 도엽 안에서 늚 · 새 도엽 = 위성 틀 바뀜. + +| 겹 | 출처 · 길 | 범위를 정하는 값 | 서버 다시 받기 열쇠 | 받은 범위 밖 지점(지금) | 지점 지움 | +| --- | --- | --- | --- | --- | --- | +| 위성 | 브이월드 조각 `plan/tile/{z}/{x}/{y}`(`Router.py:505-545`) | 화면(조각 번호 · 끝없음) · 위성 틀 = 받은 도엽 도곽(지도 맞춤 틀만 · `Terrain.py:223-262`) | 조각 파일 `_derived/plan_tile` | ✓ 바로 보임 | 그대로 | +| 음영 | DEM 파생 `layers/raster?kind=hillshade`(`Layers.py:255-281`) | 받은 DEM | npz 지문 | 같은 도엽 ✗ · 새 도엽 ✓ | 그대로 | +| 등고선(계곡선 25 m 굵게 = 같은 겹) | 도엽 병합 · B04 `/geojson?layer=도엽_등고선&scope=route&bbox=` + 브라우저 보관함(`UI_Layers.ts:323-359` · `Router_GIS.py:182-188` · `SheetClip.py:161-184 · 234-268`) | **화면이 보낸 상자**(`opts.have()` · 모르면 지점 ± 600 m) + 600 m | 사본 지문 + 상자 · 주소 `&v=` 범위 지문 | **✗ 옛 상자로 잘림(실측)** · 같은 도엽이면 다시 받기조차 없음 | 그대로 | +| 세류 · 하천 | 도엽 병합 · B04 `/geojson?layer=도엽_하천중심선` + 보관함(`UI_Layers.ts:360-366`) | 병합 도엽 통째 | 주소 `&v=` 지문(= 옛 범위) | **✗ 같은 주소 = 보관함 옛 파일**(`b_asset_cache.ts:310-321` · 뒤에서 갱신만 · 그림 안 바뀜) | 그대로 | +| 급경사(1 % 값 그림 · 603) | DEM 파생 `layers/raster?kind=slope`(`Layers.py:215-237 · 255-281`) | 받은 DEM | npz 지문 | 같은 도엽 ✗ · **새 도엽 ✓(실측)** | 그대로 | +| 0차곡 | DEM 파생 `layers/zero-order`(`ZeroOrder.py:127-183`) | 받은 DEM | npz 지문 + 임계 | 같은 도엽 ✗ · 새 도엽 ✓ | 그대로 | +| 물 면 · 도로 · 임도 짐작 · 건물 · 지명 | 도엽 병합 `layers/sheet?key=`(`Router.py:293-306` · `Layers.py:84-98`) | 병합 도엽 통째(받은 범위로 안 자름) | 파일 ETag | 같은 도엽 ✗ · 새 도엽 ✓ | 그대로 | +| 지적 | WFS LX 1 km 조각(`Layers.py:178-209`) · 켤 때만(595-1) | 받은 범위(`_layer_root` `Router.py:284-290`) | 곁 열쇠 상자 덮음 · 실패 조각 | 같은 도엽 ✗ · 새 도엽 ✓(늘면 상자 통째 다시) | 그대로 | +| 보호구역(여덟 종) | WFS(`Layers.py:368-404`) | 받은 범위 | 곁 열쇠 상자 · 판 | 같은 도엽 ✗ · 새 도엽 ✓ | 그대로 | +| 산림입지(토양) | WFS(`Layers.py:455-471`) | 받은 범위 | 곁 열쇠 상자 · 판 | 같은 도엽 ✗ · 새 도엽 ✓ | 그대로 | +| 단층 · 지질구조선 | WFS(`Layers.py:515-532`) | 받은 범위 | 곁 열쇠 상자 · 판 | 같은 도엽 ✗ · 새 도엽 ✓ | 그대로 | +| 산사태위험지도 | 행안부 WMS(`Landslide.py:99-124`) | 받은 범위 | 저장 상자 덮음 | 같은 도엽 ✗ · 새 도엽 ✓ | 그대로 | +| 산사태취약지역 | 시도 표 + 지적 필지(`Router.py:474-486` · `LandslideZone.py:240-261`) | 받은 범위 | 상자 + 재료 지문 | 같은 도엽 ✗ · 새 도엽 ✓ | 그대로 | +| 띠(계류 100 · 도로 300 m) | 도엽 하천 · 도로 + 받은 범위(`Layers.py:592-616`) | 받은 범위 | 두 파일 지문 + 상자 | 같은 도엽 ✗ · 새 도엽 ✓ | 그대로 | +| 올린 임도망 | 올린 zip(`ForestRoad.py:50-56 · 172-185`) | 기준점 ± 5 km ∪ 받은 범위 | 원본 지문 + 상자 + 기준점 | 같은 도엽 ✗ · 새 도엽 ✓ | 그대로 | +| 지형면(길이 · 기울기 · 3D) | `fetchPlanSurface`(`Api.ts:171-180` · 주소에 파일 지문) | 받은 DEM | 파일 지문 | ✓ | 그대로 | +| 임상 · 계곡(따로) | 겹 없음 — 계곡선은 등고선 겹 안 | — | — | — | — | + +- 받은 범위 = 늘기만(`Terrain.py:106-112` 점 상자 + 350 m ∪ 받은 범위) · 줄임 = 위치 멂 · 다른 띠 `reset` 때만(`Router.py:233-242`). +- 지움 = 걸음(`UI_Page.ts:287-299`) → `ensureCovered` → 범위 안 → 그침(`:351-359`) → 겹 · 범위 그대로. +- 기준점 10 km 밖 지점 · 선 = 조용히 뺌 · 알림 없음(`UI_Terrain.ts:19 · 51-57`) → 그 자리 겹 영영 없음. + +## 3. 까닭 + +| # | 까닭 | 근거 | 보이는 꼴 | +| --- | --- | --- | --- | +| 1 | **받기 끝 경합** — `loadSurface`(목록 GET → 격자 8~12 MB · 첫 읽기 땐 서버가 격자 셈 약 5 s → 범위 GET → 그제야 `have`)와 `backdrop.load`(위성 틀 GET 하나 → `opts.have()`)를 동시에 | `UI_Page.ts:454 · 470-478` · `UI_Layers.ts:549-557` | 겹이 늘 옛 범위로 판정 | +| 1-가 | 같은 도엽 안에서 늚 → 범위 문자열 같음 + 위성 틀 같음 = 「바뀜 없음」 → 켠 겹 아무것도 안 다시 받음 · `loadedHave` 도 옛 값 | `UI_Layers.ts:552-557` | 급경사까지 모두 옛 범위(받기 1) | +| 1-나 | 새 도엽 → 위성 틀 바뀜 → 다 비우고 다시 받음 · 서버가 범위 정하는 겹은 새 범위 · 등고선 상자 · 세류 · 등고 `&v=` 지문은 옛 `have` | `UI_Layers.ts:323-366` | **급경사 = 지형면 다 된 뒤 나옴(「어느 정도 있다가」) · 등고 · 세류 = 옛 범위** | +| 2 | 끝난 뒤 다시 판정하는 곳 없음 — `follow` 끝 `ensureCovered` = 범위 안 → 그침 · 새로 열 때까지 그대로 | `UI_Page.ts:456` | 새로고침하면 맞음 | +| 3 | 받기 도는 동안 켠 겹 = 서버 옛 범위(`plan_terrain.json` 은 일 끝에 씀) · 그 답이 비운 뒤 오면 다시 채움(`fetchLayer` 가 안에서 바로 `data` 씀 · 새 받기가 옛 `pending` 을 그대로 씀) | `Terrain.py:301-305 · 329-333` · `UI_Layers.ts:257-281` | 드물게 옛 범위 겹이 남음 | +| 4 | 되돌리기 · 다시하기는 영역 확인 안 부름 | `UI_Page.ts:305-321` | 드묾(범위는 늘기만이라 거의 덮음) | +| 5 | 기준점 10 km 밖 지점 = 알림 없이 안 받음 | `UI_Terrain.ts:51-57` | 「찍었는데 아무 겹도 없음」 | + +## 4. 제안 — 영역 루틴 + +### 4-1. 흐름(사건 하나 → 길 하나) + +``` +사건: 지점 추가 · 옮김 · 지움 · 선 긋기 · 고침 · 위치 바꿈 · 되돌리기 · 다시하기 · 처음 열기 · [다시 받기] · (복제 = 처음 열기) + → ensureCovered() 지금 그대로 한 곳 · 되돌리기 · 다시하기도 부름 + 받을 점 = 기준점 10 km 안 지점 · 선(밖 = 위치 칸 알림 한 줄) + 받은 범위가 덮음 → 끝 + → download() → 서버 POST plan/terrain(늘림만 · 멂 · 다른 띠 = 물음 → reset) + → 서클로 지켜봄(진행 1 s · 끝 = 알림 대신) + → applyArea() follow 의 끝 몫 + ① loadSurface() — 지형면 + 받은 범위(have) 먼저 + ② backdrop.load(have) — 값을 넘김(겹이 스스로 안 읽음) + 겹: 받은 범위 지문 바뀜 → 차례 번호 +1 · 자료 비움 · 켠 겹 모두 다시(꺼진 겹 = 켤 때) + 옛 차례 답 = 버림 · 범위는 서버가 받은 범위로 정함 · 안 바뀐 것 = 304 · 저장본 + ③ ensureCovered() — 받는 동안 늘어난 점 +``` + +### 4-2. 겹 묶음(코드 등록부 없이 규칙 하나 · 표는 문서로) + +| 묶음 | 겹 | 출처 | 범위 규칙(서버) | 다시 받기 조건(서버 열쇠) | +| --- | --- | --- | --- | --- | +| 조각 | 위성 | 브이월드 조각 | 화면 조각 | 조각 번호 | +| 도엽 | 등고 · 세류 · 물 면 · 도로 · 임도 짐작 · 건물 · 지명 | 받은 도엽 병합 | **받은 범위로 자름(권함 · 지금 등고만 화면 상자 · 나머지 통째)** | 파일 ETag · 사본 지문 + 상자 | +| DEM | 급경사 · 음영 · 0차곡 | 받은 DEM | 받은 DEM | npz 지문 | +| 외부 | 지적 · 보호 · 입지 · 단층 · 구조선 · 산사태위험 | WFS · WMS | 받은 범위 | 곁 열쇠 상자 덮음 | +| 엮음 | 띠 · 산사태취약 | 도엽 · 지적 + 표 | 받은 범위 | 재료 지문 + 상자 | +| 올린 파일 | 임도망 | 올린 zip | 기준점 ± 5 km ∪ 받은 범위 | 원본 지문 + 상자 + 기준점 | + +- 화면 규칙 = 하나(받은 범위 지문 바뀜 → 켠 겹 모두 다시) · 겹마다 조건을 화면에 두지 않음 — 서버가 안 바뀐 것은 그대로 돌려줌(값쌈). +- 코드 등록부(겹마다 출처 · 조건 칸) = 겹마다 다른 조건이 생길 때(지금 없음). + +### 4-3. 걷을 곳 · 모을 곳 + +| 자리 | 지금 | 고침 | 크기 | +| --- | --- | --- | --- | +| `UI_Page.ts:454` `follow` | 지형면 ∥ 겹 동시 | `await loadSurface(); await backdrop.load(have);` 차례대로 · 값 넘김 | 두 줄 | +| `UI_Page.ts:305-321` 되돌리기 · 다시하기 | 영역 확인 없음 | 끝에 `void ensureCovered()` | 두 줄 | +| `UI_Terrain.ts:51-57` `nearSite` · Page 알림 | 10 km 밖 조용히 뺌 | 뺀 수 돌려줌 → 위치 칸 알림 「기준점 10 km 밖 지점 N곳 — 지형 안 받음 · 위치를 옮기세요」 | 다섯 줄 남짓 | +| `UI_Layers.ts:128 · 549-567` `opts.have` · `load()` | 겹이 스스로 `have` 읽음 · 위성 틀 · 범위 문자열 판정 | `load(have)` 인자 · 바뀜 = 차례 번호 +1 · `pending` 비움 | 열 줄 남짓 | +| `UI_Layers.ts:257-281 · 330-526` `ensure` · `fetchLayer` | 갈래마다 바로 `data` · `gl.setData` 씀 | 받기 시작 때 자료 그릇을 잡아 그 그릇에만 씀 · 그릇이 바뀌었으면 `gl.setData` 안 함 · `pending` 지움은 제 일일 때만 | 기계적 바꿈 | +| `UI_Layers.ts:96 · 125-128 · 322-366` 등고 · 세류 | B04 길 + 화면 상자 + `&v=` 지문 + 보관함 | (권함) `fetchPlanSheetLayer` 로 — `CONTOUR_PAD_M` · `points` 인자 · `haveTag` · `sheetLayer` 걷음 | 줄어듦 | +| `Router.py:293-306` `plan_layer_sheet` | 병합 통째 | 받은 범위로 자른 사본(B04 `clipped_sheet` 재사용) | 다섯 줄 남짓 | +| `UI_Layers.ts:575-590` 검증 창구 | 켬 · 받음 · 수 | `area`(겹이 받은 범위) 덧 — ORCA 판정용 | 한 줄 | + +- 서버 받기 범위 · 늘림 정책 · 받기 일 = 고칠 것 없음(`Terrain.py:106-112` · `Router.py:219-266`). +- 받기 끝 알림 = 화면 진행 읽기(`UI_Terrain.ts:69-94`)로 충분 · 밀어 주기 길 안 만듦. + +### 4-4. 지운 지점 영역 + +| 갈래 | 내용 | 걸림 | +| --- | --- | --- | +| **가(권함) 그대로 둠** | 받은 범위 · 겹 · storage 그대로 · 다시 그 자리 = 안 받음 | 범위가 커진 채 남음(다음 받기 DEM 통째 셈 시간이 그만큼) | +| 나 줄임 | 지운 뒤 남은 지점 · 선 + 기준점 ± 1 km 로 `reset` 받기(길 있음 `Terrain.py:290 · 302 · 305`) | DEM 통째 다시 셈(수십 초~수 분) · 도엽 · 위성 · WFS 파일 다시 씀 = Synology 로 데스크탑 번짐 · 되돌리기 = 다시 받기 · 지울 때마다 서클 | + +- 줄이기가 꼭 필요해지면 위치 칸 [범위 다시 정하기] 단추 하나로 손으로(지금은 안 만듦). + +## 5. 파일 경계 · 시험 + +| 창 | 맡음 | 파일(이 창만) | +| --- | --- | --- | +| **한 창(권함)** | 4-3 모두 · 시험 | `D03_PlanAnalysis_UI_Page.ts` · `D03_PlanAnalysis_UI_Layers.ts` · `D03_PlanAnalysis_UI_Terrain.ts` · `D03_PlanAnalysis_Api.ts` · `D03_PlanAnalysis_Router.py` · 새 시험 하나 | +| 나눌 때 창 1 화면 | Page · Layers · Terrain(UI) · Api | 위 넷 · 이음 = 창 2 push 뒤 등고 · 세류를 `layers/sheet` 로 | +| 나눌 때 창 2 서버 | `plan_layer_sheet` 받은 범위 자름 | `D03_PlanAnalysis_Router.py` · 시험 서버 몫 | + +- 줄 수 — Page 647 · Layers 591 → 덧 작음(700 안). +- 재현 시험(새 `resources/tester/test_475_plan_area_refresh.py`) + - 서버 — 임시 프로젝트 · 받은 범위 A → B 로 바꿈 → 도엽 겹(등고 포함) 자른 사본 상자 ⊆ B 덧 · 지적 · 보호 · 입지 · 선(`fetch_tile` 가짜) 요청 상자 = B · 띠 · 임도망 열쇠 상자 = B · 급경사 · 0차곡 = 새 npz 지문 → **모든 겹이 새 범위**. + - 화면 — `follow` 안 `loadSurface` 기다림이 `backdrop.load(` 앞 · `load` 가 `have` 인자를 받음 · `fetchLayer` 쓰기가 그릇 검사를 거침(글 대조 · 584_3 꼴). + - 돌림 = `./venv/Scripts/python.exe -m pytest resources/tester/test_475_plan_area_refresh.py -q` + 569_1 · 581_1 · 584_3 · 603. +- ORCA 확인(코더 · 자기 검증 D · `tmp/`) — 받은 범위 밖 같은 도엽 지점 · 새 도엽 지점 각각 → 받기 끝 → `__d03Plan.layers().area` = `__d03Plan.have()` · 켠 겹 열일곱 모두 다시 받음 · 등고 자료 상자 ⊇ 새 범위 · 받는 동안 겹 켬 → 끝난 뒤 새 범위 · 지점 지움 → 겹 그대로 · 10 km 밖 → 알림. + +## 6. 곁(이번 몫 밖 · 기록만) + +- 지적 = 범위가 늘면 상자 통째 다시 받음(늘어난 조각만 아님 · `Layers.py:183-191`) — 1~3 s · 늘린 몫만은 나중. +- 보관함에 옛 지문 주소 등고 · 세류가 범위마다 쌓임 — 4-3 등고 · 세류 길 바꿈이면 사라짐. +- 도엽 겹 범례 「받은 범위 안 수」가 지금은 병합 도엽 통째 수 — 4-2 도엽 자름이면 맞음. + +## 7. 사용자 결정 거리 + +1. 루틴 꼴 — **규칙 하나(받은 범위 지문 바뀜 → 켠 겹 모두 다시 · 범위는 서버)(권함)** / 겹마다 조건 등록부. +2. 지운 지점 영역 — **그대로 둠(가 · 권함)** / 줄임(나 · DEM 다시 셈 · Synology 번짐). +3. 등고 · 세류 받는 길 — **예정노선 겹 길로 모음 · 서버가 받은 범위로 자름(권함)** / 지금 길 그대로 · 화면이 받은 범위를 넘김. +4. 도엽 겹(물 면 · 도로 · 건물 · 지명 · 세류)도 받은 범위로 자름 — **자름(범례와 맞음 · 권함)** / 도엽 통째(지금). +5. 받는 동안 켠 겹 — **차례 번호로 옛 답 버림 · 끝나면 새로(권함 · 5장 「차례 번호 · 옛 요청 끊기」)** / 받는 동안 겹 받기 미룸. +6. 기준점 10 km 밖 지점 — **위치 칸 알림 한 줄(권함)** / 지금처럼 조용히 안 받음. +7. 되돌리기 · 다시하기 뒤 영역 확인 — **같은 루틴 부름(권함)** / 안 부름(지금). +8. 창 — **한 창(권함 · 고칠 곳 작음)** / 화면 · 서버 둘. diff --git a/docs/raw/요구_1025/_분석_477_수치지형도_화면맞춤.md b/docs/raw/요구_1025/_분석_477_수치지형도_화면맞춤.md new file mode 100644 index 000000000..b7f6b96ce --- /dev/null +++ b/docs/raw/요구_1025/_분석_477_수치지형도_화면맞춤.md @@ -0,0 +1,228 @@ +# 분석 477 — 수치지형도를 위성처럼 「보는 화면에 맞춰」 받기 (요구 477) + +읽기 전용 · 줄 = main_laptop_1 `387403fe4` · 코드 · DB · storage 안 고침 · 서버 POST 없음. +실측 = 검증_랩탑메인_D `e50c92f5`(도엽 2매 `36901074` · `36901075` · 메모리 안에서만 셈 · 파일 안 씀) · 서버 로그 `tmp/server.log`(시각 없음 · 단계 시간 줄만) · storage 파일 크기 · 전국 등고선 gpkg 읽기만. +겹마다 받는 범위 · 다시 받기 · 영역 루틴 = `_분석_475_영역_겹_루틴.md` 몫(여기서 안 다룸). + +## 0. 결론 + +1. **됨 — 「도엽 한 장 = 한 조각」**. 위성 조각처럼 화면에 보이는 도엽만 받고 · 한 번 만든 조각은 다시 안 셈 · 같은 도엽은 프로젝트끼리 함께 씀. +2. 지금 느린 까닭 = 도엽이 아니라 **범위 통째 다시 셈**(병합 = 모든 도엽 · 모든 겹 다시 · DEM = 범위 전체 라플라스). 도엽 한 장 일은 작음 — 선 겹 = 받기(1.2~1.4 MB) + 풀기 0.8~1.2 s · DEM 조각 = 2 m 장당 55~63 s · 5 m 6.7 s(4 장). +3. **큰 발견 — 노트북에 전국 등고선 gpkg(국가기본도 · 23 GB · 188만 가닥 · 5 m 간격)가 이미 있고 도엽 등고선과 똑같음**(도엽 074 안 길이 504.6 km = 504.6 km · 단 119 = 119 · 같은 높이 선 사이 거리 0 m). 도엽 넓이 잘라 읽기 0.4 s → **등고선 · DEM 은 브이월드 받기 없이 됨**. 단 데스크탑(임시 배포)에 이 파일이 있는지 확인 못 함 · 하천 · 도로 · 건물 · 지명은 gpkg 에 없음(도엽 zip 필요). +4. 노선 계산(지반고 · 기울기 · 예상 횡단 · 3D)은 **조각을 이어 붙인 DEM 한 벌**을 지금 자리(`models_plan/dtm_sheet_laplace.npz`)에 두면 코드 그대로 · 격자를 좌표 2 m 배수에 맞추면 이어 붙이기 = 복사(다시 셈 없음) · 경계 품질 실측 = 여유 0 이면 계단 최대 3.45 m · **여유 250 m 면 계단 0 · 경계 곁 0.5 m 넘는 칸 1 개**(4 장). +5. B 영향 0 — D 전용 모듈이 B04 함수를 「다른 창고 자리 · 도엽 하나」로 부름(B04 파일 안 고침). +6. 외부 등고선 · DEM 조각 — 브이월드 WMTS 는 다섯 종(Base · white · midnight · Hybrid · Satellite)뿐 · 등고선 · DEM 없음 · WFS 등고선 겹 = 확인 못 함. +7. 단계 권함 = ① 공용 창고 + 선 겹 조각(화면 맞춤) → ② DEM 조각(급경사 · 음영 · 0차곡 · 노선 DEM 이어 붙이기) → ③ 줌아웃 듬성 판 · 창고 정리. + +--- + +## 1. 지금 흐름 + +| 단계 | 단위 | 자리 | 근거 | 실측 | +| --- | --- | --- | --- | --- | +| 범위 | 기준점 ± 1 km · 지점 · 선 상자 + 여유 350 m ∪ 받은 범위(줄지 않음) · 칸 상한 500만 | `plan_terrain.json` | `D03_PlanAnalysis_Terrain.py:54-60 · 106-112` | 이 D = 2.0 × 2.0 km(100만 칸) | +| 도엽 고름 | 상자에 닿는 1:5,000 도엽 모두 | — | `Terrain.py:143-155` | 2매 | +| 도엽 받기 | 한 장씩 차례 · 없는 것만 · 로그인 세션 | **프로젝트마다** `processed/map_sheets/<번호>.zip` + 색인 json 하나 | `B04_PreProcess_Engine_SheetStore.py:58-64 · 146-201 · 209-230` | zip 1.17 · 1.42 MB · 검색 94 ms · 받기 매당 1~3 s(어림 · `_분석_463-C` 18-1) | +| 병합 | 도엽 묶음이 바뀌면 **모든 도엽 × 13 겹** 다시 읽어 겹마다 한 파일 | `processed/도엽_<겹>.geojson` | `Terrain.py:209-220` · `SheetParser.py:81-139` | 2매 = 등고선 15.8 MB(표시본 8.8 MB · 압축 2.35 MB) | +| DEM | **범위 통째** — 등고 굽기 → 거리 보간(높이 단마다 거리장) → 라플라스 400 회 → npz + 미리보기 glb 2 + 평활 npz | `models_plan/` | `Terrain.py:307-323` · `SheetSurface.py:490-574 · 341-388` · `SheetMethods.py:55-132` | 이 D = 29 MB(glb 10 MB × 2) | +| 다시 셈 열쇠 | 병합 등고선 파일 수정시각 · 크기 → 도엽 하나 늘면 전체 다시 | `.key.json` | `SheetSurface.py:428-459` | 로그: 77만 칸 18.6 s → 153만 54.5 s → 533만 **383.7 s** | +| 급경사 · 음영 | DEM 한 장 → 그림 한 장(한 변 4,096 px 넘으면 솎음) | `_derived/plan_slope` | `D03_PlanAnalysis_Layers.py:71 · 215-281` | 168 KB · 0.41 s(`_분석_463-C`) | +| 0차곡 | DEM 한 장 D8 | `_derived/plan_zero_order` | `D03_PlanAnalysis_ZeroOrder.py:127-183` | 3.0 s(2.1 km²) | +| 화면 선 겹 | 받은 범위 통째 GeoJSON 한 벌(등고선 · 세류 · 도로 …) | MapLibre geojson 소스 | `D03_PlanAnalysis_UI_Layers.ts:341-367` · `ui_template_gl_map.ts:100-110` | — | +| 화면 위성 | 화면 조각만 · 서버 대리 · 프로젝트별 기억(150 MB · 오래 안 본 것부터) | `_derived/plan_tile` | `D03_PlanAnalysis_Router.py:505-545` · `ui_template_gl_map.ts:58-66` | 604 KB | +| 화면 노선 계산 | 평활 DEM 격자 한 벌 → `gridHeightAt` | 브라우저 | `D03_PlanAnalysis_Api.ts:171-179` · `UI_Page.ts:123 · 472` | 격자 4.1 MB | +| 조용히 받기 | 지점 · 선이 받은 범위 밖일 때만 · 보기만 옮김 = 안 받음(596-4) | — | `D03_PlanAnalysis_UI_Page.ts:349-358` | — | + +- 프로젝트마다 따로 받음 → storage 전체 도엽 zip **212 개 265 MB 중 서로 다른 도엽 37 장 48.5 MB**(82 % 겹침 · 복제 검증 프로젝트 탓) · 병합 겹 파일 530 개 **2.19 GB** · D DEM 파일 126 개 757 MB. + +## 2. 「도엽 조각」 설계 + +### 2-1. 조각 단위 + +| 겹 | 조각 하나 = | 이웃 여유 | 꼴 | 화면 | +| --- | --- | --- | --- | --- | +| 선 · 면 · 점 겹 13(등고선 · 하천 · 도로 · 건물 · 물 면 · 지명 …) | 도엽 한 장 그대로(`parse_and_merge_sheets(창고, [번호], …)` = 한 장 병합) · 자릿수 줄인 표시본 | 없음(도곽 걸친 지물은 UFID 로 화면에서 거름) | GeoJSON(도엽 · 겹마다 파일) | 겹마다 소스 하나에 도엽 지물을 더함(MapLibre 5.24 `updateData` · 지물 id) | +| DEM | 도엽 도곽(경위도 직사각형)을 덮는 TM 격자 · 좌표 2 m 배수에 맞춤 | 등고선 = 자기 + 이웃 8 장(있는 것만) 여유 안 · 4 장 실측으로 여유 값 | npz(z float32 · 유효) | 보이지 않음(아래 셋의 원료) | +| 급경사(603 값 그림) | 그 DEM 의 **자기 도곽 안 칸만**(밖 = 빈 칸 255) · 1 % 칸 수(`counts`) | DEM 여유로 가장자리 기울기 맞음 | 회색 PNG + 칸 수 | 도엽마다 image 소스(네 귀퉁이) · 칠하기는 지금대로 화면 · **칸 수는 도엽끼리 더하면 그대로 합**(겹침 없음) | +| 음영 | 같은 DEM · 자기 도곽만 | 〃 | 투명 PNG | 도엽마다 image 소스 | +| 0차곡 | 같은 DEM D8 → 선 · 자기 도곽으로 자름 | 집수 1 ha 안쪽 → 여유 안에서 끝남(어림) | GeoJSON | 선 겹과 같은 길 | + +### 2-2. 창고(프로젝트끼리 함께 씀) + +| 칸 | 권함 | +| --- | --- | +| 자리 | `storage/_shared/sheets/<도엽번호>/` — zip · 색인(그 도엽 하나만) · `layers/` · `dem_2m.npz` · `slope.png` · `hillshade.png` · `zero.json` · `key.json` · 도엽마다 폴더 = B04 `ensure_sheets(store_dir, [번호])` 를 **도엽 폴더를 창고로 주고** 그대로 부름 → 색인 json 한 파일을 여러 서버가 같이 고치는 다툼 없음 | +| 지문 | zip sha1 · 파서 판(`PARSER_VERSION`) · 계산 판 · 격자 · 여유 · **쓴 이웃 zip 목록과 sha1** — 이웃이 나중에 오면 그 도엽 DEM 만 다시(가장자리 바로잡음) | +| 겹침 막기 | 도엽 폴더 `.lock`(만들기 독점) — 서버 여럿(8000 · 8001 …)이 storage 하나(정션)를 같이 씀 · 쓰기 = 임시 파일 → 바꿔 넣기 | +| Synology 번짐 | 창고도 storage 안 → 데스크탑으로 번짐(데스크탑은 받기 · 셈 안 해도 됨 = 이득) · 두 PC 가 같은 도엽을 같은 때 만들면 충돌 사본 생길 수 있음(내용은 같음) | +| 용량 | 도엽 한 장 ≈ zip 1.3 + 겹 표시본 ≈ 5 + DEM ≈ 4~6 + 그림 0.2 ≈ **11~13 MB** · 지금 37 장 ≈ 0.45 GB(지금 겹 파일만 2.19 GB) · 정리 = 위성 기억과 같은 「오래 안 본 것부터」(`common_util_tile_cache` 재사용) · zip 은 남기고 파생만 지움 | +| 지움 | 프로젝트 영구 삭제(요구 455)는 창고를 안 지움 | +| 옛 자료 | 프로젝트 `map_sheets/*.zip` 을 창고로 한 번 모음(운영 · 같은 번호는 sha1 비교) | + +### 2-3. 화면 흐름(위성과 같은 꼴) + +| 차례 | 하는 일 | 자리 | +| --- | --- | --- | +| 1 | 보기를 멈춘 뒤(0.8 s) 화면 경위도 상자 → `GET …/plan/sheets?bbox=` → 보이는 도엽 목록 + 상태(다 됨 · 선만 · 없음) | 서버가 번호 셈(`latlon_to_sheet5k` · TS 짝 안 만듦) | +| 2 | 없는 도엽만 `POST …/plan/sheets` — 일 하나(지금 `_start_job` 꼴) · 화면 가운데 가까운 차례 · 새 목록이 오면 아직 안 한 도엽은 버림 | `Router.py:147-175` 꼴 | +| 3 | 서버: 도엽마다 ① zip(창고에 없으면 받기) → ② 겹 풀기 = **선 겹 다 됨**(약 2~4 s) → ③ DEM · 급경사 · 음영 · 0차곡 = **다 됨**(4 장 시간) | 새 D 모듈 | +| 4 | 화면: 진행 GET 에 도엽별 상태 → 다 된 도엽부터 받아 얹음(선 → 그림 차례) | `UI_Layers.ts` | +| 5 | 진행 서클 = 요구 476 의 위치 칸 서클 그대로 · 글 「도엽 3/8」 | `UI_Page.ts` | +| 6 | 브라우저 보관 = 지금 `fetchCachedJson`(지문 = 조각 key) · 서버 = ETag 304 · 압축 GZip(`main.py:336`) | — | + +### 2-4. 선 겹 꼴 — GeoJSON 조각 대 MVT + +| 칸 | **GeoJSON 도엽 조각(권함)** | MVT(서버 벡터 조각) | +| --- | --- | --- | +| 지금 코드 | 그대로 — `gl.setData` · 옛 캔버스 대체 길(`prepareLayer`) · 등고 간격 고르기(`pickLevelStep`)가 지물을 씀 | 새 소스 꼴(`ui_template_gl_map.ts:100-110` 에 vector 없음) · 캔버스 대체 · 간격 고르기 · 누름 찾기 못 씀 | +| 서버 | 도엽 한 장 = 파일 하나 · 한 번 만들고 끝 | 줌마다 조각 셈 · `mapbox_vector_tile` 안 깔림 · GDAL MVT/PMTiles 드라이버는 있음(`_분석_445-B` 4 · 89) · 줌별 줄임 규칙 정해야 함 | +| 크기 | 등고선 도엽 한 장 표시본 ≈ 4.4 MB · 압축 1.2 MB · 꼭짓점 15.8~19.1만 | 화면 조각만 · 줌아웃에 강함 | +| 맞는 때 | 화면 폭 ≈ 6 km(도엽 ≈ 12 장)까지 | 줌아웃에서 계곡선까지 보여야 할 때(나중) | + +### 2-5. 도엽 한 장 처리 시간(실측 · 메모리 안) + +| 일 | 074 | 075 | +| --- | --- | --- | +| zip 크기 | 1.17 MB | 1.42 MB | +| 등고선 겹 하나 풀기 | 0.20 s(453 가닥) | 0.16 s(459 가닥) | +| 13 겹 모두 풀기 | 0.83 s | 1.22 s | +| 등고선 GeoJSON(자릿수 그대로) · 압축 | 6.54 · 2.26 MB | 7.89 · 2.72 MB | +| 계곡선 몫(길이) | 20.2 % | 20.3 % | +| 전국 gpkg 에서 같은 넓이 잘라 읽기 | 0.44 s | 0.38 s | +| DEM 조각(2 m · 여유 0 / 100 / 250 m) | 36.6 / 54.3 / 60.9 s | 39.3 / 58.0 / 63.2 s | +| DEM 조각(5 m · 여유 100 m) | 6.7 s | — | + +## 3. 줌아웃 · 도엽 수 + +| 화면 폭(16:9) | MapLibre 줌(어림) | 보이는 도엽(평균 · 최악) | 등고 꼭짓점(장당 17만) | 브라우저 힙(어림 · 445-B 비례) | 판 | +| --- | --- | --- | --- | --- | --- | +| 1.5 km | 16 | 2 · 4 | 70만 | 0.1 GB | 다 받음 · 다 보임 | +| 3 km | 15 | 4 · 6 | 100만 | 0.2 GB | 〃 | +| 6 km | 14 | 8 · 12 | 200만 | 0.36 GB | 〃(위 한계 · 445-B 「큰 D」 169만 꼭짓점 실측과 비슷) | +| 12 km | 13 | 22 · 28 | 480만 | 0.9 GB | **새로 안 받음** · 받은 도엽만 · 계곡선만(1/5) · 그림 겹은 그대로 | +| 24 km | 12 | 69 · 72 | — | — | 선 겹 숨김 · 위성 · 받은 범위 테두리만 | +| 48 km | 11 | 243 · 253 | — | — | 〃 | + +- 도엽 한 장 = 2.22 × 2.77 km(6.16 km² · 위도 37°). +- 규칙 권함 = **보이는 도엽 12 장 이하일 때만 새로 받음** · 13~30 장 = 받은 것만 · 계곡선만 · 30 장 넘음 = 선 겹 숨김(이름표 「가까이 오면 보임」). +- 브이월드 도엽 받기 = 지도서비스 안쪽 길 · 로그인 세션(`SheetStore.py:6-13`) — 줌아웃마다 수십 장 자동 받기는 막아야 함(한 번에 12 장 상한). + +## 4. 노선 계산 · 도엽 경계 이음 + +### 4-1. 쓰는 곳 + +| 계산 | 지금 읽는 것 | 조각으로 | +| --- | --- | --- | +| 지반고 · 기울기 · 측점(화면) | 평활 DEM 격자 한 벌 `gridHeightAt`(`UI_Page.ts:123`) | 서버가 노선 · 지점 상자에 닿는 도엽 DEM 을 **이어 붙여** 지금 자리(`models_plan/`)에 씀 → 화면 코드 그대로 | +| 예상 횡단 | 같은 격자(`logic/D03_PlanAnalysis_Expect.ts:56 · 104`) | 〃 | +| 3D | 모델 행 미리보기 glb(`UI_3D.ts:88`) | 이어 붙인 DEM → B04 `_write_method_model`(glb · 평활본 · 행 · 지금과 같은 파일) | +| 급경사 · 음영 · 0차곡 | 범위 DEM 한 장 | 도엽 조각마다(2-1) | +| 0차곡 D8 | 범위 DEM | 도엽 DEM(여유 안 · 집수 1 ha 상한이라 이웃 밖까지 안 감 · 어림) | + +- 이어 붙이기 = 같은 2 m 격자점(좌표 2 m 배수)이면 배열 복사 · 수 초 안쪽(어림). 지금 격자 원점은 상자 귀(`SheetSurface.py:526-530` · 실수 좌표)라 맞추기를 D 쪽에서 상자를 2 m 배수로 깎아 넘김. +- 평활본 = 가우시안 σ 0.25 칸 + 보간 스플라인(s = 0 · `config_system_terrain.py:122-125`) → 거의 원본 · 이어 붙인 뒤 한 번 돌리면 지금과 같음. + +### 4-2. 경계 이음 품질 · 조각 시간(실측 · 074 | 075 동서 경계 · 2 m · 라플라스) + +방법 = 두 도엽 통째 DEM(지금 방식) 대 도엽마다 따로 셈(여유 M 안 이웃 등고선 포함) → 자기 도곽 칸만 이어 붙인 모자이크 · 비교 칸 = 경계 ± 200 m(남북 끝 300 m 뺌). + +| 셈 | 칸 | 높이 단 | 시간 | 경계 계단(이웃 칸 높이차 − 통째의 같은 차 · 최대 / p95) | 경계 ± 200 m 높이 차(평균 / 최대) | 급경사 등급(15 · 35 · 40°) 다른 칸 | +| --- | --- | --- | --- | --- | --- | --- | +| 통째(2매) | 310만 | 152 | **94.9 s** | — | — | — | +| 조각 M = 0 | 155만 × 2 | 126 · 151 | 36.6 · 39.3 s | **3.45 m / 1.36 m** | 0.012 / 9.00 m | 0.33 % | +| 조각 M = 50 m | 168만 × 2 | 127 · 151 | 46.5 · 50.2 s | 0.00 / 0.00 | 0.009 / 9.00 m | 0.06 % | +| 조각 M = 100 m | 181만 × 2 | 129 · 152 | 54.3 · 58.0 s | 0.00 / 0.00 | 0.009 / 9.00 m | 0.06 % | +| 조각 M = 250 m | 224만 × 2 | 132 · 152 | 60.9 · 63.2 s | 0.00 / 0.00 | **0.000** / 3.23 m | 0.02 % | + +- 여유 0 = 경계에 계단(최대 3.45 m) → **여유는 꼭 둠**. 50 m 부터 계단 0 · 칸 대부분(p95) 차 0 — 등고선이 칸을 막아 라플라스가 같은 값으로 모임. +- 남는 최대 차(9 m → 3.23 m) = 경계 곁 몇 칸뿐(평균 0.009 m) · 아래 4-3. +- 시간 — 첫 셈은 조각 합(2 × 55 s)이 통째(95 s)보다 조금 큼(여유 겹침) · 이득 = **다음부터 늘어난 도엽만** · 프로젝트끼리 다시 안 셈 · 다 된 도엽부터 보임. 도엽 한 장 2 m ≈ 1 분은 「화면 맞춤」으로 느림 → 격자 5 m(`_분석_463-C` 18-4 가 · 아직 2 m `config_system_terrain.py:143`) · 서버 다른 프로세스에서 2~4 장 동시. + +### 4-3. 경계 차 칸 수 · 5 m 시간(실측 · 다시 셈 · 통째 93.7 s) + +| 여유 | 경계 ± 200 m 칸(21.7만) 중 0.5 m 넘음 | 안쪽 전체 칸(210만) 중 0.5 m 넘음 | 최대 | 자리 | +| --- | --- | --- | --- | --- | +| 100 m | 361 칸(0.17 % · 0.14 ha) | 980 칸(0.05 %) | 9.00 m | 경계 동쪽 158 m · 높이 1,205 m = **봉우리** | +| 250 m | **1 칸** | 363 칸(0.02 %) | 3.23 m | 경계 서쪽 88 m · 598 m | + +| 격자 | 도엽 074 조각(여유 100 m) 칸 | 시간 | +| --- | --- | --- | +| 2 m | 181만 | 54.3 s | +| **5 m** | 29만 | **6.7 s**(8 배 빠름) | + +- 0.5 m 넘는 칸 = 봉우리 폐합 등고선이 여유 밖까지 이어져 조각 끝에서 링이 안 닫힘 → 마루 메움(`SheetSurface.py:279-338`)이 안 걸린 자국. 여유 250 m 면 경계 곁 1 칸. +- 판 — **여유 250 m 권함**(2 m 시간 +13 %) · 남는 차 = 칸 0.02 % · 노선 기울기 · 급경사 등급엔 안 보일 크기(등급 다른 칸 0.02 %). + +## 5. B 그룹 영향 · D 전용으로 감싸는 길 + +| B04 것 | D 가 쓰는 법 | B 바뀜 | +| --- | --- | --- | +| `ensure_sheets` · `get_sheet_path` · `download_sheet`(`SheetStore.py:146-230`) | 창고 = 도엽 폴더(`_shared/sheets/<번호>/`)를 `store_dir` 로 · 목록 = 그 도엽 하나 | 없음 | +| `parse_and_merge_sheets`(`SheetParser.py:81-139`) | 도엽 하나 · 출력 = 도엽 폴더 `layers/` | 없음 | +| `sheet5k_to_bounds` · `latlon_to_sheet5k` · `neighbors_3x3`(`MapSheet.py:24-90`) | 번호 · 도곽 · 이웃 8 장 | 없음 | +| `_rasterize_contour_levels` · `_resolve_enclosed_interiors` · `_write_method_model`(`SheetSurface.py:219 · 279 · 341`) · `SHEET_METHOD_BUILDERS`(`SheetMethods.py:506`) | D 모듈이 불러 씀(밑줄 = 안쪽 함수) · 이름이 사라지면 깨지게 D 시험에 지킴 한 줄 | 없음 · B 가 이름을 바꾸면 D 시험이 알림 | +| `build_sheet_surface_model`(`SheetSurface.py:490`) | D 조각엔 안 부름 — glb 2 장(10 MB 씩) · 노선 상자 + 300 m · 격자 원점 실수 | 없음 | +| `prune_sheets`(`SheetStore.py:233`) | 창고엔 안 씀 | 없음 | +| `_display_copy`(`Router_GIS.py:392`) | 이미 D 라우터가 씀(`D03_PlanAnalysis_Router.py:296`) | 없음 | +| `crop_national_contours`(`GisVector.py:90`) | 갈래(전국 gpkg)일 때 같은 읽기 꼴만 본뜸 | 없음 | + +- `SheetSurface.py` = 690 줄(700 상한) → 새 함수 넣을 자리 없음 → D 모듈로. +- B(임도 설계)도 같은 창고를 쓰면 받기가 줆 — 이번 몫 아님. + +## 6. 외부 조각(브이월드 등) + +| 출처 | 등고선 | DEM | 근거 | +| --- | --- | --- | --- | +| 브이월드 WMTS | 없음 | 없음 | 공식 가이드 겹 = Base · white · midnight · Hybrid · Satellite 다섯(https://www.vworld.kr/dev/v4dv_wmtsguide_s001.do) · 키 필요 · 이용약관 본문은 그 쪽에 없음 · 코드 `B04_PreProcess_Engine_VWorld.py:134-152` | +| 브이월드 WFS | **확인 못 함**(공식 겹 목록에서 못 찾음 · 코드에 등고선 WFS 부름 없음) | — | 코드 WFS = 지적 `lt_c_landinfobasemap` · 보호구역 여덟 · 산림입지 `lt_c_fsdifrsts` · 단층 · 지질구조선(`D03_PlanAnalysis_Layers.py:4-18`) | +| 브이월드 도엽 받기(지금 길) | 있음 | 등고선으로 셈 | 지도서비스 안쪽 길 · 로그인 세션 · 캡차 없음(`SheetStore.py:6-13`) — 공식 오픈 API 아님 · 바뀔 수 있음 | +| **전국 등고선 gpkg(이미 있음)** | 있음 · 도엽과 같음(1 장 검증) · 도엽 넓이 0.38~0.44 s | 등고선으로 셈 | `resources/data_global_contours/national_contours.gpkg` — git 밖 · 23.2 GB · 188만 가닥 · EPSG:5179 · 국가기본도 `TN_CTRLN` · 변동일 2024-04-08 · 만든 스크립트 `build_contour_gpkg.py` · B 가 이미 「등고선」 겹으로 자름(`GisVector.py:90-130`) · 데스크탑 · 배포 서버에 있는지 확인 못 함 | +| 그 밖 DEM 조각(해외 지형 조각 등) | — | 확인 못 함 | — | + +## 7. 일 크기 · 단계 · 파일 경계 · 위험 · 결정 거리 + +### 7-1. 단계 + +| 단계 | 내용 | 크기 | 화면에 보이는 것 | +| --- | --- | --- | --- | +| **1** | 공용 창고(도엽 폴더) + 도엽 조각 선 겹 13 + `GET …/plan/sheets?bbox=` · `POST …/plan/sheets` · 조각 GET + 화면 「보기 멈춤 → 없는 도엽만 → 하나씩 얹음」 · 서클 · 12 장 상한 | 중간(서버 새 모듈 ≈ 250 줄 · 라우터 길 셋 · 화면 겹 받기 바꿈) | 지도를 옮기면 등고선 · 하천 · 도로 · 건물이 도엽 단위로 따라옴(장당 2~4 s) · 급경사 · 음영은 아직 받은 범위만 | +| **2** | DEM 조각(여유 250 m 권함 · 이웃 지문) + 급경사 · 음영 · 0차곡 도엽별 + 노선 DEM = 조각 이어 붙여 `models_plan/` · 범위 통째 셈 걷음 · 셈은 따로 프로세스 2~4 동시 | 큼 | 그림 겹도 따라옴 · 범위가 늘어도 늘어난 도엽만 셈 | +| 3 | 줌아웃 듬성 판(13~30 장 계곡선만 · 넘으면 숨김) · 창고 정리(오래 안 본 파생) · 옛 프로젝트 zip 모음(운영 한 번) | 작음~중간 | 줌아웃 때 안 멈춤 | +| 갈래 | 등고선 · DEM 원천 = 전국 gpkg(받기 0) · 하천 · 도로 등은 도엽 zip 그대로 | 작음(원천 바꿈) | 등고선 · 그림 겹이 받기 없이 곧바로 | + +- 2 의 속도는 격자 크기가 좌우 — 2 m 장당 ≈ 55 s · 5 m = 4-3 표. + +### 7-2. 파일 경계(창 둘~셋) + +| 창 | 파일(이 창만) | +| --- | --- | +| A 서버 조각 | 새 `D03_PlanAnalysis/D03_PlanAnalysis_Sheets.py`(창고 · 받기 · 겹 · DEM 조각 · 이어 붙이기) · `D03_PlanAnalysis_Terrain.py`(DEM = 조각 이어 붙이기로) · `D03_PlanAnalysis_Layers.py`(급경사 · 음영 도엽별) · `D03_PlanAnalysis_ZeroOrder.py` · `D03_PlanAnalysis_Router.py`(545 줄 · 길 셋) · 시험 새 `test_477_sheet_tiles.py` + `test_530_1` · `test_569_1` · `test_603` | +| B 화면 | `D03_PlanAnalysis_UI_Layers.ts`(591 줄 → 넘치면 새 `D03_PlanAnalysis_UI_SheetTiles.ts`) · `D03_PlanAnalysis_UI_MapGl.ts`(도엽 그림 소스 여럿) · `D03_PlanAnalysis_Api.ts` · `D03_PlanAnalysis_UI_Page.ts`(조용히 받기 → 보기 맞춤 · 서클) | +| (C 공용 · 작게) | `ui_template/ui_template_gl_map.ts` — 소스에 지물 더하기(`updateData`) · 더하기만(B04 · B05 · 배수유역 그대로) | + +- 차례 = A 가 길 꼴(목록 · 상태 · 조각 주소)을 `PLAN.md` 에 먼저 적음 → B · C 동시. 475 영역 루틴 몫과 `UI_Page.ts` · `UI_Layers.ts` 가 겹치면 한 창에 몰아 줌. + +### 7-3. 위험 + +| # | 위험 | 막는 길 | +| --- | --- | --- | +| 1 | 여유 없으면 경계 계단 최대 3.45 m | 여유 250 m(경계 곁 0.5 m 넘는 칸 1) · 이웃 없으면 있는 것만 · 이웃 오면 그 도엽 다시 | +| 2 | 폐합 등고선 안쪽 메움이 경계 곁에서 몇 m 다를 수 있음 | 4-3 칸 수 · 노선 DEM 은 노선 상자 안 도엽을 한 번에 통째 셈 갈래도 남김 | +| 3 | 브이월드 안쪽 길 자동 받기 양 증가 · 로그인 막힘 | 12 장 상한 · 보기 멈춤 뒤만 · 창고 공유로 같은 도엽 한 번 · 갈래 gpkg | +| 4 | 서버 여럿(8000 · 8001 …) · 두 PC(Synology)가 같은 도엽을 같이 씀 | 도엽 폴더 잠금 · 임시 → 바꿔 넣기 · 충돌 사본은 내용 같음 | +| 5 | 도엽 2 m DEM 장당 ≈ 1 분 · 같은 프로세스면 위성 조각 응답도 늦음 | 따로 프로세스 · 2~4 동시 · 5 m | +| 6 | 브라우저 메모리(장당 등고 꼭짓점 16~19만) | 12 장 상한 · 줌아웃 듬성 판 | +| 7 | 급경사 비율(603) 범위가 「받은 범위」 → 「도엽」으로 바뀜 = 화면 수치 바뀜 | 결정 거리 6 | +| 8 | 지금 D 들 열쇠 바뀜 → 다음 진입 때 창고를 한 번 채움 | 옛 zip 모으기(운영)로 받기는 없음 · 셈만 | +| 9 | 계산 자리 — 셈은 ③ 서버 단독 유지(브라우저는 얹기만) | 지침 5 장 그대로 | + +### 7-4. 사용자 결정 거리 + +1. 화면 맞춤 범위 — **선 겹 먼저(1 단계 · 권함)** / DEM 그림 겹까지 한 번에. +2. 같은 도엽 공용 창고 — **프로젝트끼리 함께 씀(권함)** / 프로젝트마다 그대로. +3. 자동 받기 — **보이는 도엽 12 장 이하일 때만 · 보기 멈춘 뒤(권함)** / 늘 / 누를 때만. +4. 줌아웃 — **13~30 장 계곡선만 · 30 장 넘으면 선 겹 숨김(권함)** / 늘 숨김. +5. 등고선 · DEM 원천 — **도엽 zip 그대로(권함 · 데스크탑 · 배포 서버에 gpkg 있는지 모름)** / 전국 gpkg(받기 0 · 23 GB 를 서버마다 둠). +6. 급경사 비율 범위 — **화면에 보이는 도엽 합(권함)** / 받은 도엽 모두. +7. DEM 격자 — **5 m(권함 · 장당 시간 4-3)** / 2 m 그대로(장당 ≈ 1 분). +8. DEM 이웃 여유 — **250 m · 이웃은 있는 것만 · 이웃 오면 그 도엽만 다시(권함)** / 이웃 8 장을 늘 받음(받기 늘어남). diff --git a/docs/raw/요구_1025/요구서_475_영역루틴_도엽조각_임도망목록.md b/docs/raw/요구_1025/요구서_475_영역루틴_도엽조각_임도망목록.md new file mode 100644 index 000000000..6260f8d59 --- /dev/null +++ b/docs/raw/요구_1025/요구서_475_영역루틴_도엽조각_임도망목록.md @@ -0,0 +1,38 @@ +# 요구서 475 — 예정노선 영역 따라 지도 표기 루틴 · 수치지형도 화면 맞춤(도엽 조각) · 올린 임도망 색 · 목록 · 받기 서클 자리 + +원문 = `사용자요구_1025.md` 요구 475 · 476 · 477 · 근거 분석 = `_분석_475_영역_겹_루틴.md` · `_분석_477_수치지형도_화면맞춤.md`. + +## 1. 요구 · 지금 · 고칠 것 + +| # | 요구 | 지금 (조사) | 고칠 것 | +| --- | --- | --- | --- | +| 475 | 받은 범위 밖 지점 → 급경사만 늦게 나오고 다른 겹은 안 나옴 · 영역 따라 표기 로직 루틴화 | 받기 끝 뒤 지형면 불러오기와 겹 다시 받기가 동시(`UI_Page.ts:454`) · 새 범위(`have`)는 약 5 s 뒤에야 바뀌어 겹은 옛 범위 · 같은 도엽 안에서 늘면 다시 받기 0 · 등고선 = 화면이 보낸 옛 상자 · 세류 = 옛 범위 꼬리표 캐시 · 재현(용화) 서쪽 1.9 km · 남쪽 0.7 km 등고선 없음 · 기준점 10 km 밖 지점은 조용히 안 받음 · 되돌리기 뒤 영역 확인 없음 | 영역 사건(지점 추가 · 옮김 · 지움 · 선 긋기 · 위치 바꿈 · 되돌리기 · 처음 열기)을 한 길(`ensureCovered`)로 · 새 범위 먼저 확정 → 범위 지문 바뀌면 켠 겹 모두 다시(차례 번호로 옛 답 버림) · 등고 · 세류 · 도엽 겹 = 서버가 받은 범위로 자름 · 10 km 밖 = 위치 칸 알림 한 줄 | +| 476-1 | 올린 임도망 주황이라 안 보임 · 올린 뒤 목록으로 고르기 · 지움 | 주황 · 한 벌 · 목록 없음 | 지도 전용 밝은 색 + 검은 테(600-1 꼴) · 위치 칸에 올린 묶음 목록(이름 · 가닥 수 · 길이 · 고름 = 지도 강조 · 맞춤 · 지움) · 여러 번 올리면 쌓임 | +| 476-2 | 조용한 받기도 서클로 알림 · 자리 = 위치 칸 제목 오른쪽 | 서클 = 지도 오른쪽 아래 · 지형 받기 때만 | 서클 자리 = 위치 칸 제목 오른쪽 · 지형 받기 · 겹 다시 받기 · 임도망 올리기 모두 서클 | +| 477 | 수치지형도도 위성처럼 화면에 맞춰 갱신 | 받은 도엽을 모두 합쳐 범위 통째 DEM · 도엽 한 장 일은 작음(13 겹 풀기 0.8~1.2 s · DEM 2 m 55~63 s) · 도엽 zip 212 개 중 서로 다른 도엽 37 장(82 % 겹침) · 노트북에 전국 등고선 gpkg(23 GB · 도엽 등고선과 같음) 있음 · 브이월드 WMTS 에 등고선 · DEM 없음 | 도엽 한 장 = 한 조각 · 같은 도엽은 프로젝트끼리 공용 창고 · 보이는 도엽만 받기 · 줌아웃 = 듬성 판 · 단계 셋(① 공용 창고 + 선 겹 조각 → ② DEM 조각 · 급경사 · 음영 · 0차곡 · 노선 DEM 이어 붙이기 → ③ 줌아웃 듬성 판 · 창고 정리) | + +## 2. 정함(브레인) — 사용자가 바꿀 수 있음 + +1. 루틴 꼴 = 규칙 하나(받은 범위 지문 바뀜 → 켠 겹 모두 다시 · 범위는 서버) · 겹마다 조건 등록부는 만들지 않음. +2. 지운 지점 영역 = 받은 자료 그대로 둠(줄이면 DEM 다시 셈 · 파일 지움이 데스크탑에 번짐). +3. 받는 동안 켠 겹 = 차례 번호로 옛 답 버림 · 끝나면 새로. +4. 기준점 10 km 밖 지점 = 위치 칸 알림 한 줄 · 되돌리기 · 다시하기 뒤 = 같은 루틴. +5. 올린 임도망 = 쌓임 · 묶음마다 줄 · 지움 = 그 묶음만 · 색 = 겹 색 · 노선 색과 안 겹치는 지도 전용 밝은 색 + 검은 테. +6. 도엽 조각 1 단계 = 선 겹만(등고 · 계곡 · 세류 · 물 면 · 도로 · 건물 · 지명) · 같은 도엽은 공용 창고 `storage/_shared/sheets/<도엽 번호>/` · 원천 = 도엽 zip(데스크탑 · 배포 서버에 gpkg 있는지 모름). +7. 자동 받기 = 보이는 도엽 12 장 이하 · 보기 멈춘 뒤 · 13~30 장 = 계곡선만 · 30 장 넘음 = 선 겹 숨김. +8. 2 단계(DEM 조각) 격자 = 2 m 그대로(요구 466) · 이웃 여유 250 m(경계 계단 0 실측) · 3 단계는 1 · 2 단계 뒤 다시 봄. + +## 3. 사용자 결정 + +1. 도엽 조각 2 단계(DEM 조각 · 급경사 · 음영 · 0차곡 · 노선 DEM)를 이번에 1 단계와 함께 할지 — **1 단계 먼저 · 2 단계는 1 단계 화면 보고 결정(권함)** / 한 번에. + +## 4. 배정안 (승인 뒤) + +| 절 | 창 | 모델 | 맡는 것 | +| --- | --- | --- | --- | +| 604 영역 루틴 · 서클 자리 | 한 창 | Opus high | 475 · 476-2 | +| 605 올린 임도망 색 · 목록 | 한 창 | Sonnet high | 476-1 | +| 606 도엽 조각 1 단계 | 한 창(604 들어온 뒤 화면 몫) | Opus high | 477 ① | + +- 같은 파일 몫 — `D03_PlanAnalysis_UI_Site.ts` = 604 제목 줄 서클 · 605 임도망 목록 블록 · `D03_PlanAnalysis_UI_Layers.ts` = 604 다시 받기 판정 → 606 이 그 위에 도엽 조각 · `D03_PlanAnalysis_Router.py` = 604 도엽 겹 자름 · 605 임도망 묶음 길 · 606 조각 길(함수 몫). +- 가이드(D03) = 사용자 지시 때 한 번에.