This commit is contained in:
2026-07-15 18:33:33 +09:00
parent 6b1583103f
commit f533082537
201 changed files with 19776 additions and 563 deletions
+28
View File
@@ -0,0 +1,28 @@
---
type: page-api
status: stable
page_id: B05_wf2_Route
related_pages: ["[[B05_wf2_Route/B05_frontend]]", "[[B05_wf2_Route/B05_backend]]", "[[B05_wf2_Route/B05_db]]"]
last_updated: 2026-07-12
source: 상위 프로젝트 B05_wf2_Route_Router.py 실 코드 직접 확인 (2026-07-12)
---
# B05_wf2_Route — API
기본 prefix: `/api/projects` (`B05_wf2_Route_Router.py:30`). 공통 세션·오류 형식은 [[../../concepts/auth_rbac]], [[../../concepts/api_common]]을 참조한다.
| 항목 | 위치 | 역할 |
|---|---|---|
| `POST /{project_id}/route/solve` | `B05_wf2_Route_Router.py:33` | RouteSolveRequest 검증, 경로 계산, 결과 3종 DB 저장 |
| `POST /{project_id}/route/confirm` | `B05_wf2_Route_Router.py:136` | 최신 DRAFT 경로를 CONFIRMED로 변경 |
## solve 처리 결과
| 항목 | 역할 |
|---|---|
| `route_id` | 새 경로 식별자 |
| `total_length_m` | 계산 경로 총연장 |
| `metrics` | 경사·절성토량·비용 등 통계 |
| `required_points_ok` | BP/EP/CP 조건 충족 여부 |
| `route_data_path` | GeoJSON LineString 상대경로 |
오류는 표준 `{"status":"error","message":...}` 형식으로 반환한다.
@@ -0,0 +1,50 @@
---
type: page-backend
status: stable
page_id: B05_wf2_Route
related_pages: ["[[B05_wf2_Route/B05_frontend]]", "[[B05_wf2_Route/B05_api]]", "[[B05_wf2_Route/B05_db]]", "[[B05_wf2_Route/B05_dependencies]]"]
last_updated: 2026-07-12
source: 상위 프로젝트 B05_wf2_Route 실 코드 직접 확인 (2026-07-12)
---
# B05_wf2_Route — Backend
## 요청·응답 모델
| 항목 | 위치 | 역할 |
|---|---|---|
| `RoutePoint` / `CirclePoint` | `B05_wf2_Route_Schema.py:10,20` | BP·EP·CP와 AP·FP 입력 검증 |
| `RouteSolveRequest` | `B05_wf2_Route_Schema.py:30` | 지표면·알고리즘·등급·제약·가중치 검증 |
| `RouteSolveResponse` | `B05_wf2_Route_Schema.py:84` | route ID·길이·메트릭·GeoJSON 상대경로 응답 |
| `RouteConfirmResponse` | `B05_wf2_Route_Schema.py:96` | 확정 route ID와 confirmed 상태 응답 |
## 경로 계산 엔진
| 항목 | 위치 | 역할 |
|---|---|---|
| `run_route_design()` | `B05_wf2_Route_Engine.py:68` | 입력 모델을 경로 설계 오케스트레이터로 실행 |
| `solve_optimal_route()` | `B05_wf2_Route_Engine_Solver.py:278` | DTM 격자·비용면·선택 알고리즘 기반 최적화 |
| `single_segment_dijkstra()` | `B05_wf2_Route_Engine_Geometry.py:149` | 단일 구간 격자 Dijkstra 탐색 |
| `solve_ridge_valley_route()` | `B05_wf2_Route_Engine_RidgeValley.py:510` | ridge-valley 후보와 제약 기반 경로 탐색 |
| `load_or_build_skeleton()` | `B05_wf2_Route_Engine_Skeleton.py:275` | D8 흐름누적 skeleton 캐시·생성 |
| `_build_cost_surface()` | `B05_wf2_Route_Engine_Solver.py:173` | 경사·곡률·회피영역 기반 비용면 생성 |
| `_fillet_alignment()` | `B05_wf2_Route_Engine_RidgeValley.py:406` | 굴곡부 fillet 정렬·곡선반경 반영 |
## 기하·결과 변환
| 항목 | 위치 | 역할 |
|---|---|---|
| `compute_gradients()` | `B05_wf2_Route_Engine_Geometry.py:33` | 격자 경사 계산 |
| `circumradius_2d()` | `B05_wf2_Route_Engine_Geometry.py:52` | 3점 곡선반경 계산 |
| `circle_intrusions()` | `B05_wf2_Route_Engine_Geometry.py:90` | 회피·금지 원 침범 검사 |
| `_route_geojson()` / `_sample_render_points()` | `B05_wf2_Route_Engine.py:20,32` | LineString 저장·렌더링 포인트 변환 |
## 라우터·workflow
| 항목 | 위치 | 역할 |
|---|---|---|
| `solve_route()` | `B05_wf2_Route_Router.py:34` | 계산 실행·DB route/points/statistics 저장·stage 2 완료 |
| `confirm_latest_route()` | `B05_wf2_Route_Router.py:137` | 최신 경로 확정·stage 2 완료·후속 단계 stale 전파 |
| `start_stage()` / `complete_stage()` / `fail_stage()` | `B05_wf2_Route_Router.py:51,96,112,117,122,128,152` | WF2 상태 전이 → [[../../concepts/workflow_state]] |
## 기술부채
| 항목 | 위치 | 역할 |
|---|---|---|
| 700줄 초과 | `B05_wf2_Route_Engine_RidgeValley.py:1` | 781줄; ridge-valley 기능 분할 검토 |
| 700줄 근접 | `B05_wf2_Route_Engine_Solver.py:1` | 654줄; 비용면·최적화 분리 검토 |
+36
View File
@@ -0,0 +1,36 @@
---
type: page-db
status: stable
page_id: B05_wf2_Route
related_pages: ["[[B05_wf2_Route/B05_backend]]", "[[B05_wf2_Route/B05_api]]"]
last_updated: 2026-07-12
source: 상위 프로젝트 B05_wf2_Route_Repository.py 실 코드 직접 확인 (2026-07-12)
---
# B05_wf2_Route — DB 사용 관계
테이블 정의는 [[db_schema/route_profile]]에서 1차 관리한다.
| 항목 | 위치 | 역할 |
|---|---|---|
| `routes` | `B05_wf2_Route_Repository.py:27` | surface model·제어점·옵션·GeoJSON 경로 저장 |
| `route_points` | `B05_wf2_Route_Repository.py:75` | chainage·고도·경사별 렌더링 포인트 저장 |
| `route_statistics` | `B05_wf2_Route_Repository.py:109` | 총연장·경사·절성토량·비용 통계 저장 |
## Repository 함수
| 항목 | 위치 | 역할 |
|---|---|---|
| `_validate_stage_path()` | `B05_wf2_Route_Repository.py:18` | B05 route 상대경로 이탈 방지 |
| `create_route()` | `B05_wf2_Route_Repository.py:27` | 계산 결과 route 레코드 생성 |
| `insert_route_points()` | `B05_wf2_Route_Repository.py:75` | 샘플 포인트 일괄 저장 |
| `create_route_statistics()` | `B05_wf2_Route_Repository.py:109` | 경로 통계 저장 |
| `get_latest_route()` | `B05_wf2_Route_Repository.py:148` | 프로젝트 최신 경로 조회 |
| `confirm_route()` | `B05_wf2_Route_Repository.py:175` | 경로 상태 CONFIRMED 전환 |
## 저장 경로
| 항목 | 역할 |
|---|---|
| `routes.route_data_path` | 프로젝트 루트 기준 `B05_wf2_Route/route/` 내 GeoJSON 상대경로 |
| `route_points` | DB에 렌더링용 샘플 좌표 저장 |
상세 경로 규칙: [[storage_paths]].
@@ -0,0 +1,29 @@
---
type: page-dependencies
status: stable
page_id: B05_wf2_Route
related_pages: ["[[B05_wf2_Route/B05_frontend]]", "[[B05_wf2_Route/B05_backend]]"]
last_updated: 2026-07-12
source: 상위 프로젝트 B05_wf2_Route import 구문·엔진 직접 확인 (2026-07-12)
---
# B05_wf2_Route — Dependencies
공유 의존성 정의는 [[../../concepts/dependencies]]에 둔다.
| 항목 | 역할 |
|---|---|
| Whitebox | D8 흐름누적 기반 skeleton 보조 |
| GeoPandas | 지표면·공간 데이터 처리 |
| Shapely | 경로·금지영역 기하 연산 |
| NumPy | 격자·비용면·Dijkstra 계산 |
| SciPy | 격자 보간·수치 계산 보조 |
| aiomysql | routes·route_points·route_statistics Raw SQL |
## 페이지 파일별 연결
| 파일 | 위치 | 역할 |
|---|---|---|
| `B05_wf2_Route_Engine_Skeleton.py` | `:1` | Whitebox/NumPy 흐름누적 skeleton |
| `B05_wf2_Route_Engine_RidgeValley.py` | `:1` | NumPy 기반 ridge-valley 탐색 |
| `B05_wf2_Route_Repository.py` | `:1` | aiomysql 비동기 저장 |
| `B05_wf2_Route_UI_Page.ts` | `:1` | TypeScript DOM·공통 UI 렌더링 |
@@ -0,0 +1,44 @@
---
type: page-frontend
status: stable
page_id: B05_wf2_Route
related_pages: ["[[B05_wf2_Route/B05_backend]]", "[[B05_wf2_Route/B05_api]]", "[[B05_wf2_Route/B05_db]]"]
last_updated: 2026-07-12
source: 상위 프로젝트 B05_wf2_Route 실 코드 직접 확인 (2026-07-12)
---
# B05_wf2_Route — Frontend
## 화면과 상호작용
| 항목 | 위치 | 역할 |
|---|---|---|
| `renderB05Route()` | `B05_wf2_Route_UI_Page.ts:74` | 제어점·지표면·제약·결과 3단 UI 렌더링 |
| 경로 계산 실행 | `B05_wf2_Route_UI_Page.ts:285` | 입력값을 `solveRoute()`로 전송하고 결과 메트릭 표시 |
| 경로 확정 | `B05_wf2_Route_UI_Page.ts:311` | 최신 계산 경로를 `confirmRoute()`로 확정 |
| workflow 상태 조회 | `B05_wf2_Route_UI_Page.ts:337` | 진입 단계와 진행상태 확인 |
| B 페이지 scaffold | `B05_wf2_Route_UI_Page.ts:354` | 공통 단계 내비게이션과 페이지 이동 |
## API 클라이언트
| 항목 | 위치 | 역할 |
|---|---|---|
| `solveRoute()` | `B05_wf2_Route_Api_Fetch.ts:83` | 경로 탐색 실행 요청 |
| `confirmRoute()` | `B05_wf2_Route_Api_Fetch.ts:94` | 최신 경로 확정 요청 |
| `RouteSolveRequest` | `B05_wf2_Route_Api_Fetch.ts:24` | 지표면·제어점·제약 입력 타입 |
| `RouteSolveResponse` | `B05_wf2_Route_Api_Fetch.ts:40` | 경로 ID·길이·메트릭·저장경로 타입 |
## 입력 그룹
| 항목 | 역할 |
|---|---|
| BP/EP/CP | 시작점·끝점·경유 제어점 |
| AP/FP | 회피 원·금지 원과 반경 |
| filter/method/smooth | 지표면 필터·표현·평활화 선택 |
| grade/paved/curve radius | 임도 등급·포장·최소 곡선반경 |
| uphill/downhill/weights | 종단경사 제한과 비용 가중치 |
현재 코드에는 WebCAD 노선 폴리라인 편집·렌더링 컴포넌트가 없다.
## 기술부채
| 항목 | 위치 | 역할 |
|---|---|---|
| WebCAD 미구현 | `B05_wf2_Route_UI_Page.ts:74` | 결과는 메트릭·경로 저장경로 중심으로 표시 |
| CSS 분리 검토 | `B05_wf2_Route_UI_Style.css:1` | 132줄 페이지 전용 스타일 |