diff --git a/docs/raw/요구_1103/_분석_601-2_점필터_서피스_코드목록.md b/docs/raw/요구_1103/_분석_601-2_점필터_서피스_코드목록.md new file mode 100644 index 000000000..9c45dfc15 --- /dev/null +++ b/docs/raw/요구_1103/_분석_601-2_점필터_서피스_코드목록.md @@ -0,0 +1,206 @@ +# 601 라이다 점 필터 · 서피스 코드 목록 + +조사 기준 — git 추적 파일(`docs/` · `node_modules` · `tmp/` 뺌) · 브랜치 `main_laptop_1` · 2026-11-03. +「쓰임」 낱말 — **기본 길**(자동 전처리 · 확정 · 설계가 늘 탐) / **고를 수 있음**(관리자 B04 화면 · 지형 칩에서 고를 때만) / **시험·도구만** / **아무도 안 부름**(import · 라우터 등록 · 문자열 호출까지 찾은 뒤) / **확인 필요**. +`.env` 의 지형 덮어쓰기 = `MESH_GRID_SIZE` · `MESH_SMOOTHING_ITERATIONS` 둘뿐(둘 다 안 쓰는 값) — 아래 기본값은 코드 값 그대로. + +## 흐름 한눈 + +``` +LAS 올림(B03 · D03 · B05) → 구조화 structured.npz(칸 최저 씨닝) → 지면 필터 mask_{필터}.npy + → 표현 짓기 {dtm|implicit|tin|nurbs|meshfree}_{필터}.npz (+ dtm·tin 평활 _smooth) → 등고선 contour_*.json + → DB surface_models 행 → 확정(stage 1 params: source_filter · method · smooth) + → 표본기 build_surface_sampler / 격자 이진 _grid.bin → B05 종횡단 · B06 · B07 · D03 · E0x +수치지형도 길: 도엽 등고선 → 굽기 → 거리 비례 + 라플라스 → dtm_sheet_{방식}.npz (B04 옛 판) / storage/_shared/terrain (D03 새 판) +``` + +--- + +## 1. 읽기 · 전처리 (파일 10) + +| 무리 | 파일:줄 | 줄 수 | 하는 일 | 부르는 곳 | 지금 쓰임 | 마지막 고친 날·커밋 | 겹침 | +|---|---|---|---|---|---|---|---| +| 1 | `B03_FileInput/B03_FileInput_Engine_Analyze.py:149` `analyze_las_metadata` | 653 | LAS 머리 · 점 수 · 분류 개수 요약 읽기(올릴 때) | B03 올리기 라우터 | 기본 길 | 2026-09-04·41c1771fa | — | +| 1 | `B03_FileInput/B03_FileInput_Service_WF1.py:110` | 258 | 자동 전처리(WF1) 진입 — `run_surface_analysis(source_filters=None, methods=[dtm, implicit])` → DB → 자동 확정 | B03 올리기 뒤 | 기본 길 | 2026-11-01·366fd7a70 | 69행 주석 「없으면 csf」 낡음(지금 ptd) | +| 1 | `B04_PreProcess/B04_PreProcess_Engine_Structurize.py:283` `structurize_las` | 338 | LAS/LAZ 여러 장 병합 → `structured.npz` · 1억 점 넘으면 0.5 m 칸 최저점 씨닝 | Engine.run_surface_analysis | 기본 길 | 2026-09-06·72075563e | — | +| 1 | `B04_PreProcess/B04_PreProcess_Engine.py:192` `run_surface_analysis` | 642 | 구조화 → 필터 → 표현 짓기 → 지도 · 도엽 서피스 한 줄 엮음(오케스트레이터) | B04 `/surface/analyze` · WF1 · `lidar_upload.build_surface` | 기본 길 | 2026-11-01·366fd7a70 | — | +| 1 | 〃 `:138` `cache_ground_points` | — | 필터 지면점 표본 `ground_points_{필터}.npz`(50만 점) | run_surface_analysis · `/surface/point-cloud*` | 기본 길 | 〃 | — | +| 1 | 〃 `:572` `_collect_analysis_result` | — | manifest → DB 넣을 모델 목록 조립 | run_surface_analysis | 기본 길 | 〃 | `lidar_upload.save_models` 가 같은 목록을 다른 규칙으로 DB 기록 | +| 1 | `B04_PreProcess/B04_PreProcess_Engine_PointPreview.py:59` | 97 | 점군 미리보기 고정 표본 이진 `preview_points_{필터\|raw}.bin` | Engine · `/surface/point-cloud/binary` | 기본 길 | 2026-10-16·e0051bff7 | JSON 점군 길(`Router.py:356`)과 같은 표본 — JSON 쪽 안 씀 | +| 1 | `B04_PreProcess/B04_PreProcess_Engine_Extent.py` | 206 | 지도 · 도엽 받을 범위(노선 우선 · 없으면 LAS 범위) | Engine.download_geodata | 기본 길 | 2026-09-03·e83171b2b | — | +| 1 | `common_util/common_util_lidar_upload.py:130` `build_surface` | 338 | LAS 나중 올리기 공용 — 좌표계 맞춤 · `run_surface_analysis(maps=False)` · 옛 필터 파일 지움 · DB 넣기 | D03 `/plan/lidar` · B05 `/route/lidar` | 기본 길(나중 올리기) | 2026-11-01·cb5c26d42 | DB 기록 `save_models:275` ↔ `Repository.save_surface_analysis_to_db`(의도된 갈래 — 행 안 지움) | +| 1 | `B04_PreProcess/B04_PreProcess_UI_Viewer.ts` | 346 | B04 점군 3D 보기(원본 · 필터별) | B04 화면 | 고를 수 있음(관리자) | 2026-10-26·58dafb157 | — | +| 1 | `A00_Common/map/map_lidar_upload.ts` | 117 | [LAS 올리기] 공용 단추 · 진행 묻기 | D03 · B05 화면 | 기본 길 | 2026-11-01·b3dcb7378 | — | +| 1 | `D03_PlanAnalysis/D03_PlanAnalysis_UI_LidarUpload.ts` | 142 | 예정노선 지형 칩 + LAS 올리기 | D03 화면 | 기본 길 | 2026-11-01·b3dcb7378 | — | + +## 2. 점 필터(지면 가름) (파일 9) + +| 무리 | 파일:줄 | 줄 수 | 하는 일 | 부르는 곳 | 지금 쓰임 | 마지막 고친 날·커밋 | 겹침 | +|---|---|---|---|---|---|---|---| +| 2 | `B04_PreProcess/B04_PreProcess_Engine_Ground.py:26` `_FILTERS` | 101 | 필터 이름 → 함수 표 · 자동 고름 `resolve_auto_source_filters:50`(분류 덮임 있으면 classification + ptd · 없으면 ptd) | Engine · Router · lidar_upload · 시험 | 기본 길 | 2026-11-01·773544e5c | 머리 글 「grid_min_z/csf/pmf/ransac」 낡음 | +| 2 | `B04_PreProcess/B04_PreProcess_Engine_Filter_Classification.py:25` | 95 | LAS 업체 분류(class 2) 그대로 읽기 · 덮임 판정 `has_classified_coverage:76` | Ground | 기본 길(분류 LAS 1순위) | 2026-11-01·366fd7a70 | — | +| 2 | `B04_PreProcess/B04_PreProcess_Engine_Filter_PTD.py:154` `filter_ptd` | 246 | 점진 TIN(Axelsson) — 칸 최저 씨앗 → 삼각망 다짐 → 외딴 꼭짓점 걷음 | Ground | 기본 길(미분류 LAS 유일 · 분류 LAS 에도 같이) | 2026-11-01·0ec0b6849 | Delaunay 를 PTD 안에서 따로 짬(서피스 TIN 과 별개) | +| 2 | `B04_PreProcess/B04_PreProcess_Engine_Filter_CSF.py:30` `filter_csf` | 122 | 천 떨어뜨리기(CSF) | Ground | 고를 수 있음(관리자) | 2026-09-01·ea254a741 | 9-01 까지 기본이었음 — 지금 PTD 가 대신 | +| 2 | `B04_PreProcess/B04_PreProcess_Engine_Filter_Grid.py:11` `filter_grid_min_z` | 50 | 2 m 칸 최저 + 1.5 m 안 | Ground | 고를 수 있음(관리자) | 2026-09-01·ea254a741 | 칸 최저 = PTD 씨앗 · DTM 격자와 같은 셈 | +| 2 | `B04_PreProcess/B04_PreProcess_Engine_Filter_PMF.py:33` `filter_pmf` | 91 | 형태학 열림(PMF) | Ground | 고를 수 있음(관리자) · 시험 없음 | 2026-08-08·f7528a4aa(개명 뒤 손 안 댐) | — | +| 2 | `B04_PreProcess/B04_PreProcess_Engine_Filter_RANSAC.py:59` `filter_ransac` | 116 | 10 m 칸마다 평면 맞춤(RANSAC) | Ground | **확인 필요** — 화면 목록 · 기본 목록 밖 · API(`Schema` 허용)로만 · 시험 없음 | 2026-08-08·f7528a4aa(개명 뒤 손 안 댐) | — | +| 2 | `B04_PreProcess/B04_PreProcess_Schema.py:14` `_ALLOWED_FILTERS` | 159 | `/surface/analyze` 허용 필터 · 표현 목록 | B04 Router | 기본 길 | 2026-09-01·ea254a741 | 허용 목록 넷째 벌(Ground `_FILTERS` · sampler `SurfaceFilter` · UI `SOURCE_FILTERS`) | +| 2 | `B04_PreProcess/B04_PreProcess_UI_Page.ts:54` `SOURCE_FILTERS` · `MODEL_METHODS` | 679 | B04 필터 · 표현 고르기 드롭다운 · 없는 조합은 물어보고 짓기 `ensureCombinationBuilt:410` · 확정 | B04 화면(SYSTEM_ADMIN 만) | 고를 수 있음(관리자) | 2026-11-01·773544e5c | 필터 목록 손으로 적음(ransac 빠짐 · classification 늘 보임) | +| 2 | `common_util/common_util_surface_sampler.py:29` `SurfaceFilter` | — | 파일 이름 허용 목록(경로 넘기 막음) | 표본기 · Solver | 기본 길 | 2026-11-01·2874c0fab | 위 허용 목록과 같은 내용 | + +### 2-1. 필터별 기본값 · 화면 · 결과 파일 + +| 필터 키 | 지금 고름 | 주요 기본값(`config_system_terrain.py`) | 고르는 화면 | storage 결과(`B04_PreProcess/processed/`) | +|---|---|---|---|---| +| `classification` | 자동 1순위 — class 2 비율 ≥ 0.002 **그리고** 10 m 칸 덮임 ≥ 0.5 | `SURFACE_CLASSIFIED_*` | B04 드롭다운(관리자) | `mask_classification.npy` · `ground_points_classification.npz` · `preview_points_classification.bin` · `classification_coverage.json` | +| `ptd` | 자동 늘(미분류면 유일 · `SURFACE_AUTO_FALLBACK_FILTER`) · B04 화면 기본 | 장면 `steep`(10° · 0.7 m) · 씨앗 10 m | B04 드롭다운(「점진 TIN」) | `mask_ptd.npy` · `ground_points_ptd.npz` · `preview_points_ptd.bin` | +| `csf` | 고를 때만 | 천 1.5 m · 강성 1 · 시간 0.65 · 문턱 0.5 m · 반복 150/5000 | B04 드롭다운 | `mask_csf.npy` · `ground_points_csf.npz` · `preview_points_csf.bin` | +| `grid_min_z` | 고를 때만 | 칸 2 m · 높이 1.5 m | B04 드롭다운 | `mask_grid_min_z.npy` · … 같은 꼴 | +| `pmf` | 고를 때만 | 칸 2 m · 창 3→40 · 기울기 1.0 · 최대 2.5 m | B04 드롭다운 | `mask_pmf.npy` · … 같은 꼴 | +| `ransac` | API 로만 | 거리 0.3 m · 칸 10 m · 반복 100 · 씨앗 42 | **없음** | `mask_ransac.npy` · … 같은 꼴 | +| 공통 | — | 씨닝 1억 점 넘을 때 0.5 m · 병합 간격 5 km | — | `structured.npz` · `source_identity.json` · `preview_points_raw.bin` | + +DB — `processed_point_cloud`(구조화 1 행) · `surface_models`(필터 × 표현 1 행 · `generation_params.source_filter`) · `terrain_layers`(미리보기 glb/ply). 확정값 = 작업 흐름 stage 1 `params`(`source_filter` · `method` · `smooth` · `contour_interval_m` · 수치지형도로 바꿀 때 `las_selection`). + +## 3. 서피스 만들기 (파일 12) + +| 무리 | 파일:줄 | 줄 수 | 하는 일 | 부르는 곳 | 지금 쓰임 | 마지막 고친 날·커밋 | 겹침 | +|---|---|---|---|---|---|---|---| +| 3 | `B04_PreProcess/B04_PreProcess_Engine_Pipeline.py:182` `_build_all_terrain_models` | 377 | 필터 × 표현 짓기 · manifest · 설정 지문 · 평활 · 등고선 미리 뽑기 · dtm 늘 먼저 · implicit 은 첫 필터만 | Engine | 기본 길 | 2026-11-02·3f4fd188e | 머리 글 「세 지면 필터(grid_min_z/csf/pmf)」 낡음 | +| 3 | `B04_PreProcess/B04_PreProcess_Engine_ModelBuild.py:78` `build_dtm` | 293 | **DTM** 1 m 칸 최저 + 빈칸 가까운 값 → `dtm_{필터}.npz`(x · y · z · valid_mask) | Pipeline `BUILDERS` | 기본 길(늘 · 외곽 · 표본 바탕) | 2026-11-01·956269964 | — | +| 3 | 〃 `:182` `build_implicit` | — | **implicit** 박판 RBF(이웃 64 · smoothing 0.1) · 중심점 = 지면점 17.5 %(5만~200만) → `implicit_{필터}.npz` + 굳힌 격자 | Pipeline | 기본 길(WF1 확정 표현) | 〃 | RBF 셈 네 곳(아래 5장 · 정리 후보 1) | +| 3 | 〃 `:32` `build_tin` | — | **TIN** 50만 점 들로네 · 긴 변(100 m) 자름 → `tin_{필터}.npz` | Pipeline | 고를 수 있음(관리자) | 〃 | — | +| 3 | 〃 `:123` `build_nurbs` | — | **NURBS** 격자 제어점 B-스플라인 → `nurbs_{필터}.npz` | Pipeline | 고를 수 있음(관리자) | 〃 | — | +| 3 | 〃 `:240` `build_meshfree` | — | **meshfree** 점 + 법선 서펠 → `meshfree_{필터}.npz` · ply | Pipeline | 고를 수 있음(관리자) | 〃 | — | +| 3 | `B04_PreProcess/B04_PreProcess_Engine_ModelContext.py:234` `TerrainContext` | 415 | 지면점 → 칸 격자 `grid:362` · 외곽 `footprint:291` · implicit 표본 `grid_sample:267` · glb/ply 쓰기 | ModelBuild · Smooth | 기본 길 | 2026-11-01·437333c7a | `SOURCE_FILTER_LABELS:27` = **아무도 안 부름**(필터 셋만 적힘) | +| 3 | `config/config_system_terrain.py:188` `build_surface_model_config` | 220 | 필터 · 표현 · 평활 · 외곽 · 등고선 설정값과 조립 | Engine · Pipeline 지문 | 기본 길 | 2026-11-01·773544e5c | `MESH_GRID_SIZE:12` · `MESH_SMOOTHING_ITERATIONS:13` = **아무도 안 부름** · `SURFACE_CONFIRM_DEFAULT_FILTER:180` = WF1 이 덮어씀(확인 필요) | +| 3 | `B04_PreProcess/B04_PreProcess_Engine_SheetSurface.py:490` `build_sheet_surface_model` | 690 | **수치지형도 서피스**(B04 옛 판) — 도엽 등고선 굽기 `_rasterize_contour_levels:219` · 폐합 채움 `_resolve_enclosed_interiors:279` → `dtm_sheet_{방식}.npz` | Engine(자동 · laplace 하나) · WF1(LAS 없는 설계 `run_sheet_surface_analysis:605`) · Router_GIS | 기본 길 | 2026-10-27·0fc0f0aae | `common_util_terrain_surface` 가 같은 일을 흠 고쳐 다시 씀(정리 후보 2) · `_write_smoothed:148` = `smooth_dtm` 복사본 | +| 3 | `B04_PreProcess/B04_PreProcess_Engine_SheetMethods.py:124` `build_laplace` | 513 | 등고 격자 보간 여섯 방식(laplace 기본 · tin_sheet · tin · biharmonic · anudem · multires) | SheetSurface | laplace 기본 길 · 다섯은 고를 수 있음(관리자 비교) | 2026-08-30·9fc4462d7 | `build_distance:55` · `relax_laplace:99` ↔ `common_util_terrain_laplace`(비트 동일 거울) | +| 3 | `B04_PreProcess/B04_PreProcess_Engine_SheetStore.py` · `_SheetParser.py` · `_MapSheet.py` | 372 · 139 · 123 | 도엽 zip 받기 · 등고선 겹 읽기 · 도엽 번호 | SheetSurface · terrain_store · 지도 | 기본 길(수치지형도 입력) | 2026-10-31·a5179e4df · 2026-10-29·9c8710a93 · 2026-08-08·f7528a4aa | — | +| 3 | `common_util/common_util_terrain_surface.py:178` `build_contour_surface` | 200 | 등고선 → 격자(흠 고친 판 — 방향 무관 굽기 `burn_segments:50` · 고리 둘레 채움 `:95`) | terrain_store | 기본 길(D03 · 공용 창고) | 2026-10-31·0055f494a | SheetSurface 굽기 · 채움과 같은 일 두 판 | +| 3 | `B04_PreProcess/B04_PreProcess_Engine_Watershed_Grid.py:344` `interpolate_elevation` | 582 | 배수유역 전용 — 등고선 꼭짓점 TIN 보간 · 웅덩이 채움 · D8 | 배수 분석 | 기본 길(배수만) | 2026-10-25·fb4beb99c | 등고선→격자 셋째 길(배수 목적이 달라 그대로 둘 몫) | +| 3 | `B04_PreProcess/B04_PreProcess_Router_GIS.py:349` `/surface/sheet-surface` · `:326` `/sheet-methods` | 422 | 수치지형도 방식 하나 더 짓기 · 방식 목록 | B04 화면 | 고를 수 있음(관리자) | 2026-10-30·a17ad1dc4 | — | + +### 3-1. 표현별 기본 · 결과 파일(`B04_PreProcess/models/`) + +| 표현 | 지금 고름 | 결과 | 평활 | +|---|---|---|---| +| `dtm` | 늘 지음(모든 필터 · 맨 먼저) | `dtm_{필터}.npz` · `_preview.glb` · `_grid.bin`(브라우저 격자) | 지음 `dtm_{필터}_smooth.npz` · `_smooth_preview.glb`(확정 기본 smooth=끔) | +| `implicit` | WF1 확정 기본 · 첫 필터만 | `implicit_{필터}.npz`(중심점) · `implicit_{필터}_grid.npz`(굳힌 격자) · `_preview.glb` | 없음 | +| `tin` · `nurbs` · `meshfree` | B04 관리자 고를 때만 | `{표현}_{필터}.npz` · `_preview.glb`(meshfree = `.ply`) | tin 만 Taubin `_smooth` | +| 수치지형도 | 자동 laplace 하나 · 나머지 고를 때 | `dtm_sheet_{방식}.npz` · `.key.json` · `_smooth.npz` | 지음 | +| 공통 | — | `manifest.json` · `contour_{필터}_{표현}[_smooth]_{간격}m.json` | — | + +## 4. 서피스 다듬기 · 등고선 (파일 8) + +| 무리 | 파일:줄 | 줄 수 | 하는 일 | 부르는 곳 | 지금 쓰임 | 마지막 고친 날·커밋 | 겹침 | +|---|---|---|---|---|---|---|---| +| 4 | `B04_PreProcess/B04_PreProcess_Engine_Smooth.py:54` `smooth_dtm` | 151 | DTM 가우시안(σ 0.5 m) + B-스플라인 → 0.5 m 평활 격자 | Pipeline `run_smoothing:143` | 기본 길(짓기는 늘 · 쓰임은 smooth 고를 때) | 2026-10-31·a1092b6c7 | SheetSurface `_write_smoothed` 복사본 | +| 4 | 〃 `:107` `smooth_tin` | — | TIN Taubin 10 회 | Pipeline | 고를 수 있음(TIN 고를 때) | 〃 | — | +| 4 | `B04_PreProcess/B04_PreProcess_Engine_ModelContext.py:291` `footprint` | — | 외곽 — 1 m 칸 · 틈 닫기 3 m(binary_closing) · 가장 큰 덩이 · 안쪽 1 m 깎기 | 모든 표현 | 기본 길 | 2026-11-01·437333c7a | — | +| 4 | `common_util/common_util_terrain_laplace.py:107` `laplace_surface` | 111 | 거리 비례 + 라플라스 400 회(빠른 판 · 홀짝 칸) | terrain_surface | 기본 길(D03 · 공용 창고) | 2026-10-31·0055f494a | SheetMethods `build_laplace` 와 비트 동일 거울 | +| 4 | `B04_PreProcess/B04_PreProcess_Engine_Contour.py:369` `extract_contours` | 516 | 표현별 npz → 격자 → marching squares 등고선 | Pipeline(미리) · Router_Contour(요청 때) | 기본 길 | 2026-11-02·3f4fd188e | `_extract_loaded:387` 표현별 격자 되살림 = 표본기와 셋째 벌 · implicit RBF 폴백 `:476`(dtm 없을 때만 · 확인 필요) | +| 4 | `B04_PreProcess/B04_PreProcess_Router_Contour.py:53` `/surface/models/{id}/contour` | 192 | 간격 바꿀 때 등고선 다시 뽑아 저장 | B04 · B05 화면 | 기본 길 | 2026-11-02·3f4fd188e | — | +| 4 | `B04_PreProcess/B04_PreProcess_UI_TerrainViewer.ts` (+ `_Chrome.ts` 202 · `_Contours.ts` 186) | 698 | B04 서피스 3D 보기 · 평활 토글 · 등고선 얹기 | B04 화면 | 고를 수 있음(관리자) | 2026-09-04·37fc63ba4 | — | +| 4 | `common_util/common_util_contour_tiles.py:138` `ensure_tile` | 159 | 전국 등고선 줌별 벡터 조각(라이다 아님 · 지도 보기) | D03 `/plan/contour/{z}/{x}/{y}.pbf` | 기본 길 | 2026-10-31·8ce7ef6cb | — | + +## 5. 저장 · 확정 · 쓰기 (파일 24 · 관련 없음 1 따로) + +| 무리 | 파일:줄 | 줄 수 | 하는 일 | 부르는 곳 | 지금 쓰임 | 마지막 고친 날·커밋 | 겹침 | +|---|---|---|---|---|---|---|---| +| 5 | `B04_PreProcess/B04_PreProcess_Router.py:88` `/surface/analyze` | 526 | 관리자 짓기 요청 → 엔진 → DB | B04 화면 `analyzeSurface` | 고를 수 있음(관리자) | 2026-10-16·e0051bff7 | — | +| 5 | 〃 `:211` `/surface/confirm` · `:401` `/surface/confirmed` · `:192` `/surface/models` | — | 확정 · 확정값 읽기 · 모델 목록 | B04 · B05 · D03 화면 | 기본 길 | 〃 | — | +| 5 | 〃 `:335` `/surface/point-cloud/binary` | — | 점군 미리보기 이진 | B04 화면 | 고를 수 있음(관리자) | 〃 | — | +| 5 | 〃 `:356` `/surface/point-cloud`(JSON) | — | 같은 점군 JSON | — | **아무도 안 부름**(화면 · 시험 0) | 〃 | 이진 길과 같은 일 | +| 5 | 〃 `:498` `/surface/ground-stats` + `B04_PreProcess_Api_Fetch.ts:301` `fetchSurfaceGroundStats` | — | 필터별 지면점 수 | — | **아무도 안 부름**(TS 함수 정의만) | 〃 · 2026-10-29·9c2b5e151 | — | +| 5 | `B04_PreProcess/B04_PreProcess_Router_Status.py:153` `/surface/models/{id}/preview` | 223 | glb/ply 미리보기 · WF1 진행 상태 | TerrainViewer · 진행 서클 | 기본 길 | 2026-09-04·03a193af7 | — | +| 5 | `B04_PreProcess/B04_PreProcess_Repository.py:452` `save_surface_analysis_to_db` | 547 | 분석 결과 → `processed_point_cloud` · `surface_models` · `terrain_layers`(옛 행 지움) | B04 analyze · WF1 | 기본 길 | 2026-10-30·59610fecf | `lidar_upload.save_models`(행 안 지움 판) | +| 5 | `B04_PreProcess/B04_PreProcess_Service.py:45` `confirm_surface_selection` · `:63` `switch_design_terrain` | 87 | 확정 · 설계 지형 라이다↔수치지형도 | Router confirm · WF1 · TerrainSwitch | 기본 길 | 2026-10-09·e62958422 | — | +| 5 | `common_util/common_util_surface_confirmation.py:33` | 223 | 확정 기본값(ptd · implicit · 평활 끔) · params 읽기 · 지형 갈래 · `las_selection` 적어 두기 | WF1 · Service · B05 · D03 | 기본 길 | 2026-11-01·85dade9a2 | — | +| 5 | `common_util/common_util_surface_sampler.py:262` `build_surface_sampler` | 320 | 확정 표현 → XY 표고 표본기(dtm · implicit = 격자 · tin/nurbs/meshfree = 보간) | B05 종횡단 · 노드 · B06 · 배수 · B07 · E03 · Router_Terrain | 기본 길(설계 지반고 정본) | 2026-11-01·2874c0fab | Solver `_sample_surface_on_grid` · Contour `_extract_loaded` 와 표현별 셈 세 벌 | +| 5 | 〃 `:198` `implicit_grid_npz` · `:181` `implicit_rbf` | — | implicit 을 dtm 축 1 m 격자로 굳힘(유효 칸만 RBF) | ModelBuild · 표본기 · Contour · Router_Terrain | 기본 길 | 〃 | — | +| 5 | 〃 `:145` `dtm_grid_bytes` · `:170` `dtm_grid_file` | — | 격자 이진 `_grid.bin`(브라우저 · Node) | Router_Terrain `/grid` | 기본 길 | 〃 | — | +| 5 | `common_util/common_util_surface_sampler.ts:65` `heightAt` | 82 | 브라우저 · Node 격자 표고(파이썬 짝 · 거울 시험) | B05 Api_TerrainGrid · Replan · `design_calc_node_stages.ts` | 기본 길 | 2026-10-16·5d37c851f | 짝 = 의도된 두 벌 | +| 5 | `common_util/common_util_terrain_store.py:285` `ensure_sheet_terrain` · `:443` `load_terrain` | 510 | 공용 지형 창고 — 도엽마다 2 m 지형 한 번 셈 `storage/_shared/terrain/<도엽>/dem__<격자>m.npz` | D03 Terrain · 0차곡 · E07 · 배수 Descent · tools | 기본 길(D03 수치지형도) | 2026-10-31·a5179e4df | B04 `dtm_sheet_laplace` 와 같은 원천 · 다른 판 | +| 5 | `B05_Profile/B05_Profile_Router_Terrain.py:84` `/route/elevations` · `:123` `/terrain-sources` · `:249` `/surface/models/{id}/grid` · `:215` `dtm_grid_npz` | 268 | 노선 편집 지반고 · 고를 지형 · 격자 이진 내보냄 | B05 화면 · D03 TerrainSource · `/calc` | 기본 길 | 2026-11-01·f912efd36 | — | +| 5 | `B05_Profile/B05_Profile_Router_TerrainSwitch.py:36` `/route/design-terrain` | 81 | 설계 지형 바꿈 → 저장 체인 다시 | B05 지형 칩 | 기본 길 | 2026-11-01·85dade9a2 | — | +| 5 | `B05_Profile/B05_Profile_Router_Lidar.py:195` `/route/lidar` · `:137` `_build` | 257 | B05 LAS 나중 올리기 → 짓기 → 노선 덮임 검사 → 본 자리 옮김 | B05 화면 | 기본 길 | 2026-11-01·cb5c26d42 | D03 Lidar 와 같은 공용(`lidar_upload`) | +| 5 | `B05_Profile/B05_Profile_Api_TerrainGrid.ts` | 111 | 설계 지형 격자 받아 IndexedDB 보관 | B05 노선 편집 | 기본 길 | 2026-10-21·4eec3a4b3 | — | +| 5 | `B05_Profile/B05_Profile_UI_RouteEdit_Terrain.ts` · `A00_Common/map/map_terrain_chip.ts` | 175 · 65 | 지형 칩(수치지형도 · 라이다) · 바꿈 확인창 | B05 · D03 화면 | 기본 길 | 2026-11-01·b3dcb7378 · 2026-11-01·61733d064 | — | +| 5 | `B05_Profile/B05_Profile_Engine_Solver.py:65` `_sample_surface_on_grid` · `:47` `_load_dtm_grid` | 690 | 최적 경로 비용면 — 표현별 표고를 DTM 격자에 다시 셈 | `run_route_design` → B05 Router | 기본 길(경로 탐색 모드) | 2026-10-25·17534a01a | 표본기 복사본 · implicit 을 **굳힌 격자 아닌 RBF 로 따로 셈** | +| 5 | `D03_PlanAnalysis/D03_PlanAnalysis_Lidar.py:64` `build_lidar` · `:88` `/plan/lidar` | 115 | 예정노선 LAS → `B04_PreProcess/lidar/` 에 짓기(DTM · 평활 안 함) | D03 화면 | 기본 길 | 2026-11-01·f6708c681 | — | +| 5 | `D03_PlanAnalysis/D03_PlanAnalysis_Terrain.py:291` `ensure_plan_terrain` | 427 | 예정노선 사업 전체 지형(창고 도엽 이어 붙임 → `models_plan/`) | D03 화면 | 기본 길 | 2026-10-30·db5a2f040 | — | +| 5 | `D03_PlanAnalysis/D03_PlanAnalysis_TerrainSource.py` | 181 | D03 겹 지형 원천 고름(sheet · lidar · design) | D03 Layers | 기본 길 | 2026-11-01·b3e62c7ae | — | +| 5 | `D03_PlanAnalysis/D03_PlanAnalysis_UI_Terrain.ts` | 141 | D 지형 받기 진행 · 범위 상자 | D03 화면 | 기본 길 | 2026-10-31·92fdf334b | — | +| 5 | `B07_DesignDetail/B07_DesignDetail_Engine_Cad_Lidar.py:59` `hillshade_png` | 220 | DTM → 음영기복 PNG | B07 평면도 「라이다 음영」 조각 · D03 Layers | 기본 길 | 2026-09-04·18c174036 | — | +| 5 | 〃 `:106` `build_lidar_plan_drawing` | — | 옛 「계획평면도(라이다)」 한 장 짓기 | — | **아무도 안 부름** | 〃 | 평면도 `lidar` 조각(`Router_Support_Plan.py:492`)이 대신 | +| 5 | `B07_DesignDetail/B07_DesignDetail_Router_Support_Basin.py:471` `_hillshade_for_box` | 622 | 확정 DTM(평활 우선) 도곽 자름 → 음영 | 평면도 조각 · 시험 | 기본 길 | 2026-11-01·b3e62c7ae | 확정 표현 implicit 이어도 dtm 평활을 읽음(641-2) · 필터 기본값 「csf」 낡음 | +| 5 | 〃 `:441` `lidar_source` · `:403` `LIDAR_ID` | — | 옛 plan_lidar 도면 입력 모음 | `Router_Support.py:72·82` 다시 내보내기만 | **아무도 안 부름** | 〃 | `plan_lidar` 종류 이름은 `Schema.py:21·67` · `Api_Fetch.ts:17·122` 에 남음 | +| 5 | `E03_StabSection/E03_StabSection_Router.py:225·488` · `E01_StabRegister/E01_StabRegister_Source.py:139` | 572 · 156 | 사면 단면 · 3D 지형 띠 — 복사본 `dtm_*.npz` 하나를 `DtmGridSampler` 로 | E01 · E03 화면 | 기본 길 | 2026-10-30·59610fecf · 2026-10-25·03beb7f7c | — | +| — | `E03_StabSection/E03_StabSection_Engine_Surface.py` | 185 | **관련 없음** — 사면 「활동면」 절편 계산(지표면 아님) | E03 | — | 2026-10-26·87928cb26 | — | + +### 5-1. 그 밖 표본기 소비자(설계 쪽 · 정리 대상 아님 · 참고) + +| 파일 | 하는 일 | 마지막 고친 날 | +|---|---|---| +| `B05_Profile/B05_Profile_Engine_Sections.py` · `_Sections_Node.py` · `logic/B05_Profile_Sections_Ground.ts` | 종횡단 지반선(파이썬 · TS 짝) | 2026-10-22 · 2026-11-01 | +| `B06_Section/B06_Section_Server_Calc_Prebuild.py` · `_Router_Calc.py` | B06 계산 묶음 지반 | 2026-11-01 · 2026-10-22 | +| `common_util/common_util_route_geometry.py` | 노선 지표면 밖 자름(3 m) | 2026-10-31 | +| `common_util/common_util_drainage_context.py` | 배수 세부 지반 | 2026-09-06 | +| `B05_Profile/B05_Profile_Engine_AsPlanned.py` · `_Router_PlanSource.py` · `_Router_RouteInitial*.py` · `_Engine_Skeleton.py` | 노선 추천 · 초기 노선 지반 | 2026-10-16 ~ 2026-11-02 | +| `A00_Common/design/logic/design_calc_node_stages.ts` · `B05_Profile/B05_Profile_Api_Replan.ts` · `logic/B05_Profile_Grade_Ground.ts` · `_Pipeline_RouteGround.ts` | 브라우저 · Node 격자 표고 | 2026-10-22 ~ 2026-10-31 | +| `common_util/common_util_project_copy.py` | 프로젝트 복사 때 지형 파일 | 2026-10-30 | + +## 6. 도구 · 시험 (도구 2 · 시험 40) + +| 무리 | 파일 | 줄 수 | 지키는 것 | 대상 | 쓰임 | 마지막 고친 날·커밋 | +|---|---|---|---|---|---|---| +| 6 | `tools/precompute_terrain.py` | 649 | 전국 도엽 지형 미리 셈(두 PC 나눔) | terrain_store | 도구만 | 2026-10-31·66f9c68a1 | +| 6 | `tools/precompute_contour_tiles.py` | 103 | 등고선 조각 미리 셈 | contour_tiles | 도구만 | 2026-10-31·a2ef41766 | +| 6 | `test_b04_ground_filters.py` | 121 | CSF · Grid · classification · 자동 고름 | 필터 | 시험 | 2026-11-01·3a29e0480 | +| 6 | `test_642_ptd_filter.py` | 52 | PTD 비탈 + 나무 | PTD | 시험 | 2026-11-01·3a29e0480 | +| 6 | `test_640_lidar_default.py` | 155 | 자동 고름 · implicit 점 수 · 지문 · 틈 닫기 | Ground · Pipeline · ModelContext | 시험 | 2026-11-01·773544e5c | +| 6 | `test_641_1_implicit_grid.py` | 177 | 굳힌 격자 · B07 · D03 같은 면 | sampler · B07 | 시험 | 2026-11-01·6db98d6b1 | +| 6 | `test_754_1_contour_outline.py` | 102 | 등고선 외곽 = 지표면 외곽 | Pipeline · Contour | 시험 | 2026-11-02·3f4fd188e | +| 6 | `test_343_1_preprocess_keep.py` · `test_343_3_browser_cache.py` | 246 · 197 | 같은 파일 다시 올림 = 살림 · 점군 이진 | Engine · PointPreview | 시험 | 2026-10-16·cf5de5641 · e0051bff7 | +| 6 | `test_preview_cost.py` | 52 | 미리보기가 분석 시간 안 늘림 | Structurize | 시험 | 2026-09-17·1a82df951 | +| 6 | `test_344_1_surface_sampler_mirror.py` · `test_344_1_sections_ground_mirror.py` · `test_344_1_terrain_grid_route.py` | 196 · 267 · 168 | 표본기 파이썬↔TS 거울 · 격자 통로 | sampler · Router_Terrain | 시험 | 2026-10-23 · 2026-10-23 · 2026-10-29 | +| 6 | `test_342_4_ground_unify.py` | 66 | 지반고 1 m 표본기 하나로 | sampler | 시험 | 2026-10-16·a22b72fb1 | +| 6 | `test_54_22_security.py` | 109 | 필터 · 표현 이름 경로 넘기 | sampler · Solver | 시험 | 2026-10-06·c8ca79063 | +| 6 | `test_633_grid_cell.py` | 110 | 격자 칸 = 좌표 간격 · 음영 | B07 · grid_cell | 시험 | 2026-10-31·a1092b6c7 | +| 6 | `test_route_trim_to_surface.py` · `test_edge_trim_3m_yonghwa.py` · `test_b06_sample_extend.py` | 113 · 132 · 83 | 지표면 끝 자름 · 넓힘 | route_geometry · sampler | 시험 | 2026-09-09 · 2026-09-17 · 2026-09-14 | +| 6 | `test_sheet_surface.py` · `test_509_2_sheet_grid.py` · `test_505_2_terrain_sheet.py` | 216 · 56 · 101 | 수치지형도 서피스 · 격자 · 고르기 | SheetSurface | 시험 | 2026-09-09 · 2026-10-31 · 2026-10-29 | +| 6 | `test_617_2_laplace_mirror.py` | 126 | 빠른 라플라스 = B04 옛 판 비트 동일 | terrain_laplace ↔ SheetMethods | 시험 | 2026-10-31·0055f494a | +| 6 | `test_607_terrain_store.py` · `test_614_terrain_reproject.py` | 222 · 125 | 창고 · 굽기 · 띠 옮김 | terrain_store · terrain_surface | 시험 | 2026-10-30 · 2026-10-31 | +| 6 | `test_612_precompute.py` · `test_618_precompute_split.py` | 125 · 195 | 미리 셈 도구 | tools | 시험 | 2026-10-31·88ec2da19 | +| 6 | `test_530_1_plan_terrain.py` | 225 | D 지형 받기 | D03 Terrain | 시험 | 2026-10-30·db5a2f040 | +| 6 | `test_624_4_plan_lidar.py` · `test_624_4b_plan_lidar_ui.py` · `test_637_lidar.py` · `test_637_4_reset_terrain.py` | 128 · 77 · 379 · 111 | LAS 나중 올리기(D03 · B05) | lidar_upload · D03/B05 Lidar | 시험 | 2026-10-31 · 2026-11-01 · 2026-11-01 · 2026-11-01 | +| 6 | `test_133_1_analysis_terrain.py` · `test_133_2_design_terrain.py` · `test_352_3_analysis_terrain_default.py` · `test_509_5_recommend_terrain.py` · `test_364_4_precompute_on_open.py` | 173 · 300 · 60 · 141 · 108 | 분석 · 설계 지형 고르기 | surface_confirmation · Router_Terrain | 시험 | 2026-10-21 ~ 2026-10-31 | +| 6 | `test_b04_contour_raster.py` · `test_b04_contour_equivalence.py` · `test_582_contour_lod.py` · `test_756_1_contour_band.py` · `test_615_contour_tiles.py` | 195 · 180 · 91 · 63 · 98 | 등고선 래스터 · 등가 · LOD · 띠 · 조각 | Contour · contour_tiles | 시험 | 2026-09-09 ~ 2026-11-02 | +| 6 | `fixtures/golden_472/project/B04_PreProcess/models/dtm_classification_smooth.npz` | — | 골든 지형 고정본 | 472 시험 | 시험 | — | + +- 시험 없음 — `filter_pmf` · `filter_ransac` · `build_tin` · `build_nurbs` · `build_meshfree` · `smooth_tin` · SheetMethods 다섯 비교 방식(laplace 밖). +- 이름만 비슷 · 관련 없음 — `test_91_ground_free.py` · `test_b06_ground_unlock.py`(원지반 잠금) · `test_532_3_e02_ground.py` · `E02_StabGround/*`(사면 지반) · `B06_Section_UI_Cross_Design_Surface.ts`(설계면) · `B04_PreProcess_Engine_SheetClip.py`(도엽 겹 자르기 · 지도). + +--- + +## 「아무도 안 부름」 6 + +| # | 자리 | 무엇 | +|---|---|---| +| 1 | `B07_DesignDetail_Engine_Cad_Lidar.py:106` | `build_lidar_plan_drawing`(약 115 줄) | +| 2 | `B07_DesignDetail_Router_Support_Basin.py:403·441` | `LIDAR_ID` · `lidar_source`(다시 내보내기만) | +| 3 | `B04_PreProcess_Router.py:356` | GET `/surface/point-cloud`(JSON) | +| 4 | `B04_PreProcess_Router.py:498` · `B04_PreProcess_Api_Fetch.ts:301` | GET `/surface/ground-stats` · `fetchSurfaceGroundStats` | +| 5 | `B04_PreProcess_Engine_ModelContext.py:27` | `SOURCE_FILTER_LABELS` | +| 6 | `config_system_terrain.py:12·13` | `MESH_GRID_SIZE` · `MESH_SMOOTHING_ITERATIONS`(`.env` 에만 값 남음) | + +확인 필요 4 — RANSAC 필터(API 로만) · Contour implicit RBF 폴백(dtm 없을 때만) · `plan_lidar` 도면 종류 이름(Schema · TS) · `SURFACE_CONFIRM_DEFAULT_FILTER`(WF1 LAS 길에서 덮어씀). + +## 정리 후보 + +1. **합침** — 표현별 표고 셈 세 벌(표본기 `build_surface_sampler` · 경로 탐색 `Solver._sample_surface_on_grid` · 등고선 `Contour._extract_loaded`)을 표본기 하나로 · 까닭: implicit 을 경로 탐색만 굳힌 격자 아닌 RBF 로 따로 셈 · 같은 면이 세 곳에서 갈릴 자리. +2. **합침** — 등고선→격자 두 판(B04 `SheetSurface` · `SheetMethods` 옛 판 ↔ `common_util_terrain_surface` · `_laplace` 흠 고친 판)을 공용 판 하나로 · 까닭: 거울 시험으로 묶은 같은 라플라스 두 벌 · B04 쪽은 굽기 방향 흠 그대로 · `_write_smoothed` 도 `smooth_dtm` 복사본. +3. **지움** — 옛 길: B07 plan_lidar 도면(1 · 2번 + 종류 이름) · B04 JSON 점군 · ground-stats 길 · `SOURCE_FILTER_LABELS` · `MESH_*` 설정 · 낡은 글(Ground · Pipeline 머리 「세 필터」 · WF1 「없으면 csf」 · B07 음영 기본 「csf」) · 까닭: 부르는 곳 없음 · 지금 기본(ptd)과 어긋남. +4. **지움 또는 그대로(사용자 고름)** — 필터 PMF · RANSAC(+ CSF · Grid)과 표현 TIN · NURBS · meshfree(+ Taubin 평활) · 까닭: 기본 길은 classification/PTD × DTM/implicit 뿐 · 넷은 관리자 비교용 · PMF · RANSAC 은 8-08 개명 뒤 손 안 댐 · RANSAC 화면 없음 · 시험 없음 · 표현 셋이 1번 세 벌 셈의 몸집 대부분. +5. **그대로** — 허용 목록 네 벌(Ground `_FILTERS` · Schema · sampler `SurfaceFilter` · UI `SOURCE_FILTERS`)은 4번 결정 뒤 한 번에 맞춤 · DB 기록 두 벌(`save_surface_analysis_to_db` ↔ `lidar_upload.save_models`)은 행 지움 규칙이 달라 의도된 갈래.