knowledge(요구): 요구서 486 전국 등고선 공용 지형 · 분석 셋 · 요구 490 원문 — PLAN 607~611 승인 대기 · 606 원천 바꿈

- 등고선 원천 = 전국 등고선 파일 · 도엽 zip = 빠진 곳 · 보조 겹만 · 정션 · 갱신 = 사용자
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015uTVHHDv583hbLQAFeBmd9
This commit is contained in:
2026-10-30 21:30:09 +09:00
parent 50f8d64da2
commit 661148719e
6 changed files with 608 additions and 0 deletions
@@ -0,0 +1,123 @@
# 대조 483 — 전국 gpkg 등고선 vs 도엽 zip 등고선 (요구 483)
읽기 전용 · 코드 · storage · DB 안 고침 · 계산 = 메모리 안 · 외부 받기 없음.
표본 도엽 3 장 = 용화 `6067750f` 의 `36901073` · `36901084`(EPSG:5187 · 산지) + 다른 지역 `4250c7bc` 의 `36712079`(EPSG:5186 · 평지 230~360 m).
gpkg 쪽 = 도곽(도엽번호 → 위경도 → 도엽 좌표계)을 5179 bbox 로 읽고 도엽 좌표계로 바꿔 도곽으로 자름(`crop_national_contours` 와 같은 꼴).
## 0. 결론
1. **해상도 문제 없음.** 두 원천은 같은 1:5,000 원도임. 꼭짓점 수 · 간격 · 총 길이 · 높이 단이 같음. 꼭짓점 99.7 % 이상이 1 mm 안에서 겹치고, 높이 짝은 100 % 맞음.
2. 차이는 셋뿐임. ① 도곽 가장자리 자르기(0.3~1.2 m · 도곽선 위만) ② gpkg 는 도엽을 넘는 이음매 없는 긴 선이라 가닥 수가 다름 ③ 다른 판의 국소 수정(36712079 에서 6 단 · 0.44 km / 132 km · 최대 22 m).
3. 지형면(2 m 라플라스) 차는 평균 0.005~0.05 m · 95 % 0.01~0.27 m. 같은 도엽 선을 **방향만 뒤집어도** 생기는 굽기 흔들림(평균 0.10 · 95 % 0.50 · 최대 9 m)보다 작음. 원천 탓이 아니고 굽기 코드 탓임.
4. 「해상도」 인상의 출처 후보는 화면임. B04 하단 지도의 「등고선」 겹(gpkg)만 서버가 0.00003° 로 단순화해 보냄. 꼭짓점이 12~18 % 만 남고 최대 3.3 m 어긋남(`B04_PreProcess_Router_GIS.py:190-209`). 도엽 겹은 원형 그대로 보냄(`:177-187`).
5. 도엽 zip 을 고른 까닭은 기록에 없음. 후보는 다른 겹과 한 벌 · 배포 서버의 gpkg 유무 모름 · 자동 받기가 이미 돎(5-2).
## 1. 도엽별 수치
| 항목 | 073 도엽 | 073 gpkg | 084 도엽 | 084 gpkg | 079 도엽 | 079 gpkg |
| --- | --- | --- | --- | --- | --- | --- |
| 가닥 수 | 495 | 196(자르면 502) | 470 | 223(540) | 142 | 88(150) |
| 꼭짓점 수(도곽 안) | 184,021 | 183,503 | 128,627 | 128,758 | 24,927 | 25,184 |
| 총 길이 km | 786.546 | 786.548 | 844.586 | 844.587 | 132.150 | 132.155 |
| 꼭짓점 간격 평균 · 중앙 · 95 % (m) | 4.29 · 2.91 · 12.7 | 4.28 · 2.91 · 12.7 | 6.59 · 5.25 · 16.3 | 6.55 · 5.22 · 16.2 | 5.33 · 3.85 · 14.6 | 5.24 · 3.77 · 14.5 |
| 높이 단 수 · 범위 (m) | 108 · 515~1050 | 같음 | 145 · 390~1110 | 같음 | 27 · 230~360 | 같음 |
| 5 m 배수 | 100 % | 100 % | 100 % | 100 % | 100 % | 100 % |
| 계곡선(25 m 배수) 몫 | 20.2 % | 20.3 % | 20.6 % | 20.9 % | 22.5 % | 21.3 % |
| 구분 | 주곡 395 · 계곡 100 | CTC002 153 · CTC001 43 | 주곡 373 · 계곡 97 | 176 · 47 | 주곡 110 · 계곡 32 | 69 · 19 |
| 간곡선 · 조곡선 | 0 | 0 | 0 | 0 | 0 | 0 |
| 읽기 시간 | — | 0.29 s | — | 0.35 s | — | 0.04 s |
| 기하 대조 | 073 | 084 | 079 |
| --- | --- | --- | --- |
| 도엽 꼭짓점 → gpkg 선 거리 평균 · 95 % · 최대 (m) | 0.0002 · 0.0002 · 0.33 | 0.0002 · 0.0002 · 1.15 | 0.015 · 0.0003 · 14.0 |
| 1 cm 넘는 도엽 꼭짓점 | 235(0.13 %) | 179(0.14 %) | 173(0.69 %) |
| gpkg 꼭짓점 → 도엽 선 평균 · 95 % · 최대 (m) | 0.0001 · 0.0002 · 0.12 | 0.0001 · 0.0002 · 0.03 | 0.089 · 0.0004 · 21.8 |
| 1 mm 안 같은 꼭짓점(도엽→gpkg · gpkg→도엽) | 99.71 % · 99.996 % | 99.73 % · 99.63 % | 98.79 % · 97.81 % |
| 높이 짝 일치(가장 가까운 선) | 100 % | 100 % | 99.99 %(1 cm 안 100 %) |
| 1 cm 넘는 자리 | 235 점 모두 도곽선 5 m 안 | 179 점 모두 도곽선 5 m 안 | 도곽 54 · 안쪽 119(국소 수정) |
## 2. 어디가 다른지
| 갈래 | 판정 | 근거 |
| --- | --- | --- |
| 단순화 | 없음 | 간격 · 꼭짓점 수가 같고 99.7 % 가 1 mm 안에서 겹침 · `build_contour_gpkg.py` `write_source` 는 SHP 를 그대로 옮김 |
| 잘림 | 있음(해 없음) | 도엽 = 도곽에서 끊긴 선 · gpkg = 도엽을 넘는 긴 선(073 에 걸린 196 가닥의 꼭짓점 527만 → 도엽 안 18만) · 끝점 차 0.3~1.2 m 는 도곽선 위만 |
| 좌표계 변환 오차 | 없음 | 5179 → 5186 · 5187(같은 GRS80 TM) · 평균 0.2 mm |
| 누락 가닥 | 없음 | 길이 차 < 0.01 %(073: 1.5 m / 786.5 km) |
| 갱신 시점(판) | 079 에 국소 수정 | 높이 245~270 의 6 단 · 도엽에만 441 m · gpkg 에만 448 m · 자리 X 285,397~287,564 · Y 413,068~414,520(EPSG:5186) · 최대 어긋남 22 m · 073 · 084 는 수정 0 · 어느 쪽이 새것인지 날짜로 못 가림(4장) |
| 높이 값 | 같음 | 단 수 · 범위 · 5 m 배수 · 짝 일치 모두 같음 |
## 3. 지형면 영향 (2 m · 라플라스)
지금 코드 함수 그대로 씀: `_rasterize_contour_levels` → `build_laplace` → `_resolve_enclosed_interiors`(`SheetSurface.py:219` · `SheetMethods.py:124` · `SheetSurface.py:279`). 도곽 안 선만 넣고, 가장자리 100 m 를 뺀 칸끼리 비교함.
| 항목 | 073 | 084 | 079 |
| --- | --- | --- | --- |
| 격자 · 비교 칸 | 1388×1117 · 130.7만 | 1389×1118 · 130.8만 | 1399×1137 · 131.6만 |
| 높이 차 평균 · 95 % · 최대 (m) | 0.023 · 0.11 · 5.0 | 0.046 · 0.27 · 5.0 | 0.005 · 0.009 · 2.54 |
| 0.1 m 넘는 칸 | 5.5 % | 11.0 % | 1.2 % |
| 평균 경사(도엽) | 30.9° | 33.1° | 4.2° |
| 경사 차 평균 · 95 % · 최대 | 0.24° · 1.57° · 38.1° | 0.49° · 2.86° · 51.3° | 0.03° · 0.04° · 20.1° |
| 셈 시간(두 원천 합) | 97 s | 87 s | 129 s |
대조군(073 · 같은 도엽 선):
| 바꾼 것 | 굽힌 칸 차(도곽 안) | 높이 차 평균 · 95 % · 최대 (m) |
| --- | --- | --- |
| 1 mm 옮김 | 26 칸 | 0.000 · 0.000 · 1.84 |
| 선 방향만 뒤집음 | 61,474 / 307,905 칸(20 %) | 0.10 · 0.50 · 9.0 |
| 도엽 → gpkg | 12,928 칸 · 선 방향 반대 112 / 495 가닥 | 0.023 · 0.11 · 5.0 |
- 지형면 차는 원천 차가 아님. 굽기(`all_touched=False` · `SheetSurface.py:268`)가 선 방향과 조각에 따라 다른 칸을 칠하는 탓임.
- 곁 발견 — 같은 자료라도 선 방향에 따라 칸 높이가 최대 9 m 흔들림(지금 B · D 지형면 공통).
## 4. 그 밖 차이
| 항목 | gpkg | 도엽 zip |
| --- | --- | --- |
| 날짜 | `OBCHG_DT` · `RSREG_DT` · `DBREG_DT` 가 1,884,844 행 모두 2024-04-08 → 일괄 적재일이라 판 판정 근거가 못 됨 | index 에 갱신일 칸 없음(목록 API 응답 `last_upt_dat` 는 받지만 안 적음 · `SheetStore.py:114` · `:303-310`) · zip 안 SHP 날짜 = 2022-12-13(073 · 084) · 2023-01-26(079) |
| 관리 업체 칸 | `MNENT_NM` = 지오투정보기술(용화) · (주)우리강산시스템(079) | 없음 |
| 표고점 | 없음 | 172 · 94 · 614 점 · 지금 지형면 코드는 안 씀(등고선 파일만 · `SheetSurface.py:55`) |
| 섬 | 있음 = 울릉 · 독도 · 제주(한라산 · 성산 · 우도 · 마라 · 추자) · 가거 · 흑산 · 강화 / **없음 = 백령 · 대청 · 소청 · 연평(±1.5 km 안 0 가닥)** | 받아 볼 수 없어 확인 못 함 |
| 해안 도엽 | — | 보유 37 장 가운데 해안 도엽 없음 → 대조 못 함 |
| 범위 | X 776,490~1,387,948 · Y 1,458,676~2,044,838(EPSG:5179) | 도엽 단위 |
| 화면 전송 | 0.00003° 단순화 → 꼭짓점 11.7 % · 18.0 % · 17.5 % 남음 · 어긋남 평균 2.6~2.9 · 최대 3.3 m(`Router_GIS.py:202`) | 원형 그대로 · 자릿수만 줄임(`Router_GIS.py:177-187`) |
곁 발견 — 도곽 코드 `_SHEET_FRAME_CODE = "A0010000"`(`SheetStore.py:43`)는 도로 면 겹(칸 = UFID 뿐 · 도엽마다 여러 면)임. 진짜 도곽은 `N3L_H0010000`(도엽명 · 도엽코드 칸 · 3 장 모두 계산 도곽과 0.1 m 안에서 같음). 그래서 index `bounds_wgs84` = 도로 면 범위임(073 은 도곽의 77 % · 084 는 40 %). 도로 없는 도엽은 받기에서 실패하는 길이 있음(`SheetStore.py:325-327`). 보유 37 장은 모두 A001 이 있고, 그 가운데 4 장(36716007~010)에는 H001 이 없음.
## 5. 정리
### 5-1. 「해상도 문제」
- 수치로는 없음 — 1 · 2 장.
- 화면에서 gpkg 등고선만 단순화돼 거칠게 보임 → 해상도 문제로 오해할 수 있음(4 장 화면 전송 줄).
### 5-2. 도엽 zip 을 쓰게 된 흐름 (기록)
| 시점 | 기록 | 근거 |
| --- | --- | --- |
| 07-26 | 등고선 = 전국 gpkg · 그 밖 겹 = 도엽 zip(사용자 확정) · 국가 자료는 참고용 · 설계 계산은 LAS 만 | `docs/raw/plans/2026-07-26_plan_도엽_오버레이.md:21-23` |
| 07-28 | 배수유역 배경 = 도엽 등고선 · 하천중심선 · 표고점 세 겹 | `docs/raw/plans/2026-07-28_plan_B04_B05_Drainage_Watershed.md:23` |
| 08-01 | 분석용 원본 = `도엽_등고선.geojson` 유지 · 화면 공유 | `docs/raw/plans/2026-08-01_plan_S8_B05_data_saving.md:39` |
| 08-30 | LAS 없는 지형면 = 배수유역 엔진 재사용 → 도엽 등고선을 그대로 이음 · 까닭 기록 없음 | commit `3572694f7` · `SheetSurface.py:55` |
| 10-2x | 분석 477: 「도엽 zip 그대로」 권함 · 까닭 = 데스크탑 · 배포 서버에 gpkg 가 있는지 모름 | `docs/raw/요구_1025/_분석_477_수치지형도_화면맞춤.md:225` |
| 지금 | D 예정노선 DEM 도 같은 함수 · 같은 도엽 등고선 | `D03_PlanAnalysis_Terrain.py:315` |
까닭 후보:
1. **다른 겹과 한 벌** — 하천 · 표고점 · 도로 · 건물과 같은 도엽 · 같은 범위 · 같은 판이라, 079 같은 국소 수정이 있어도 등고선과 하천이 서로 어긋나지 않음.
2. **배포 자리** — gpkg 는 git 밖(`.gitignore:44`)의 23.2 GB 파일이라 서버마다 손으로 둬야 함. 도엽 zip 은 자동 받기가 이미 돎(`ensure_sheets`).
3. **최신성** — 도엽 zip 은 받는 날의 브이월드 판이고, gpkg 는 07-26 에 만든 한 벌(연 1 회 손 갱신)임.
4. 해상도 — 까닭이 아님(같은 자료).
### 5-3. 전국 gpkg 로 도엽별 DEM 을 만들 때 걸림
| # | 걸림 | 크기 |
| --- | --- | --- |
| 1 | 서버마다 23.2 GB · 연 1 회 손 갱신(`build_contour_gpkg.py`) · 데스크탑 · 배포 서버에 있는지 확인 못 함 | 운영 |
| 2 | 도엽 zip 받기는 그대로 남음 — 하천 · 도로 · 건물 · 표고점 · 지명은 gpkg 에 없음 | 받기 줄지 않음 |
| 3 | 서해 5 도(백령 · 대청 · 소청 · 연평) 없음 → 도엽 zip 폴백 필요 | 갈래 하나 |
| 4 | 판 섞임 — 등고선(gpkg) 과 하천 · 도로(도엽) 판이 다르면 국소 어긋남(079 최대 22 m) | 드묾 |
| 5 | 선 방향 · 조각이 달라 지형면이 칸 단위로 바뀜(평균 2~5 cm · 최대 5 m) → 옛 저장본 열쇠가 바뀌어 한 번 다시 셈 · 노선 계산값이 조금 움직임 | 한 번 |
| 6 | 긴 선이 통째로 읽힘(073: 527만 꼭짓점 → 도엽 안 18만) → 자르기 필수(이미 함 · `GisVector.py:118`) · 읽기 0.04~0.35 s | 걸림 아님 |
| 이점 | 이웃 여유(250 m)를 이웃 zip 받기 없이 한 번 읽기로 채움 · 변환 오차 < 1 mm · 높이 칸 `CTRLN_HG` 는 굽기 코드가 이미 읽음(`Watershed_Grid.py:48`) | — |
@@ -0,0 +1,202 @@
# 분석 478 · 479 — 도엽 병합 까닭 · 도엽별 DEM · 전국 도엽 창고 · 갱신 확인 · 전국 크기 (요구 478 · 479)
읽기 전용 · 줄 = main_laptop_1 `aa0e7e1b4` · 코드 · DB · storage 안 고침 · 서버 POST 없음 · 외부 받기 없음.
실측 = 검증_랩탑메인(B `dad81824` 9 장 병합 등고선) · 가이드_예정노선(`87d47800`) · 가이드_예정노선_용화(`6067750f`) — 메모리 안에서만 셈(파일 안 씀) · 전국 등고선 gpkg 읽기만(sqlite `mode=ro`) · storage 는 파일 이름 · 크기 · 시각만.
겹친 앞 분석 = `_분석_477_수치지형도_화면맞춤.md`(도엽 조각 · 화면 맞춤 · D DEM 조각 · 창고 안) — 여기선 그 위에 「전국 · 갱신 · B」만 더함.
## 0. 결론
1. **병합 = 「사업 상자 통째 DEM」의 입력 한 파일**일 뿐 — 등고선을 상자 전체로 한 번에 보간하려고 합침. **도엽별 DEM + 이웃 여유면 병합 없이 됨**(사용자 말 맞음). 병합 자체는 작음(9 장 9.2 s) · 느린 몫은 통째 DEM(54~384 s).
2. **도엽별 DEM 실측 — 여유 50 m 부터 경계 차 0**(가장자리 20 m 띠 0.5 m 넘는 칸: 여유 0 = 6.5 % → 50 m = 0 %). 보간(거리 + 라플라스)은 여유 200 m 에서 **통째와 칸마다 똑같음(차 0.00 m)**.
3. **남는 차(칸 0.01~0.05 % · 최대 9.00 m)는 경계 탓 아님 — 지금 코드의 봉우리 · 웅덩이 메움이 「같은 높이 선 전체 평균」으로 방향을 정함**(`SheetSurface.py:311-316`). 9.00 m = 2 × 4.5 m = 봉우리가 웅덩이로 뒤집힌 값 · 지금도 D 범위가 늘 때마다 같은 봉우리가 뒤집힐 수 있음. 메움을 그 고리 둘레로만 고치면(판 올림) 조각 = 통째.
4. **전국 = 등고선 있는 도엽 약 1.75 만 장**(gpkg 색인 셈 17,457~17,903 · 제주 · 울릉 · 독도 포함) · zip 약 20 GB · DEM 2 m 약 75 GB · 1 m 약 300 GB.
5. **「전국을 미리 받으면 DEM 이 빨라짐」은 반만 맞음** — 받기는 지금도 작은 몫(장당 0.5~1.4 s). 빨라지는 건 **도엽 DEM 을 한 번 셈 + 영구 저장해 다시 씀** 덕. 그리고 **등고선은 이미 전국 gpkg(23 GB)로 노트북에 있고 도엽 등고선과 같음**(2 장 실측) → DEM 은 받기 없이 됨.
6. **권함 = 「처음 쓸 때 도엽마다 한 번 셈 + 영구 저장」(지연 채움)** · 전국 미리 셈은 비권함(2 m 단일 약 280 h · 판 올림 · 격자 바꿈(5 m 안 남음)마다 전국 다시).
7. **갱신 확인 됨** — 같은 도엽을 13 일 사이 두 번 받은 zip 6 장 해시 모두 같음(받을 때마다 바이트 같음) → 해시로 「같음 · 다름」 판정 가능. 검색 API 에 크기 · 갱신일 칸 있음(코드 주석) · 지금 색인은 안 남김 → 칸 더하면 받기 없이 먼저 거름.
8. **이용 조건 확인 못 함** — 지금 받기 길 = 지도서비스 안쪽 주소 + 로그인(공식 API 아님). 1 만 장 일괄 받기 한도 · 약관 문서 없음 → 일괄 받기 전 사용자 확인.
9. **B 는 받기 · 창고만 함께 쓰고 DEM 은 지금대로 권함** — B DEM 은 1 m · 노선 상자(0.4~2 km²)라 지금 7.5~35 s · 1 m 도엽 조각은 장당 175 s(실측 · 725만 칸)라 처음엔 더 느림 · B05 · B06 · 3D 는 저장본만 읽어 속도 이득 0.
---
## 1. 병합하는 까닭(코드 근거)
| 까닭 | 근거 | 도엽별 DEM 이면 |
| --- | --- | --- |
| DEM 한 판 = **사업 상자 통째**(B = 노선 상자 + 300 m · D = 받은 범위) → 입력 등고선 한 파일이 필요 | `SheetSurface.py:55`(`도엽_등고선.geojson` 한 파일) · `:522-530`(상자 = 노선 ± 여유) · D `Terrain.py:307-323` | 도엽 + 여유 안 등고선만 읽음 → 병합 불필요 |
| 보간 이음 — 거리 보간 = 「가장 가까운 다른 높이 두 선」 · 라플라스 400 회 | `SheetMethods.py:55-96 · 99-132` | 도곽 끝에서 이웃 선이 없으면 값이 바뀜 → **여유 50 m 이상**(2 장) |
| 도곽 걸친 지물 = 두 도엽에 중복 수록 → UFID 로 거름 | `SheetParser.py:89 · 128-132` | 화면에서 UFID 로 거름(477 2-1) |
| 화면 · 배수유역 · D 겹이 **겹마다 파일 하나**를 읽음 | `Router_GIS.py:31` · `Router_Watershed.py:64-65` · `D03 Layers.py:84-95` | 겹 = 도엽별 파일 여럿(477 2-1) |
| 처음 B 설계 = 노선 끝 3×3 9 장 → 「하나의 오버레이」 · 프로젝트 한 벌 | `docs/raw/plans/2026-07-26_plan_도엽_오버레이.md` 처리 순서 · `MapSheet.py:109-123` | — |
| 비용 | 병합 9 장 9.2 s · 9.3 s(`tmp/server.log`) · 통째 DEM 2 m 54.5 s(153만 칸) → 383.7 s(533만 칸)(`_분석_463-C` 18-2) | 느린 몫 = DEM |
- 판 — 병합 자체가 무의미하진 않음(통째 보간의 전제). 다만 **통째 보간을 도엽별 + 여유로 바꾸면 병합은 DEM 에서 빠짐** · 화면 겹은 도엽 파일 여러 개로 대신(477 단계 1).
## 2. 도엽별 DEM 경계 처리(실측)
방법 = 참값 = 9 장 병합 등고선으로 도엽 `36901074` + 600 m 를 통째 셈(342만 칸 · 117.8 s) → 074 도곽 상자 안쪽만. 조각 = 074 + 여유 M 상자 안 등고선만으로 같은 셈 → 같은 칸 차. 격자 2 m · 라플라스 · 좌표 2 m 배수에 맞춤(칸 대 칸).
| 여유 M | 칸 | 시간 | 0.5 m 넘는 칸(도엽 안 전체) | 최대 | 가장자리 0~20 m 띠(최대 · 0.5 m 넘는 %) | 20~50 m 띠 최대 |
| --- | --- | --- | --- | --- | --- | --- |
| 0 | 155만 | 38.7 s | 0.26 % | 9.00 m | **5.00 m · 6.49 %** | 0.67 m |
| 50 m | 168만 | 47.7 s | 0.04 % | 9.00 m | 0.02 m · 0 % | 0.18 m |
| 100 m | 181만 | 58.1 s | 0.04 % | 9.00 m | 0.00 m · 0 % | 0.17 m |
| 200 m | 209만 | 56.5 s | 0.03 % | 9.00 m | 0.00 m · 0 % | 0.14 m |
| 400 m | 272만 | 82.5 s | 0.01 % | 9.00 m | 0.00 m · 0 % | 0.06 m |
남는 차 진단(여유 200 m 다시 셈):
| 단계 | 조각 대 참값 |
| --- | --- |
| ① 굽기 + 거리 보간 + 라플라스(메움 앞) | **최대 0.00 m · 0.5 m 넘는 칸 0** |
| ② 폐합 등고선 안쪽 메움 뒤 | 0.5 m 넘는 칸 518 개 — **100 % 메움 자리**(봉우리 · 웅덩이) |
| ③ 그 518 칸의 고리 | **518 칸 모두 참값 · 조각 둘 다 「닫힌 고리」로 메움**(한쪽만 닫힘 0 칸) · 8.5 m 넘는 칸 46 개 |
- 까닭 = 메움이 봉우리인지 웅덩이인지를 **그 고리 둘레가 아니라 같은 높이 선 전체 둘레 평균**으로 정함 — `ring = binary_dilation(binary_fill_holes(mask) | mask) & ~component & ~mask`(`SheetSurface.py:311`) · `mask` = 그 높이의 **모든** 선 · 기울기 띠도 같은 꼴(`:319-327`). 범위가 바뀌면 평균이 바뀌어 방향이 뒤집힘 → 최대 차 = 2 × (간격 5 − 0.5) = **9.00 m**.
- 지금도 같은 흠 — D 받은 범위가 늘면 같은 봉우리 높이가 ± 4.5 m 바뀔 수 있음(통째 셈끼리도). 477 4-3 의 「링 안 닫힘」 풀이와 다름 — 두 셈 모두 같은 고리를 닫힌 것으로 보고도 값이 갈림(③) · 닫힘 차이만이면 최대 4.5 m 를 못 넘음.
- 고칠 길 = 고리 둘레 · 기울기 띠를 그 칸 묶음(`component`) 둘레로만 → 조각 = 통째 · 방향도 바름(어림 · 미실측) · `SHEET_SURFACE_ALGO` 1 → 2(`SheetSurface.py:61`) = 저장된 DEM 모두 한 번 다시 셈.
- 여유 권함 = **100 m**(경계 띠 차 0 · 시간 +50 %) · 477 은 250 m 권함(두 장 이음 시험 · 메움 흠 탓으로 큰 값) — 메움을 고치면 100 m 로 충분.
- 저장 = 도엽 도곽 안쪽 칸만(이웃 조각과 안 겹침) · 이어 붙임 = 같은 격자면 배열 복사(477 4-1).
## 3. 전국 도엽 창고 설계
| 칸 | 권함 | 까닭 · 근거 |
| --- | --- | --- |
| 자리 | **`storage/_shared/sheets/`(477 안)** — 지연 채움일 때 · 전국 미리 받기 · 셈이면 storage 밖 PC 별 폴더(설정 값) | storage = 워크트리끼리 정션 하나 · Synology 로 데스크탑과 동기화(쓰는 만큼이면 수십 MB/사업 → 번져도 됨 · 데스크탑은 셈 안 해도 됨) · 전국 수십~백 GB 를 Synology 로 번지게 하면 안 됨 |
| 도엽 번호 | 8 자리(`MapSheet.py:24-68`) · 폴더 = `<앞 5 자리 1:5만>/<8 자리>/` | 1.75 만 폴더를 한 층에 안 둠 · 1:5만 칸 = 판 묶음 단위(4-1 zip 날짜) |
| 원자료 | `<도엽>/<도엽>.zip` + 그 도엽 색인 json(477 — 색인 한 파일을 서버 여럿이 고치는 다툼 없음) | 지금 프로젝트 `map_sheets/` 212 개 265 MB = 서로 다른 37 장 48.5 MB(82 % 겹침) |
| 색인 칸 | 지금 칸(`file` · `original_name` · `crs` · `bounds_wgs84` · `acquired` · `source` · `SheetStore.py:303-310`) + **`sha256` · `file_size` · `last_upt_dat` · `ds_sq` · `file_no` · `checked`** | 갱신 확인용(4장) |
| 파싱 결과 | **미리 안 함** · 쓸 때 zip 에서 바로(장당 0.8~1.2 s · 477 2-5) · 쓴 도엽 겹만 `layers/` 에 둠 | 전국 GeoJSON = 장당 5.3~8.4 MB(표본 3 프로젝트) → 90~150 GB |
| DEM | `<도엽>/dem_<epsg>_<격자>m_laplace.npz` + `.key.json` · 도곽 안쪽 칸만 · 라플라스 하나만(나머지 다섯 방식은 프로젝트에서 지금대로) | 좌표계마다 따로(같은 지역 프로젝트는 거의 같은 TM 띠 → 다시 투영 코드 없음) |
| DEM 열쇠 | 등고선 지문(zip sha256 + 쓴 이웃 sha256 · 또는 gpkg 자른 선 해시) · 여유 · 격자 · 판(`SHEET_SURFACE_ALGO`) | **수정시각 쓰지 않음**(지금 `file_stamp` = mtime:크기 · `common_util_derived_store.py:27-33` · Synology · 복사가 시각을 바꿈) |
| 프로젝트 | 창고는 읽기만 · 받기 · 셈은 창고 함수가 · 프로젝트엔 이어 붙인 npz · 겹 파일만(지금 이름 · 자리 그대로 → 뒤 소비자 그대로) | `common_util_surface_sampler.py:40 · 170` · `surface_confirmation.py:20` |
| 동시 쓰기 | 도엽 폴더 `.lock` + 원자 쓰기(`atomic_npz` · `common_util_atomic.py:34`) | 서버 8000~8010 이 storage 하나 공유 |
| DB | 창고 목록을 DB 에 두지 않음 · 파일 색인만 | MariaDB 하나를 모든 환경이 씀 · 파일은 PC 마다 다를 수 있음 |
| ⛔ 정리 | **B `prune_sheets` 를 창고에 부르면 다른 프로젝트 도엽을 지움** → 창고 전환 때 B 에서 뺌 | `Engine.py:527` · `SheetStore.py:233-263`(목록 밖 zip 삭제) |
## 4. 갱신 확인
### 4-1. 지금 알 수 있는 것
| 칸 | 실측 · 근거 |
| --- | --- |
| 검색 API 응답 칸 | `ds_sq` · `file_no` · `file_nm` · `file_extsn` · `file_size` · `dtm_id` · `scale_nm` · `open_isscntm`(좌표계) · **`last_upt_dat`** (`SheetStore.py:110-128` 주석) · 무로그인 · 94 ms(`_분석_463-C` 18-1) · 실제 값 · 판이 바뀔 때 이 칸이 바뀌는지 = **확인 못 함**(저장된 응답 없음 · 외부 호출 안 함) |
| 지금 색인 | 갱신일 · 크기 · 해시 **안 남김**(`SheetStore.py:303-310`) · 검색 결과 첫 행만 받음(`:154` — 판 여럿일 때 차례 확인 못 함) |
| zip 해시 | `36901073 · 074 · 075 · 083 · 084 · 085` — 10-17 받은 것(`dad81824`) = 10-30 받은 것(`6067750f`) **sha256 6/6 같음** → 같은 판이면 바이트까지 같음 |
| zip 안 파일 시각 = 제작 묶음 | `36901xxx` 9 장 모두 2022-12-13 · `36712xxx` 6 장 모두 2023-01-26 → 판은 1:5만 칸(100 장) 묶음으로 바뀜(어림) |
| gpkg 속성 날짜 | `OBCHG_DT` · `RSREG_DT` · `DBREG_DT` 표본 4,000 가닥 모두 2024 → DB 등록 날짜로 보임 · 도엽별 판 구분엔 못 씀 |
### 4-2. 흐름(권함)
| 차례 | 하는 일 | 시간(어림) |
| --- | --- | --- |
| 1 | 대시보드 › 시스템 관리(`B01_Dashboard_UI_Nav.ts:17`) 카드 「도엽 창고」 [갱신 확인] — 「계산 자리」 카드 꼴(`B01_Dashboard_UI_CalcSites.ts`) | — |
| 2 | 창고에 있는 도엽마다 검색 API 한 번 → `file_size` · `last_upt_dat` · `ds_sq`/`file_no` 를 색인과 비교 | 있는 것만(수백 장) 수십 초 · 1.75 만 장 = 약 30 분 |
| 3 | 다른 것만 받기 → sha256 같으면 색인 칸만 고침 · 다르면 새 판 넣고 옛 판 `_old/` | 장당 0.5~1.4 s |
| 4 | 바뀐 도엽 + **이웃 8 장** DEM 열쇠 무효(여유가 이웃 선을 씀) · 그 도엽 겹 파일 무효 | 다음에 쓸 때 다시 셈 |
| 5 | 영향 프로젝트 = 프로젝트마다 `processed/sheet_merge.key.json` 도엽 목록(B `Engine.py:532-555` · D `Terrain.py:213-219`)에 바뀐 번호가 든 것 → 표로만 보여 줌 | storage 훑기 수 초 |
| 6 | **자동 다시 셈 안 함** — 작업본은 [저장] · [확정] 때만(CLAUDE.md 5장) · D = 다음 [지형 받기] 때 새 판 · B = 확정 지표면 그대로 + 「새 판 있음」 알림 | — |
| 갈래 | 등고선 원천 = gpkg 면: gpkg 갱신(연 1 회 수동 · 07-26 사용자 확정) 뒤 DEM 열쇠 = 자른 선 해시 → 쓸 때 0.2~0.4 s 자르기로 판별 · 바뀐 조각만 다시 | — |
- 사용자 말 「같은지 다른지만 확인」 = 2~3(크기 · 갱신일로 먼저 거름 · 해시로 확정). 받기 없이 판정하려면 2 의 칸이 판마다 바뀌어야 함 — 첫 구현 때 몇 장 실측으로 확인할 일.
## 5. 전국 크기 · 시간 어림
| 항목 | 장당 | 전국(약 1.75 만 장) | 근거 |
| --- | --- | --- | --- |
| 도엽 수 | — | **17,457~17,903 장**(등고선 있는 칸) | gpkg R-tree 188만 가닥 → 0.025° 칸(작은 가닥만 · 귀퉁이까지) · 범위 경도 125.1~131.9 · 위도 33.1~38.3 · 등고선 없는 바닷가 · 도시 칸은 빠짐 |
| 원자료 zip | 1.0~1.3 MB(37 장 평균 1.25 · 가운데 1.12 · 0.67~2.91) | **약 20 GB**(15~30) | storage 파일 크기 · 산지 위주 표본 |
| 푼 SHP | 3.6 MB(074) | 약 60 GB | zip 안 크기 |
| 파싱 GeoJSON(13 겹) | 5.3~8.4 MB | 90~150 GB | 표본 3 프로젝트 `도엽_*.geojson` 합 ÷ 장 수 → 미리 안 함 |
| DEM 2 m(도곽 안 155만 칸 · 압축 npz) | 약 4.3 MB(실측 2.6~3.0 B/칸) | **약 75 GB**(평활본 같이 두면 약 150 GB) | `models_plan/dtm_sheet_laplace.npz` 2.65 MB/100만 칸 · 4.56 MB/153만 칸 |
| DEM 1 m(620만 칸) | 약 17 MB | **약 300 GB** | 같은 비율 |
| 받기 | 0.45~1.4 s(검색 + 받기 + 검증 · zip 시각 차) | 차례로 2.2~6.8 h · 쉬엄 2 s/장이면 약 10 h | `6067750f` · `87d47800` · `dad81824` zip 수정 시각 간격 |
| DEM 2 m(여유 100 m) | 48~58 s(이 노트북) | 단일 약 280 h · 8 배 병렬 약 35 h | 2장 표 · 477 2-5 |
| DEM 1 m(여유 100 m) | **175 s**(725만 칸) | 단일 약 850 h · 8 배 병렬 약 4.4 일 | 실측 1 장(074) |
| 노트북 | 논리 20 · 메모리 64 GB · C: 남은 358 GB | — | `nproc` · psutil · `df` |
판 — **처음 쓸 때 셈 + 영구 저장(권함)**:
| 길 | 좋은 점 | 나쁜 점 |
| --- | --- | --- |
| 전국 미리 셈(2 m) | 어느 사업이든 첫 진입부터 몇 초 | 35~280 h · 75 GB · **판 올림 · 격자 바꿈(463-C 5 m 안) · 메움 고침(2장)마다 전국 다시** · 임도는 산지 일부만 씀 |
| **처음 쓸 때 도엽마다** | 쓰는 만큼(사업 하나 2 m 4~9 장 = 20~40 MB · 4~9 분 → 병렬 2~4 로 1~4 분) · 판이 바뀌어도 쓰는 것만 다시 | 새 지역 첫 진입은 그 도엽 셈 시간 |
| 갈래 — 고른 시군만 미리 | 회사 주 사업 지역은 첫 진입도 빠름 | 관리 단추 하나 더 |
## 6. 이용 조건
| 칸 | 내용 | 근거 |
| --- | --- | --- |
| 지금 받기 길 | 지도서비스 안쪽 주소 `map.vworld.kr/dtkmap/digitalDownload.do` + 로그인 세션(id/pw 자동 재로그인) · 검색 `ws3dmap/getDisitalMapList.do` 무로그인 — **공식 오픈 API 아님** | `SheetStore.py:6-13 · 49-52` · 07-26 계획 「공식 API 없음 → URL 패턴」 |
| 1 만 장 넘게 한꺼번에 | 한도 · 막힘 · 약관 조항 = **확인 못 함**(코드 · 문서에 없음) · 계정 막힘 위험은 남음 | — |
| 브이월드 약관 | 「영리 목적 동의 필요」(브이월드 전부) | `docs/raw/plans/2026-10-29_plan_581.md:15` |
| 도엽 이용허락 | 공공누리 1 유형(원문 확인 못 함) | `_분석_445-B_지도성능_타일.md:82` |
| 다른 길 — 국가기본도 등고선 | `TN_CTRLN` 전국 → **이미 gpkg**(`resources/data_global_contours/national_contours.gpkg` · git 밖 · 23.2 GB · 188만 가닥 · EPSG:5179 · 만든 날 2026-07-26 · 사용자 확정 = 연 1 회 수동 갱신) · 받은 곳 · 신청 절차 기록 없음 | `build_contour_gpkg.py:1` · `.gitignore:43-44` · 07-26 계획 아키텍처 1 |
| gpkg = 도엽 등고선? | 074: 길이 707.49 = 707.49 km · 단 126 = 126 · 정점 거리 0 m / 099(`36712099`): 597.12 대 595.09 km(0.3 %) · 단 94 = 94 · 정점 거리 최대 0.001 m | 실측 · 477 3 |
| 국토정보플랫폼 일괄 신청 | 확인 못 함 · `.env` 에 국토정보플랫폼 키 칸 있음(값 안 적음) · NGII 검색 API = 권한 없음(1002) | 07-26 계획 표 |
| 하천 · 도로 · 건물 · 지명 겹 | gpkg 에 없음 → 도엽 zip 필요 | 477 0-3 |
- 권함 — 일괄 받기 전 사용자가 브이월드에 조건 확인 · 그 전까지는 쓰는 도엽만(지연) · 미리 채우기는 쉬엄(장당 ≥ 2 s).
- 곁 메모(요구 481 · 482 · 이 분석 뒤 기록) — 개발 초기 「30 GB 자료」 = 이 전국 등고선 gpkg(23.2 GB · `TN_CTRLN*.shp` 묶음을 합침 · `convert_to_gpkg.py:27` · git 밖 `.gitignore:43-44`)로 보임(어림) · 지금 받는 축척 = 1:5,000(`search_sheet_files(scale=5000)` · `SheetStore.py:110` · 1:1,000 · 1:2,500 은 코드에 없음).
## 7. B 임도 설계 영향
| B 단계 | 지금 | 창고를 같이 쓰면 | 값 바뀜 | 속도 |
| --- | --- | --- | --- | --- |
| 도엽 받기 | 프로젝트마다 노선 끝 3×3(9~12 장) · 없는 것만 · 목록 밖 지움(`Engine.py:497-527`) | 창고에서 읽음 · **`prune_sheets` 뺌**(창고 지움 막음) | 없음(같은 zip · 해시 같음) | 9 장 5.6 s → 0 s(창고에 있을 때) |
| 병합 | 9 장 13 겹 → `processed/도엽_*.geojson`(`Engine.py:529-555`) | 그대로(입력 자리만 창고) | 없음 | 9.2 s 그대로 |
| 도엽 DEM 1 m | 노선 상자 + 300 m 통째 · 실측 7.5~35 s(767×840 ~ 1030×1836 칸 · `tmp/server.log`) | **지금대로 권함** · 조각으로 바꾸면 1 m 장당 175 s × 상자에 닿는 1~4 장(3~12 분) | 조각으로 바꾸면 메움 자리 · 격자 원점(2 m 배수 맞춤) 만큼 | 처음엔 느려짐 · 같은 자리 두 번째부터만 이득 |
| B05 · B06 · 3D | 저장된 `dtm_sheet_laplace(_smooth).npz` · `_grid.bin` · glb 읽기만(`common_util_surface_sampler.py:40 · 170`) | 그대로 | 없음 | 이득 0 |
- 감싸는 길 — B04 `SheetStore` 에 「창고 자리」 하나만 넣고 `get_project_map_sheets_dir`(`SheetStore.py:58-64`) 가 창고를 돌려주게 → 부르는 곳 넷(B `Engine.py:517` · D `Terrain.py:165 · 295` · `Layers.py:95`)이 같이 옮겨감 · 프로젝트 `map_sheets/` 는 옛 것 읽기 폴백 · B DEM 함수(`build_sheet_surface_model` · `SheetSurface.py:490`)는 안 건드림(690 줄 · 상한 700).
- 색인을 도엽 폴더마다로 바꾸면(서버 여럿 다툼 막음) 색인 읽는 곳도 같이 — `SheetStore.py:209-230` · `SheetParser.py:96 · 109-110` · 시험 `test_530_1_plan_terrain.py:62`.
- 메움 고침(2장)은 B · D 같이 바뀜 → B 는 열쇠 판이 바뀌어도 **전처리 · 관리자 요청 때만 다시 셈**(`SheetSurface.py:510-521`) → 옛 확정 지반고는 그 전까지 그대로 · 다시 돌리면 봉우리 자리 높이가 바뀔 수 있음.
## 8. 단계 · 파일 경계 · 위험 · 결정 거리
### 8-1. 단계
| 단계 | 내용 | 크기 |
| --- | --- | --- |
| 1 | 창고(도엽 폴더 · 색인 칸 더함 · 해시) + B · D 받기를 창고로 · B `prune` 뺌 · 옛 프로젝트 zip 한 번 모음(같은 번호 해시 대조) | 작음~중간 |
| 2 | D DEM 조각(여유 100 m · 도곽 안쪽 저장 · 이어 붙임) = 477 단계 2 | 큼 |
| 2-1 | 메움 고리를 칸 묶음 둘레로(판 1 → 2) — 2 와 같이 | 작음 |
| 3 | [갱신 확인] 카드 + 영향 프로젝트 표 | 중간 |
| 4(선택) | 고른 시군 미리 채우기 · B DEM 조각 | 사용자 결정 뒤 |
### 8-2. 파일 경계(창 셋)
| 창 | 파일(이 창만) |
| --- | --- |
| A 창고 · 갱신 엔진 | `B04_PreProcess_Engine_SheetStore.py`(357 줄 · 자리 · 색인 칸 · 해시) · `B04_PreProcess_Engine.py:497-560`(prune 뺌) · 새 `B04_PreProcess_Engine_SheetLibrary.py`(갱신 확인 · 영향 프로젝트) · `config/config_system.py:115-116` 곁 자리 값 · 시험 새 |
| B D DEM 조각 | 477 7-2 창 A 그대로(새 `D03_PlanAnalysis_Sheets.py` · `Terrain.py` · `Layers.py` · `ZeroOrder.py` · `Router.py`) + `SheetSurface.py:279-338` 메움 고리(B04 공용 · B 시험 `test_sheet_surface.py` 같이) |
| C 관리 화면 | 새 `B01_Dashboard_UI_SheetLibrary.ts` · `B01_Dashboard_UI_Nav.ts`(메뉴 한 줄) · 새 `B01_Dashboard_Router_SheetLibrary.py` 길 둘(확인 · 받기 · `B01_Dashboard_Router.py` 617 줄이라 따로) · 권한 = 시스템 관리자(`calc_sites` 길 꼴 · `Router.py:585-591`) |
- A ↔ B 겹침 = 창고 함수 이름 · 색인 꼴 → A 가 먼저 PLAN 에 적고 B 가 그 이름으로.
### 8-3. 위험
| 위험 | 크기 | 막는 길 |
| --- | --- | --- |
| B `prune_sheets` 가 창고를 지움 | **큼** | 1 단계에서 B 에서 뺌 · 창고 함수엔 지움 없음 |
| Synology 번짐 | 전국 미리면 수십~백 GB 데스크탑으로 · 랩탑 지움이 데스크탑에 번짐 · 같은 도엽 동시 만들기 = 충돌 사본 | 지연 채움 · 전국이면 storage 밖 |
| 용량 | 랩탑 C: 남은 358 GB · storage 지금 54 GB | 2 m 지연 · 1 m 전국 안 함 |
| 판 올림 · 격자 바꿈 | 미리 셌다면 전국 다시 | 지연 채움 |
| 공유 DB | 창고 목록을 DB 에 두면 PC 파일과 어긋남 | 파일 색인만 |
| 일괄 받기 계정 막힘 | 확인 못 함 | 사용자 조건 확인 · 쉬엄 |
| 데스크탑 gpkg | 데스크탑(임시 배포)에 있는지 확인 못 함(git 밖 · Synology 밖 코드 폴더) | gpkg 원천은 없으면 zip 폴백 |
| 메움 고침 = 값 바뀜 | 봉우리 · 웅덩이 칸(0.01~0.05 %) ± 4.5 m | 판 올림 · B 는 다시 돌릴 때만 |
| 검색 결과 판 여럿 | 첫 행만 받음 · 차례 모름 | 1 단계에서 몇 장 실측 |
### 8-4. 사용자 결정 거리
| 거리 | 갈래 | 권함 |
| --- | --- | --- |
| 도엽 원본 자리 | 프로젝트(07-26 결정 「도엽 원본 = 프로젝트 영구저장소 · resources 금지」) → 공용 창고 | **공용 창고**(옛 결정 바꿈 · 확인 필요) |
| 받기 범위 | 전국 일괄 / 쓰는 도엽만 / 고른 시군 미리 | **쓰는 도엽만** + 갈래로 시군 미리 |
| DEM 셈 | 전국 미리 / 처음 쓸 때 + 영구 | **처음 쓸 때 + 영구** |
| DEM 등고선 원천 | 도엽 zip(지금 · 이웃 zip 도 받아야 여유 채움) / 전국 gpkg(받기 0 · 같은 선 실측 · 연 1 회 갱신) | **gpkg**(이웃 받기 없음) · 없으면 zip 폴백 |
| 창고 자리 | `storage/_shared`(Synology 번짐 · 데스크탑 이득) / storage 밖 PC 별 | 지연이면 **`storage/_shared`** |
| 메움 고침 | 지금대로 / 고리 둘레로(판 올림) | **고침**(조각 = 통째 · 봉우리 뒤집힘 없앰) |
| 여유 | 100 m / 250 m(477) | 메움 고치면 **100 m** · 안 고치면 250 m |
| B DEM | 지금대로 / 조각 | **지금대로**(받기 · 창고만 함께) |
| 갱신 뒤 다시 셈 | 자동 / 알림만 | **알림만**(작업본은 [저장] · [확정] 때) |
@@ -0,0 +1,217 @@
# 분석 486 — 오래 걸리는 지형 분석 미리 해 두기 대상 (요구 486)
읽기 전용 · 줄 = main_laptop_1 `7244050a0` · 코드 · DB · storage 안 고침 · 서버 POST 없음.
실측 = `tmp/server.log`(랩탑 메인 · 160만 줄 · 시각 없음 · [계측] 줄) · 메모리 안 셈(파일 안 씀) — B `dad81824` 등고선(도엽 `36901074` · EPSG 5187) · D `87d47800` DEM(939×1627 · 2 m) · 전국 gpkg 읽기만(sqlite `mode=ro`).
앞 분석 = `tmp/brain_475/_분석_478_전국도엽_도엽별DEM.md`(도엽별 DEM · 여유 · 전국 크기) · `docs/raw/요구_1025/_분석_463-C_자료_성능_임도망.md` 18 — 겹치는 수치는 그쪽 인용.
## 0. 결론
1. **지형만으로 정해지고 오래 걸리는 것 = 넷** — D 지형면(DEM 2 m · 18.6~383.7 s) · D 0차곡(흐름누적 · 장당 12.6 s) · B 배수 하강 방향장(1 m · 4.8~10.9 s · 장당 20.3 s) · E07 집수면적(시간 작음 · 상류 잘림이 흠). 나머지 긴 계산(E04 3D 25~70 분 · E03 45 s~3 분 · B04 LAS 239 s · B05 추천 최대 115 s · B03 체인 · B06 · E05)은 **설계 · 사용자 LAS 가 들어가 미리 못 함**.
2. **급경사 · 음영은 미리 둘 것 없음** — DEM 에서 0.08~0.44 s · DEM 만 공용이면 됨.
3. **큰 강 유역 계층 필요 없음(실측)** — 도엽 + 여유로 셈 = 통째 셈: 하강 방향장 **여유 100 m 에서 차 0** · 0차곡(≤ 1 ha) **여유 200 m 에서 차 0** · E07 a(포화 근처 3,000 m 로 자름) 여유 400 m 에서 0.1 %. 이 프로그램은 「끝없는 흐름누적」을 쓰는 곳이 없음(배수 = 방향 + 도로 도달 추적 · 0차곡 = 1 ha 까지 · SINMAP = 포화에서 멈춤).
4. **권함 = 도엽(1:5,000) 단위 · 처음 쓸 때 셈 + 공용 영구 저장(지연 채움)** · 전국 미리 셈 비권함(D 묶음 350 h 단일 · 판 올림마다 다시) · 갈래로 고른 시군만 밤에 미리.
5. **1 단계 = D 도엽별 DEM + 0차곡 누적(급경사 · 음영은 그 DEM 에서 바로)** → 2 단계 B 하강 방향장 도엽별 공용 → 3 단계 E07 집수면적을 도엽 DEM(여유 400 m)에서 → 나중 등고선 표시 전국 조각.
6. 지금도 같은 지형 결과를 프로젝트마다 다시 셈 · 다시 둠 — 같은 방향장 28 벌(1.2 GB) · 같은 D DEM 14 벌 · 같은 E07 결과 10 벌.
---
## 1. 오래 걸리는 계산 전수 목록(> 약 1 s)
시간 = 서버 로그 실측(가운데 · 최대) · 「문서」= 계획서 · 분석 인용 · 「잼」= 이번 메모리 안 실측.
### 1-1. B 임도 설계
| # | 계산 | 파일:줄 | 시간 | 칸 · 범위 |
| --- | --- | --- | --- | --- |
| B1 | LAS 구조화 · CSF · 지표면 5종 · glb(WF1) | `B04_PreProcess_Engine.py:241-321` · `B04_PreProcess_Engine_Pipeline.py:351` | WF1 239.2 s · LAS 구조화 79.3 s · 지표면 52.0 s · CSF 4.1 s(로그 1 회) | 사용자 LAS · DTM 1 m |
| B2 | 도엽 지형면(라플라스 · 6 방식 중 기본 1) + 미리보기 glb | `B04_PreProcess_Engine_SheetSurface.py:490-574`(격자 `:530`) · 방법 `SheetMethods.py:99-132` | B 1 m 17.4~39.9 s(0.6~1.9 M 칸) · LAS 없는 WF1 은 6 방식 전부(설정 주석 891 s · `config_system_terrain.py:157-165`) | 노선 상자 + 300 m(`config_system_terrain.py:139-141`) |
| B3 | 도엽 받기 · 병합(13 겹) | `SheetStore.py:185` · `B04_PreProcess_Engine.py:529-555` | 받기 9 매 5.6 s · 병합 9.3 s | 노선 끝 3×3 |
| B4 | 배수 하강 방향장(등고선 굽기 → 밴드 EDT → 위치에너지 → 받는 칸) | `B04_PreProcess_Engine_Watershed_Descent.py:253-353` · 저장 `:361-445` · 호출 `Watershed_Expand.py:175-189` | 새로 짓기 4.8 s(가운데) · 10.9 s(1547×1848) · 저장본 있으면 0 s(n=208) | 1 m · 1차 영역 + 100 m + 400 m(`Expand.py:64 · 164`) · 원점 정수 m |
| B5 | 배수 1차 영역(세류 상 · 하류 나눔 · 등고선 점 구름) | `Watershed_Analyze.py:86-107` · `Watershed_Stream.py:336` | 0.7~3.9 s(최근) · 최대 16.2 s | 노선 ± 200 m |
| B6 | 도로 도달 판정 · 흐름 강도(큰 방향장 위 한 번) | `Watershed_Expand.py:287-353` · `Watershed_Flow.py:300` | 0.6~0.7 s(최근) · 옛 회차 방식 4.4~5.8 s × 9 회 | 큰 방향장 전체 |
| B7 | 배수 분석 전체(B4~B6 + 도엽 읽기 · 저장) | `B04_PreProcess_Router_Watershed.py:382-426` | **최근 3~7 s** · 옛 최대 118.8 s(방향장 회차마다 다시 짓던 때 · 520-6 앞) | — |
| B8 | 도엽 재투영(등고선 → 프로젝트 좌표) | `Router_Watershed.py:144-180`(`00_sheet_metric.pkl`) | 7.4 s · 피클 있으면 0.3 s | 병합 도엽 전체 |
| B9 | B05 추천 미리 셈(비용면 · 탐색 격자 · Dijkstra · 균형 종단) | `B05_Profile_Engine_Solver.py:178-211` · `RouteInitial_Search.py:102-135` · `Router_RouteInitial.py:264-319` | 가운데 1.6 s · 상위 10 % 15.7 s · 최대 115.1 s(n=502) · 초기 노선 한 갈래 최대 87.5 s | 2 m 비용면 · 4 m 탐색 · **LAS DTM 기준**(`cost_surface_classification_*` 24 벌) |
| B10 | B03 재확정 체인 · 노선 [확인] | `B03_FileInput_Service_Chain.py:497-670` | 최근 10.1~18.3 s · 옛 최대 167.2 s(배수 탓) | 설계 |
| B11 | B06 서버 재계산 · 3D 길 모형 | `B06_Section_Server_Calc_Prebuild.py:392-565` · `B05_Profile_Corridor_Prebuild.py:47-80` | B06 확정 4.0 s(가운데) · 최대 37.7 s · 3D 길 2.6~3.3 s | 설계 |
| B12 | 3D 모달 5 m 등고선(온디맨드) | `B04_PreProcess_Router_Contour.py:52-182` | 3.9 · 7.9 · 18.7 s | DEM 전체 |
| B13 | B07 평면도 지형 첫 열기 | `B07_DesignDetail_Router_Support_Fingerprint.py:306-327` | 1.3~4.4 s → 저장본 0.2~0.4 s(문서 `plan_335-518.md:1405`) | 지형 + 노선 |
| B14 | 바탕 지도 받기(white · 위성 · 하이브리드) | `B04_PreProcess_Engine.py` | 6.5 · 8.1 · 12.8 s | 노선 상자 |
### 1-2. D 예정노선
| # | 계산 | 파일:줄 | 시간 | 칸 · 범위 |
| --- | --- | --- | --- | --- |
| D1 | **지형면 DEM(라플라스)** + glb 2 · 평활 npz | `D03_PlanAnalysis_Terrain.py:315-323` → `SheetSurface.py:490-574` | 18.6 · 27.6 · 54.5 · 117.9 · 277.0 · **383.7 s**(0.77~5.33 M 칸) · 2×2 km 받기 전체 49.2 s 중 33 s(문서 `plan_594-603.md:22`) | 2 m(`config_system_terrain.py:143`) · 받은 범위 통째(줄지 않음) · 범위 1 m 만 늘어도 통째 다시 |
| D2 | 도엽 받기 · 병합 | `Terrain.py:209-220 · 298-302` | 받기 4 s · 병합 약 11 s(2×2 km) | 범위 도엽 |
| D3 | **0차곡**(웅덩이 메움 · D8 · 파이썬 위상 누적 · 세선화) | `D03_PlanAnalysis_ZeroOrder.py:47-95 · 127-183` | 3.0~4.05 s(2.1 km² · 문서) · **잼 12.6 s(1.53 M 칸 = 도엽 한 장 크기)** · 저장본 0.19 s | 2 m · 받은 범위 · 0.1~1 ha |
| D4 | 급경사 | `D03_PlanAnalysis_Layers.py:215-281` → E07 `slope_rad` | 0.41 s(2.1 km²) · 잼 0.08 s(1.53 M 칸) | 4,096 px 상한 |
| D5 | 음영 | `Layers.py:240-252` → `B07_DesignDetail_Engine_Cad_Lidar.py:59-103` | 0.44 s | 1,600 px 상한 · 솎음 간격이 범위 따라 바뀜(`:74`) |
| D6 | 지적도 WFS · 보호구역 · 산림입지 | `Layers.py:178-209 · 368-532` | 2~8 s(조각 16~32) | 범위 · 지형 아님 |
| D7 | 등고선 표시본 사본 + 화면 준비(LOD 6 단) | `B04_PreProcess_Router_GIS.py:392-422` · `B04_PreProcess_UI_MapRender_Prepare.ts:23-52` | 사본 약 3 s(66 MB) · 화면 169만 꼭짓점 1.3 s · 힙 약 300 MB | 받은 범위 + 600 m |
| D8 | 위성 조각 대리 | `D03_PlanAnalysis_Router.py:505-545` | 장당 43~93 ms · 프로젝트별 저장(150 MB 상한) | XYZ 조각 · 지형 아님 |
### 1-3. E 안정성평가
| # | 계산 | 파일:줄 | 시간 | 칸 · 범위 |
| --- | --- | --- | --- | --- |
| E1 | E04 3D 활동면 탐색 | `E04_Stab3D_Run.py:206-293` · `Engine_Search.py:382-` | 구간 하나 42~222 s · 1.14 km 22 조각 4,251 s(문서 `plan_560-567.md:57`) | 측점 상자 · 1 m |
| E2 | E03 2D 임계 활동면 탐색 | `E03_StabSection_Engine_Search.py:402-565` | 59 측점 44.9 s · 63 측점 182.6 s · 측점 하나 10.6~65.8 s | 횡단 ± 40 m |
| E3 | E03 보강 가정 · 확률 | `E03_StabSection_Router_WhatIf.py:196-311` · `Router_Prob.py:237-292` | 매회 탐색 1,000 회 39.6 s | 측점 하나 |
| E4 | E05 보고서(Node · Playwright) | `E05_StabReport_Store.py:124-164` | 11.8~13 s | — |
| E5 | E07 광역(경사 · 채움 · D∞ · 집수면적 a · SINMAP) | `E07_StabArea_Engine.py:86-174 · 283-294` · `Router.py:179-267` | 1.0~2.0 s(417×220) · **잼 a 2.5 s · 경사 0.08 s(1.53 M 칸)** | LAS DTM 복사본 → 2 m · 노선 ± 100 m |
## 2. 입력 갈래 — 지형만 / 설계
| # | 지형만 몫(미리 가능) | 설계 · 사용자 몫(미리 불가) | 판 |
| --- | --- | --- | --- |
| D1 DEM | 등고선 → 보간 전부 | 범위 상자만(지점 · 선 · 기준점) | **미리 가능** — 범위를 도엽으로 바꾸면 |
| D3 0차곡 | 누적 칸 수 | 임계(0.1 · 1 ha 쿼리 인자) | **미리 가능** — 누적을 두고 임계는 쓸 때 |
| D4 · D5 급경사 · 음영 | 전부 | 색 범위(화면) | 가능하나 **둘 필요 없음**(DEM 에서 1 s 안) |
| B4 하강 방향장 | 전부(등고선 · 단 · 셀 · 상수 · `Descent.py:365-394` 「노선과 무관 520-6」) | 범위만(노선 따라 상자) | **미리 가능** |
| B5 · B6 1차 영역 · 도로 도달 | 등고선 점 구름 · 재투영(B8) | 노선 · 세류 교차 | 설계 — 단 B8 재투영은 도엽별 공용 가능 |
| B2 B 도엽 DEM 1 m | 보간 전부 | 노선 상자 · 열쇠에 노선 해시(`SheetSurface.py:447`) | 가능하나 **지금대로 권함**(478 9 · 1 m 장당 175 s → 처음엔 더 느림) |
| B9 B05 추천 | 비용면 · 고른 지면 · 계류 EDT | 시작 · 끝 · 예상노선 · 제약 | **LAS DTM 기준 = 사업마다 다른 원자료** → 전국 공용 아님 · 프로젝트 안 캐시 몫(아래 4-4) |
| B1 LAS | 전부 지형이나 사용자 올린 LAS | — | 전국 공용 아님 |
| E5 E07 | β · 채운 DEM · D∞ · a | T/R · c · φ · 깊이(E02 물성) · 노선 띠 | **a 만 미리 가치**(시간 아닌 상류 잘림 고침) |
| E1~E4 · B10 · B11 | DTM 다시 뜨기 정도(가벼움) | 설계 단면 · 물성 · 구간 | 미리 불가 |
| D6 · D8 · B14 | — | — | 지형 아님 · 위치만 → 공용 조각 저장 갈래(작은 이득 · 5장) |
| B12 등고선 온디맨드 | 전부 | — | 도엽 DEM 이면 원 등고선과 거의 같음 → 원 등고선 갈음 갈래(결정 거리) |
## 3. 미리 해 둘 때 — 단위 · 여유 · 해상도 · 크기 · 시간
### 3-1. 도엽 + 여유 실측(이웃 경계)
| 대상 | 참값 | 여유 0 | 50 m | 100 m | 200 m | 300 m | 400 m |
| --- | --- | --- | --- | --- | --- | --- | --- |
| B 하강 방향장(1 m · 도엽 `36901074` 안쪽 620만 칸 · 받는 칸 다름) | 여유 600 m 셈(44.8 s) | 0.683 % | — | **0 %** | 0 % | — | 0 % |
| 같은 셈 시간 | — | 17.0 s | — | **20.3 s** | 24.8 s | — | 30.6 s |
| D 0차곡 칸(0.1~1 ha · 가운데 1 km² · 참 6,538 칸) | 939×1627 통째 | 35.4 % 다름 | 17.5 % | 7.6 % | **0 %** | 0 % | 0 % |
| 1 ha 로 자른 누적 면적 차 > 1 % 칸(25만 칸 중) | 〃 | 8,654 | 3,754 | 1,960 | 98 | **0** | 0 |
| E07 a(3,000 m 로 자름) 차 > 1 % | 〃 | 10.1 % | 6.6 % | 3.7 % | 1.1 % | 0.19 % | **0.10 %** |
| D DEM 2 m(478 2 장) | 9 장 통째 | 가장자리 20 m 띠 6.5 % | 0 % | **0 %** | 0 % | — | 0 %(남는 차 = 메움 흠) |
- 근거 — 방향장 = 「한 단 낮은 등고 라인까지 거리」 국소 셈(`Descent.py:174-243` · 창 32 칸 · 모자라면 4 배) · 0차곡은 1 ha 까지만 셈 · SINMAP 습윤 `W = min(R·a / (T·sinβ), 1)` = T/R 2,000~3,000 m 에서 a ≈ 2,000~3,000·sinβ m 면 포화(`E07_StabArea_Engine.py:182-198`) → 더 큰 상류는 값이 안 바뀜.
- **큰 강 유역 계층(표준유역 · 중권역) 필요 없음** — 끝없는 누적이 필요한 곳 없음 · 표준유역 경계 자료도 저장소에 없음(검색 0 건). 도로 도달 추적(B6)은 **도엽별 방향 조각을 이어 붙인 판** 위에서 지금처럼 돎 — 가장자리에 닿으면 이웃 도엽을 더 붙임(지금 「넓혀 다시 짓기」 `Expand.py:232-234` 자리).
### 3-2. 단위 · 저장 · 시간(도엽 한 장 = 약 2.24 × 2.77 km = 6.2 km²)
| 대상 | 단위 · 해상도 | 여유(권함) | 저장 꼴 | 장당 크기 | 장당 시간 | 근거 |
| --- | --- | --- | --- | --- | --- | --- |
| D DEM | 도엽 · 2 m · 원점 2 m 눈금 · EPSG 별 | 100 m(메움 고침 시) · 250 m(안 고침) | 도곽 안 칸 npz | 약 4.3 MB | 48~58 s | 478 2 · 5 장 |
| D 0차곡 | 도엽 · 2 m | 200 m(0 %) · 권함 300 m | 누적 칸 수(1 ha 로 자름 · uint16) | 약 1~3 MB(어림) | 12.6 s(잼 · 1.53 M 칸) | 3-1 |
| 급경사 · 음영 | 저장 안 함 | 1 칸 | — | — | 0.08~0.44 s | 1-2 |
| B 하강 방향장 | 도엽 · 1 m · 원점 정수 m · EPSG 별 | **100 m**(0 %) | 방향 코드 int8 + 단 번호 + 유효 비트(지금 받는 칸 int32 · 15 B/칸) | 지금 꼴 93 MB · 압축 꼴 약 8~12 MB(어림) | **20.3 s**(잼) | 3-1 · npz 실측 dtype |
| B 재투영 등고선 | 도엽 · EPSG 별 | 100 m | 미터 좌표 선 | 수 MB | 0.2~0.4 s(gpkg 자르기 · 478) | B8 |
| E07 a | 도엽 · 2 m | 400 m(0.1 %) · 더 정확은 「분수령까지」 | float32 · 자름 | 약 3 MB(어림) | 2.5 s(잼) | 3-1 |
### 3-3. 전국 크기 · 시간
도엽 수 = 등고선 있는 칸 **17,472 장**(잼 · gpkg R-tree 188만 가닥 · 0.025° 칸) · 높낮이차 ≥ 100 m 14,171 장 · ≥ 150 m **12,348 장**(산지 어림) · ≥ 200 m 10,503 장.
| 대상 | 전국 저장 | 산지(1.23 만) | 단일 | 8 병렬 | 산지 8 병렬 |
| --- | --- | --- | --- | --- | --- |
| D 묶음(DEM 58 + 0차곡 13 + 여유 몫 s) ≈ 72 s/장 | 약 75 + 17~50 GB | 약 53 + 12~35 GB | 약 350 h | 약 44 h | 약 31 h |
| B 하강 방향장 1 m(20.3 s/장) | 지금 꼴 약 1.6 TB(불가) · 압축 꼴 140~210 GB(어림) | 100~150 GB | 약 99 h | 약 12 h | 약 9 h |
| B DEM 1 m(175 s/장) | 약 300 GB | 약 210 GB | 약 850 h | 약 106 h | 약 75 h |
| E07 a 2 m(2.5 s + 여유) | 약 50 GB(어림) | 약 35 GB | 약 15 h | 약 2 h | — |
| 노트북 | 논리 20 · 메모리 64 GB · C: 남은 358 GB · storage 지금 54 GB | | | | |
### 3-4. 처음 쓸 때 셈 대 전국 미리 셈
| 길 | 좋은 점 | 나쁜 점 |
| --- | --- | --- |
| **처음 쓸 때 도엽마다 셈 + 공용 영구(권함)** | 쓰는 만큼(D 사업 하나 4~9 장 = 20~60 MB · 첫 진입 장당 약 72 s → 병렬 2~4 로 2~5 분) · 두 번째 사업부터 같은 자리 0 s(이어 붙임) · 판 올림 때 쓰는 것만 다시 | 새 지역 첫 진입은 그 도엽 셈 시간 |
| 전국 미리 셈 | 어느 사업이든 첫 진입 수 초 | 31~350 h · 70~250 GB · **판 올림(메움 고침 · 원점 맞춤 · 0차곡 판) · 격자 바꿈(5 m 안 · 463-C)마다 전국 다시** · 임도는 산지 일부만 씀 |
| 갈래 — 고른 시군만 밤에 미리 | 회사 주 사업 지역 첫 진입도 빠름 | 관리 단추 하나 · 밤 작업 |
## 4. 공용 결과로 바꿀 때 — 걷을 코드 · 바뀔 결과 · 시험
### 4-1. D(1 단계)
| 고칠 곳 | 지금 | 바뀜 |
| --- | --- | --- |
| `D03_PlanAnalysis_Terrain.py:302 · 315-323` | 병합 등고선 → 범위 통째 DEM | 도엽 목록 → 공용 저장 읽기 · 없는 도엽만 셈 → 이어 붙여 `models_plan/dtm_sheet_laplace.npz`(뒤 소비자 그대로) |
| `SheetSurface.py:530` 격자 원점 | 상자 최소(어긋남) | 2 m 눈금(`grid_spec_from_bounds` anchor) |
| `SheetSurface.py:311-327` 메움 | 같은 높이 선 전체 평균 | 고리 둘레(478 2 장 · `SHEET_SURFACE_ALGO` 1 → 2 · `:61`) |
| `ZeroOrder.py:127-183` | 받은 범위 통째 누적 · 끝 = 출구 | 도엽별 누적(여유 300 m) 이어 붙여 임계만 쓸 때 |
| `B07_..._Cad_Lidar.py:74` 음영 솎음 | 범위 따라 간격 바뀜 | 고정 간격 |
| `Layers.py:268` 급경사 열쇠 | npz mtime:size | 그대로(이어 붙인 npz) |
- 바뀔 값 — 원점 맞춤으로 칸 자리 최대 1 m 이동(보간 값 cm~dm · 어림) · 메움 고침으로 봉우리 · 웅덩이 칸 0.01~0.05 % ± 4.5 m(478) · **범위 끝 효과 사라짐**(DEM 가장자리 20 m 띠 6.5 % → 0 · 0차곡 끝 200 m 띠 안 35 % → 0) · 범위가 늘어도 옛 칸 값이 안 바뀜.
- D 확정값 영향 — D04 확정 = 노선 선만(`D04_PlanConfirm_Export.py:219`) · DEM 값은 확정 안 됨 → 다음 [지형 받기] 때 새 값. 3D 코리도 토공 어림만 조금 바뀜.
- 시험 — `test_530_1_plan_terrain.py` · `test_569_1_plan_layers.py` · `test_584_1_plan_geo_lines.py`(0차곡) · `test_578_2_plan_slope_end.py` · `test_603_plan_slope_bands.py` · `test_sheet_surface.py`(B 공용).
### 4-2. B(2 단계)
| 고칠 곳 | 지금 | 바뀜 |
| --- | --- | --- |
| `Watershed_Expand.py:175-189` `source_for` · `:232-234` | 프로젝트 저장본 덮으면 잘라 씀 · 아니면 큰 격자 새로 | 도엽별 공용 방향 조각 이어 붙임 · 가장자리면 이웃 도엽 더 붙임 |
| `Watershed_Descent.py:361-445` 저장 | 프로젝트 `drainage/descent_*.npz` · 받는 칸 int32 | 공용 자리 · 방향 코드 int8(이어 붙임 쉬움) |
| `Descent.py:365-394` 열쇠 | 도엽 지문 = geojson mtime:size(`Router_Watershed.py:144-156`) · 하천 파일 바뀌어도 무효 | 등고선 내용 해시 + EPSG + 셀 + 판 |
| `Router_Watershed.py:144-180` 재투영 피클 | 프로젝트마다 7.4 s → 피클 | 도엽 · EPSG 별 공용 |
- 바뀔 값 — **같은 등고선이면 0**(여유 100 m 실측 차 0). 원천을 도엽 zip → gpkg 로 바꾸면 갱신 도엽만(478 6 · 상주 099 길이 0.3 %).
- B 확정값 영향 — 저장 응답 재사용(`Router_Watershed.py:397-401`) · 재확정 체인만 다시 셈(`B03_FileInput_Service_Chain.py:590` refresh=True) → 관 · 유역 확정값은 그 전까지 그대로 · 다시 셈해도 같은 등고선이면 같은 값.
- 이득 — 첫 배수 분석 4.8~10.9 s → 이어 붙임(어림 1 s 안) · 같은 지역 · 복제 프로젝트 중복 저장 없앰(지금 같은 방향장 28 벌 · 1.2 GB · 같은 피클 14 벌 0.47 GB).
- 시험 — `test_347_1_descent_store.py` · `test_520_6_watershed_once.py`.
### 4-3. E07(3 단계)
| 고칠 곳 | 지금 | 바뀜 |
| --- | --- | --- |
| `E07_StabArea_Engine.py:148-174` `catchment_area` | LAS 복사 DTM(유효 40 %) 안만 · 끝 = 출구(주석 `:151-152`) | 도엽 DEM 2 m + 여유 400 m 에서 a · β 는 LAS 그대로 |
| `E07_StabArea_Router.py:145-155` 지문 | 물성 · 띠만 바꿔도 β · a 다시 | a 는 공용 · SI 만 다시 |
- 바뀔 값 — 띠 위쪽 끝 a 커짐 → SI 낮아짐(위험 쪽) · 실측 여유 0 대비 칸 10 % 에서 a 차 > 1 %.
- 시험 — `test_536_2_e07_area.py`.
### 4-4. 미리 셈 아닌 곁(프로젝트 안 캐시)
- B05 추천 — `route_metrics` 가 후보마다 지형 전체 가우시안 · 기울기 다시(`B05_Profile_Engine_RouteInitial_Metrics.py:141 · 225 · 243`) · `SearchGrid` 의 고른 지면 · 계류 EDT 도 묶음마다(`B05_Profile_Engine_RouteInitial_Search.py:121-130`) → 지형 서명별 한 번 저장 갈래(LAS 기준이라 전국 공용 아님).
- 0차곡 · E07 누적의 파이썬 반복(`ZeroOrder.py:83-94` · `E07_StabArea_Engine.py:164-172`) → 설치된 whitebox(2.3.0) 흐름누적으로 바꾸면 미리 셈 없이도 짧아짐(미실측).
- LAS 없는 B WF1 이 6 방식 전부 짓는 것(`SheetSurface.py:663` → `:509`) = 설정 의도(laplace 하나)와 다름.
## 5. 우선순위
| 순위 | 대상 | 시간 이득(첫 진입) | 쓰임 빈도 | 일 크기 | 판 |
| --- | --- | --- | --- | --- | --- |
| **1** | D 도엽별 DEM 2 m + 0차곡 누적(급경사 · 음영 = 그 DEM 에서) | 54~384 s → 새 도엽만 장당 약 72 s · 있는 도엽 0 s · 범위 늘 때 통째 다시 없앰 | D 지형 받기마다 · 범위 늘 때마다 | 큼(477 단계 2 + 메움 고침 + 원점 맞춤) | **1 단계** |
| 2 | B 하강 방향장 도엽별 공용(1 m · 여유 100 m) + 재투영 등고선 | 4.8~10.9 s + 7.4 s → 약 1 s | B 프로젝트 첫 배수 · 복제마다 | 중간 | 2 단계 |
| 3 | E07 a 를 도엽 DEM(여유 400 m)에서 | 시간 이득 작음(1~2 s) · 정확도 이득(상류 잘림) | E [해석 시작]마다 | 중간 | 3 단계 · β 섞음 결정 뒤 |
| 4 | 등고선 표시 전국 벡터 조각(gpkg → 조각) | 사본 3 s + 화면 1.3 s · 힙 300 MB | D · B 화면 열 때마다 | 큼(조각 도구 없음 · tippecanoe 없음) | 나중 |
| 5 | 위성 · 바탕 · 지적 조각 공용 저장 | 장당 43~314 ms · 바탕 6.5~12.8 s | 새 프로젝트마다 | 작음 | 선택(지형 아님) |
| — | B DEM 1 m 조각 | 처음엔 느려짐(장당 175 s) | — | — | 지금대로(478 9) |
| — | B1 LAS · B9 추천 · B10 · B11 · E1~E4 | 미리 불가(설계 · 사용자 LAS) | — | — | 제외 |
- 1 단계 안 차례 — 공용 저장 자리 · 열쇠(478 3 장 창고) → D DEM 조각(메움 고침 · 원점 맞춤 같이) → 0차곡 누적 조각 → 음영 솎음 고정.
## 6. 위험 · 사용자 결정 거리
### 6-1. 위험
| 위험 | 크기 | 막는 길 |
| --- | --- | --- |
| 방향장 · DEM 은 격자 방향이라 다시 투영 불가 | 중간 | EPSG 별 저장(TM 띠 경계 도엽은 두 벌) |
| 두 PC 가 같은 도엽을 같이 셈 → Synology 충돌 사본 · 잠금 파일은 PC 사이 안 통함 | 중간 | 셈이 결정적(내용 같음) · 원자 쓰기 · 충돌 사본 청소 규칙 · 또는 쓰는 PC 하나 |
| 랩탑 지움이 데스크탑(임시 배포)에 번짐 | 큼 | 공용 저장 지움 함수 없음 · B `prune_sheets`(`B04_PreProcess_Engine.py:527`)를 창고에 안 부름(478) |
| 배포 서버(데스크탑 메인)에 gpkg 있는지 확인 못 함 | 중간 | 없으면 도엽 zip 폴백 · 또는 23 GB 복사 |
| 판 올림(메움 · 원점 · 0차곡 · 방향장 판) | 지연이면 작음 · 전국이면 큼 | 열쇠에 판 · 쓸 때 다시 |
| 열쇠가 mtime 기반(`common_util_derived_store.py:27-33`) | 공용엔 틀림(복사 · Synology 가 시각 바꿈) | 등고선 내용 해시(도엽 + 여유 안 선 · 0.2~0.4 s) |
| 용량 | 전국 B 방향장 지금 꼴 1.6 TB | 압축 꼴 · 지연 채움 |
| 메움 고침 · 원점 맞춤 = D 값 바뀜 | 작음(봉우리 칸 · 칸 자리) | 판 올림 · 다음 [지형 받기] 때 |
### 6-2. 결정 거리
| 거리 | 갈래 | 권함 |
| --- | --- | --- |
| 미리 셈 방식 | 처음 쓸 때 + 공용 영구 / 전국 미리 / 고른 시군 밤에 미리 | **처음 쓸 때 + 공용 영구** · 갈래로 시군 미리 |
| 1 단계 대상 | D DEM + 0차곡(급경사 · 음영은 DEM 에서) / 더 넓게 | **D DEM + 0차곡** |
| 등고선 원천 | 전국 gpkg / 도엽 zip | **gpkg**(받기 없음 · 같은 선 실측 478) · 없으면 zip |
| 공용 저장 자리 | `storage/_shared/terrain/<EPSG>/<1:5만>/<도엽>/`(Synology 로 데스크탑도 씀) / storage 밖 PC 별 | 지연이면 **`storage/_shared`** · 전국 미리면 storage 밖 |
| 0차곡 저장 꼴 | 누적 칸 수(임계 바꿔도 다시 안 셈) / 기본 임계 선만 | **누적 칸 수** |
| B 방향장 공용 | 2 단계 / 지금대로(프로젝트) | **2 단계** |
| E07 a 원천 | 도엽 DEM 여유 400 m / LAS 그대로 | **도엽 DEM a + LAS β**(3 단계) |
| 큰 강 유역 계층 | 함 / 안 함 | **안 함**(3-1 실측) |
| 데스크탑 gpkg | 23 GB 복사 / zip 폴백 | 사용자 결정 |
| 갱신 | gpkg 연 1 회(07-26 확정) 뒤 쓸 때 해시 판별 / 일괄 다시 | **쓸 때 해시 판별** · 작업본은 [저장] · [확정] 때만(자동 다시 셈 없음) |
@@ -917,3 +917,11 @@ resource폴더에 미리 계산해서 저장한고 필요한 시점에 사용한
## 요구 489 (10-30 · 사용자)
미리계산했을때 전국 등고선과 도엽 등고선을 사용했을때의 효과를 알려줘.
## 요구 490 (10-30 · 사용자)
1. 빠진곳에서만 필요한 경우 도엽등고선을 받게 반영(다시말하면 없는 영역만 필요한 경우에만 받게 반영)
2. 23gb에 대한 정보공유는 워크트리에서 정션을 걸어서 취급하면 문제 없어보임.
3. 전국 등고선에 없는 데이터는 도엽등고선을 다운받아 정보를 가져오지만 데이터가 많지 않고 느려도 되니 사용자에게 브라우져를 보여주는 순서가 늦엊도 됨.
4. 전국 등고선의 파일 업데이트는 내가 알아서 하겠음.주기 포함.
일단 계획서와 요구서 업데이트
@@ -26,6 +26,8 @@
1. 도엽 조각 2 단계(DEM 조각 · 급경사 · 음영 · 0차곡 · 노선 DEM)를 이번에 1 단계와 함께 할지 — **1 단계 먼저 · 2 단계는 1 단계 화면 보고 결정(권함)** / 한 번에.
- 요구 486~490 으로 바뀜 — 2 단계(DEM 조각)는 `요구서_486_전국등고선_공용지형.md`(PLAN 607~611)로 옮김 · 등고선 원천 = 전국 등고선 파일 · 도엽 zip 은 빠진 곳 · 보조 겹만.
## 4. 배정안 (승인 뒤)
| 절 | 창 | 모델 | 맡는 것 |
@@ -0,0 +1,56 @@
# 요구서 486 — 전국 등고선으로 지형 분석 미리 계산(공용 지형 창고)
원문 = `사용자요구_1025.md` 요구 478~490 · 근거 = `_분석_478_전국도엽_도엽별DEM.md` · `_대조_483_전국gpkg_도엽.md` · `_분석_486_미리계산_지형분석.md` · 그림 대조 아티팩트 https://claude.ai/artifact/3kgRFSB3edxwYEWpqwLg6G · 앞 요구서 = `요구서_475_영역루틴_도엽조각_임도망목록.md`(PLAN 604~606).
## 1. 사실(실측)
| 항목 | 내용 |
| --- | --- |
| 전국 등고선 파일 | `resources/data_global_contours/national_contours.gpkg` · 23.2 GB · 국가기본도 등고선 TN_CTRLN · 188만 가닥 · 5 m · 2026-07-26 만듦 · 랩탑 메인 폴더에만 있음(작업 폴더 · 데스크탑 없음) |
| 도엽 등고선과 같은지 | 같은 1:5,000 원도 — 꼭짓점 99.7 % 1 mm 안 · 높이 짝 100 % · 지형면 차 평균 0.005~0.05 m · 한 곳 국소 수정(0.44 km · 최대 22 m · 어느 쪽 새것인지 모름) · 해상도 차 없음 |
| 전국 파일에 없는 곳 | 섬 넷(백령 · 대청 · 소청 · 연평) |
| 「해상도」 인상 | B04 하단 지도 「등고선」 겹(전국 파일)만 서버가 화면용으로 줄여 보냄(꼭짓점 12~18 % · 최대 3.3 m · `B04_PreProcess_Router_GIS.py:190-209`) |
| 도엽별 지형 | 이웃 여유 50 m 넘으면 경계 차 0 · 200 m 면 통째 계산과 칸마다 같음 |
| 미리 할 수 있는 오래 걸리는 계산(지형만 · LAS 안 씀) | D 지형 2 m(18.6~383.7 s) · D 0차곡(장 12.6 s) · B 배수 하강 방향장(1 m · 장 20.3 s · 배수유역 B04 · B05 바탕) · E07 광역 집수 면적 · 안정 지수 |
| 미리 못 하는 계산 | B04 LAS 처리 · B05 노선 추천(LAS 지표면) · E03 · E04 · B03 체인 · B06 · E05(설계 · 사용자 LAS) |
| 낭비 | 같은 하강 방향장 28 벌(1.2 GB) · 같은 D 지형 14 벌 · 같은 E07 결과 10 벌 |
| 지형 계산 흠 둘(B · D 공용 코드) | ① 등고선 방향에 따라 굽는 칸이 달라짐(같은 선 뒤집어도 평균 0.10 · 최대 9 m · `B04_PreProcess_Engine_SheetSurface.py:268`) ② 봉우리 · 웅덩이 채움 방향을 같은 높이 선 전체 평균으로 정함 → 봉우리가 웅덩이로 뒤집힘(최대 9.00 m · `:311 · 319-327`) |
| 곁 흠 | 도곽 코드 `A0010000` = 도로 면(진짜 도곽 `N3L_H0010000` · `B04_PreProcess_Engine_SheetStore.py:43`) · B `prune_sheets`(`B04_PreProcess_Engine.py:527`)가 공용 창고를 가리키면 남 도엽 지움 |
## 2. 사용자 확정
1. 등고선 원천 = 전국 등고선 파일(요구 486 · 489).
2. 도엽 등고선은 전국 파일에 없는 영역이 필요할 때만 받음(요구 490-1).
3. 23 GB 파일 = 작업 폴더에서 정션으로 함께 씀(요구 490-2).
4. 전국 파일에 없는 곳은 도엽을 받아 채우되 느려도 됨 — 화면에 늦게 보여도 됨(요구 490-3).
5. 전국 파일 갱신 · 주기 = 사용자 몫(요구 490-4).
6. 오래 걸리는 지형 분석은 프로그램 단위로 미리(처음 쓸 때 도엽마다 한 번 · 공용 저장 · 요구 486) · E07 도 전국 지형으로(LAS 안 씀 · 요구 487 · 488).
## 3. 정함(브레인) — 사용자가 바꿀 수 있음
1. 공용 지형 창고 = `storage/_shared/terrain/<도엽 번호>/`(모든 작업 폴더가 보는 정션 · 시놀로지로 데스크탑에도) · 원천 23 GB 파일은 `resources/data_global_contours/` 그대로 + 작업 폴더 · 데스크탑 폴더에 정션.
2. 단위 = 도엽(0.025°) · 이웃 여유 = 지형 200 m · 0차곡 200 m · 배수 하강장 100 m · E07 400 m(실측 차 0 · 0.1 %).
3. 해상도 = D 2 m(요구 466) · B 하강장 1 m(지금 그대로) · E07 2 m.
4. 계산 시점 = 도엽이 처음 쓰일 때 한 번 · 영구 저장 · 전국을 한꺼번에 미리 돌리지 않음(산지만 31 h · 방식 고치면 전국 다시).
5. 열쇠(지문) = 원천 파일 지문(전국 파일 크기 · 수정 시각 또는 도엽 zip 해시) + 계산 방식 판 · 사용자가 전국 파일을 바꾸면 다음 쓸 때 그 도엽만 다시 셈.
6. 급경사 · 음영 = 저장 안 함(지형에서 0.1~0.4 s).
7. 섬 등 빠진 곳 = 도엽 zip 받아 같은 창고에 · 받는 동안 서클 · 화면은 다 받은 뒤 보임.
8. 지형 계산 흠 둘 = 공용 창고 만들기 전에 먼저 고침(B 결과도 바뀜 — 확정값은 다시 [확정] 때만 · 전후 대조 수치).
9. 하천 · 도로 · 건물 · 지명 등 보조 겹 = 지금처럼 도엽 zip(PLAN 606 화면 조각 길) · 늦게 받아도 됨.
10. B04 하단 「등고선」 겹 화면 단순화 = 그대로(화면용) · 지형 계산은 단순화 안 한 원본만 씀.
## 4. 사용자 결정
없음(요구 490 으로 정해짐).
## 5. 배정안 (승인 뒤)
| 절 | 일 | 모델 |
| --- | --- | --- |
| 607 | 지형 계산 흠 둘 · 공용 지형 창고(전국 등고선 → 도엽 지형 2 m) · 빠진 곳 도엽 받기 · 정션 | Opus high |
| 608 | 예정노선 지형 받기 = 공용 창고 읽기 · 0차곡 공용 · 급경사 · 음영 | Opus high |
| 609 | 임도 설계 배수 하강 방향장 도엽별 공용 | Opus high |
| 610 | E07 광역 = 공용 지형 · 집수 면적 · 기본 물성 안정 지수 미리 | Opus high |
| 611 | 곁 흠(도곽 코드 · prune 공용 금지) | Sonnet high |
- 차례 — 607 먼저(창고 · 읽기 함수 꼴) → 608 · 609 · 610 · 611 동시 · PLAN 604 · 605 는 따로 바로 가능 · 606(화면 조각)은 604 · 607 뒤 · 606 의 등고 · 계곡 조각 원천 = 전국 파일.