Files
Aislo/B04_wf1_Surface/B04_wf1_Surface_UI_MapLayers.ts
T
eomsangdonandClaude Opus 5 07c4a7897c feat(B04): 상세 배수유역 계산 — 관 매설 지점 편집 + 세부유역 분할
관 매설 지점을 기준으로 세부 배수유역을 나누는 기능을 B04 2D 지도에 추가한다.
경계는 B04 전처리 격자(03_road_routing.npz)의 road_slot — 1m 셀마다 물이 도달하는
도로 셀 — 을 담당 관으로 라벨링해 그 경계로 잡는다. 종단 Z는 경계를 긋지 않고
"도로 셀이 어느 관으로 흐르는가"만 정한다.

공용 승격 (B04 관리자 화면과 B05 사용자 화면이 같은 결과를 내야 함)
- common_util_drainage_detail.py: 관 보충(9)·세부유역 분할(10) 알고리즘
- common_util_drainage_context.py: 노선·종단 Z·좌표계 입력 준비
- common_util_drainage_pipes.py: 관 지점 정본 저장소(edits/pipe_points.json)
- common_util_route_profile.py: 종단 Z 해석기(계획고 > 경로 정점 > 지표면 > CSV)
- common_util_surface_sampler.py: B05 종횡단 sampler 이동
- B05 _prepare()의 노선 소스를 원청 계획노선 CSV로 정정(B04 격자와 누가거리 정합)

B04 신규 API
- GET  /{project_id}/drainage/pipe-points   저장분 조회(없으면 자동 생성)
- POST /{project_id}/drainage/detail-basins 편집 중 목록으로 재분할(저장 안 함)
- PUT  /{project_id}/drainage/pipe-points   모델 확정 시 관 지점·세부유역 커밋

B04 화면
- 관 마커 기본/자동/수동 색 구분, 계획선 스냅 드래그 이동
- 계획선 우클릭 "관 매설 추가" / 마커 우클릭 "관 매설 삭제"
- 표시 토글 2그룹(관 매설 / 세부 유역)을 유입 집중점과 분리
- "상세유역 분석" 버튼을 눌렀을 때만 재계산

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-01 21:48:28 +09:00

76 lines
3.2 KiB
TypeScript

/* =============================================================================
* 2D 지도 레이어 목록·기본값·색 (B04)
*
* 어떤 레이어를 다루는지, 처음에 무엇이 켜져 있는지, 무슨 색으로 그리는지만 모은다.
* 지도 뷰어 본체(`B04_wf1_Surface_UI_MapViewer.ts`)가 700줄 한계에 닿아 분리했다.
* 색 값의 정의처는 `ui_template_theme.css`(`--map-*`)이며 여기는 이름만 잇는다.
* ========================================================================== */
import { themeColor } from "@ui/ui_template_palette";
export const BACKGROUND_LAYERS = ["white", "satellite", "hybrid"] as const;
// 유수방향은 화면에 쓰지 않기로 해 목록에서 뺐다(2026-08-01 사용자 지시).
export const GIS_LAYERS = [
"지적도",
"행정구역_시군구",
"행정구역_읍면동",
"등고선",
"도엽_등고선",
"도엽_하천중심선",
"도엽_표고점",
"도엽_성절토",
"도엽_옹벽석축",
] as const;
export type BackgroundLayer = (typeof BACKGROUND_LAYERS)[number];
export type GisLayer = (typeof GIS_LAYERS)[number];
/* ── 처음 열었을 때 켜져 있을 레이어 (2026-08-01 사용자 지정) ──────────────
* 지도가 복잡해지지 않도록 실제로 자주 보는 것만 켠 채로 시작한다.
* 나머지는 버튼으로 그때그때 켠다. */
export const BACKGROUND_DEFAULT_ON: Record<BackgroundLayer, boolean> = {
white: true,
satellite: true,
hybrid: false,
};
export const GIS_DEFAULT_ON: Record<GisLayer, boolean> = {
지적도: false,
행정구역_시군구: true,
행정구역_읍면동: true,
등고선: false,
도엽_등고선: false,
도엽_하천중심선: true,
도엽_표고점: false,
도엽_성절토: false,
도엽_옹벽석축: false,
};
/** 등고 라벨(계곡선 수치) 기본 표시 여부. */
export const CONTOUR_LABEL_DEFAULT_ON = false;
/** 이만큼(px) 이하로 움직였다 뗐으면 클릭으로 본다 — 손떨림으로 선택이 안 되는 일을 막는다. */
export const CLICK_SLOP_PX = 4;
/** 레이어별 색은 `ui_template_theme.css`의 `--map-*`가 정의처다. 여기는 이름만 잇는다.
* (fallback 값은 CSS가 아직 안 붙은 첫 프레임 대비용 안전값) */
const GIS_LAYER_COLOR_TOKENS: Record<GisLayer, [name: string, fallback: string]> = {
지적도: ["--map-cadastral", "#f97316"],
행정구역_시군구: ["--map-sigungu", "#7c3aed"],
행정구역_읍면동: ["--map-eupmyeondong", "#22c55e"],
등고선: ["--map-contour", "#fdba74"],
도엽_등고선: ["--map-sheet-contour", "#a5b4fc"],
도엽_하천중심선: ["--map-sheet-stream", "#2563eb"],
도엽_표고점: ["--map-sheet-elev-point", "#f9a8d4"],
도엽_성절토: ["--map-sheet-cutfill", "#f43f5e"],
도엽_옹벽석축: ["--map-sheet-wall", "#0f766e"],
};
export const gisLayerColor = (layer: GisLayer): string =>
themeColor(...GIS_LAYER_COLOR_TOKENS[layer]);
/** 등고 라벨 표기 대상 레이어와 표고 속성 키 (gpkg=CTRLN_HG, 도엽=등고수치) */
export const CONTOUR_LABEL_KEYS: Partial<Record<GisLayer, string[]>> = {
등고선: ["CTRLN_HG"],
도엽_등고선: ["등고수치"],
};