Commit Graph
30 Commits
Author SHA1 Message Date
eomsangdonandClaude Opus 5 d14222242a refactor(B04/B05/공통): 지도 색상 토큰화, 배수유역 패널 i18n, 소개 페이지 단계명 통일
- ui_template_theme.css에 2D 지도 벡터 팔레트(--map-*) 33종을 유일한 정의처로 등록하고,
  캔버스에서 CSS 변수를 읽는 공통 유틸 ui_template_palette.ts(themeColor)를 신설.
  값은 한 번만 읽어 캐시하고 data-theme 변경 시 비운다(다크 전환 대응).
- B04 지도·유역 오버레이·흐름 화살표와 B05 배수유역도·유역선 편집·배관 마커의
  하드코딩 색상을 전부 토큰 조회로 교체. 계획선 색·굵기, 후광색은 공용 함수로 일원화.
- B05 배수유역 패널의 사용자 문구를 전부 ui_locales로 이관(제목, 레이어 토글 5종,
  도구 버튼 5종, 툴팁, 상태 문구 8종, 유역 제원 표기). B04 유역 분석 오버레이의
  버튼·갈래 토글·진행/실패 안내도 함께 전환. 관리자 진단용 결과 판독문은 원문 유지.
- A02 프로그램 소개의 6단계 제목과 A01 히어로 문구의 단계 나열을 진행단계 이름
  (전처리/종단설계/횡단설계/상세설계/수량산출/설계도서)과 일치시킴.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-01 14:35:42 +09:00
eomsangdonandClaude Opus 5 9b6547a418 feat(B04/B05/공통): 7단계 명칭 통일, B05 패널 드래그 리사이즈, B04 계획선 레이어, 2D 지도 좌드래그 팬 제거
- 진행단계 오버레이 버튼과 B그룹 페이지 제목을 파일입력/전처리/종단설계/횡단설계/
  상세설계/수량산출/설계도서로 통일(ko/en). i18n 키는 유지하고 값만 교체.
  B05 페이지 제목의 하드코딩 문구를 locale 참조로 교체.
- ui_template_resizer 공통 스플리터 신설. B05 하단 종단 패널은 위쪽 경계를 끌어
  높이 조절(늘어난 만큼 그래프만 신축, 도면 테이블 높이는 고정), 안쪽 우측
  배수유역 패널은 왼쪽 경계를 끌어 폭 조절(상한 = 하단 패널 폭의 70%).
  크기는 sessionStorage에만 저장하고 CSS 변수로 적용해 접기 규칙과 충돌하지 않게 함.
- B04 2D 지도에 계획선 레이어 추가. 계획노선 좌표를 주는
  GET /api/projects/{id}/planned-route 신설(B03 업로드 CSV → 사업지 좌표계 m).
  선 색·굵기는 MapRender에 상수로 두고 B05 배수유역도와 공유.
- B04 지도 오버레이 재배치: 객체 표시 라벨은 우측 최하단, 배수유역 정보는 좌측 최상단.
- B04 지도·B05 배수유역도에서 좌버튼 드래그 팬 제거(가운데 버튼 전용).
  유역선 핸들·배관 마커 편집은 좌버튼 그대로 유지, 팬 중에만 grabbing 커서.
- B05 배수유역도에 위성사진 표시 토글 추가(등고선 앞, 기본 on).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-01 14:05:58 +09:00
eomsangdonandClaude Opus 5 85eda04a8e feat(B04/B05): 지도 초기 화면을 도로 중심 + 여유 200m로 통일
B04 하단 지도와 B05 배수유역도가 같은 규칙으로 열린다 — 계획도로 중심을 화면 중앙에
두고 도로 전체 + 사방 200m가 보이는 배율(2026-08-01 사용자 지시).

- computeRouteView()를 공용 렌더 엔진(B04_wf1_Surface_UI_MapRender)에 두어 두 화면이
  같은 정의를 쓴다. 여유 거리는 ROUTE_VIEW_MARGIN_M 한 곳에서 정의.
- B04는 도로 범위를 알 방법이 없어 GET /surface/confirmed 응답에 route_bounds를 추가
  (B03 계획노선 CSV 범위를 프로젝트 좌표계로 변환). 노선이 없으면 배경 전체 보기로 폴백.
- B05는 기존 상대 배율(0.85배) 대신 같은 함수를 쓴다.
- 표본 실측: 노선 239x166m -> 여유 포함 639x566m가 화면에 들어온다.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-01 13:08:11 +09:00
eomsangdonandClaude Opus 5 306268b616 feat(B04/B05): 지도 레이어 기본 표시값 정의 + 명칭 정리
2026-08-01 사용자 지정 기본값을 한곳(BACKGROUND_DEFAULT_ON / GIS_DEFAULT_ON /
CONTOUR_LABEL_DEFAULT_ON)에 모아 정의한다.

- 켜짐: 백지도, 위성, 시군구, 읍면동, 세류(전체)
- 꺼짐: 하이브리드, 연속지적도, 등고선, 도엽등고선, 표고점, 성절토, 옹벽석축, 등고라벨
- 유수방향 레이어는 화면에서 제외(목록에서 삭제)
- 명칭: 세류(하천중심선) -> 세류(전체), 배수유역 재산정 -> 유역 분석
- 유역 갈래 기본값(1차 꺼짐 / 2차 켜짐 / 유역방향 꺼짐 / 평균흐름 켜짐)은 기존과 동일
- B05 배수유역도 초기 보기는 도로 기준 줌인으로 되돌림(B04 하단 지도는 배경 전체 보기 유지)

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-01 13:01:02 +09:00
eomsangdonandClaude Opus 5 a17b95f621 fix(B04/B05): 2D 지도 기준을 라이다에서 브이월드 범위로 + 배경 확보를 기준 박스 3x3으로
3D(라이다)와 2D(브이월드)는 다루는 범위가 다르다. 그런데 2D 지도가 열릴 때 라이다
범위에 맞춰 확대하고 있어서, 배경을 넓게 받아도 화면에 보이는 범위가 늘 같았다
(2026-08-01 사용자 지적).

- 확보 범위: 계획노선·기준 좌표를 덮는 기준 박스 + 주변 박스(SURFACE_MAP_NEIGHBOR_RINGS=1)
  = 3x3 배치. 미터/타일 여유폭 방식(SURFACE_MAP_MARGIN_TILES) 폐기.
  해상도(zoom 18)는 브이월드 기본 스케일 그대로 — 화소를 키우는 것이 아니다.
- 타일 상한 15는 양쪽에서 균등하게 줄여 기준 박스가 가장자리로 밀리지 않게 한다.
- B04 하단 지도·B05 배수유역도는 확보한 배경 전체가 보이도록 열린다.
- 표본 실측: 기준 박스 372x401m -> 12x15 타일 = 1463x1828m (이전 731x853m).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-01 12:35:51 +09:00
eomsangdonandClaude Opus 5 a9caf872b2 perf(B04/B05): 도엽 표시본 도입 + 배경 범위·도엽 기준을 계획노선으로 변경
- 도엽 병합본의 화면 표시용 사본 생성(B04_wf1_Surface_Engine_SheetView):
  프로젝트 + 500m로 잘라내고 좌표를 소수 7자리로 줄여 등고선 37.3MB -> 0.97MB.
  분석용 원본은 그대로 둔다(배수유역은 상류까지 넓은 범위가 필요).
- /geojson의 도엽 레이어를 파일 그대로 + ETag로 전송 — 매 요청 2.0초 재직렬화 제거(0.008초).
- /vworld-map도 ETag 전송으로 바꾸고, 프론트가 붙이던 `&_t=` 시간꼬리표 제거.
- 도엽 레이어를 브라우저 보관함 경유로 조회하고 준비화면에서 미리 담는다.
- 배경 지도 범위 = 라이다 범위 + 계획노선 범위 + 여유 300m(SURFACE_MAP_MARGIN_M).
- 도엽 기준 좌표 = 계획노선 시점·종점(없으면 라이다 중심). 같은 도엽이면 9매,
  이웃 도엽에 걸치면 12매. 표본 프로젝트는 기존 9매와 동일(회귀 없음).
- 선정에서 빠진 도엽 zip 정리(prune_sheets) — 표본에서 30매 중 21매가 다른 지역 잔재.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-01 11:47:29 +09:00
eomsangdon 13c2522f47 feat(B04/B05): 프로그레스 서클을 3D·지도·그래프 전 영역에 공통 적용
- 공통 서클 양식을 로딩 스피너(.ui-spinner) 기준으로 통일하고 overlay 옵션 신설
  (컨테이너 정중앙 배치를 페이지별 CSS 없이 처리)
- B05 3D: 위쪽 18% → 뷰포트 정중앙 (하단 패널에 가려져도 무방)
- B04 포인트클라우드 뷰어: setLoading() 신설, render() 시 자동 해제
- B04 지형 뷰어: GLTF/PLY 로더 진행 이벤트로 실제 바이트 진행률 표시
- B04 2D 지도: 도엽 레이어 n/10 진행률
- B05 종단면 그래프: body-wrap으로 감싸 서클 유지, 자료 조회 전후로 토글
- B05 배수유역도: 배경도 → 도엽 레이어 → 세부유역 산정 단계 진행률
2026-08-01 09:29:53 +09:00
eomsangdon 4501f3b19e auto: 2026-08-01 08:55 (EOMSANGDON-HOME) 2026-08-01 08:55:01 +09:00
eomsangdonandClaude Fable 5 500a3c9047 fix(B04): 배수유역 상태 문구 전용 줄 분리 + 저장분 없을 때 안내
증상 두 가지
  1. 재산정 버튼을 눌러도 프론트에 아무 안내가 없었다.
     오버레이가 지도 자체 상태(.b04-map__status)에 문구를 썼는데,
     loadLayers 가 같은 칸에 3곳에서 덮어써 즉시 지워졌다.
  2. 페이지 접근 시 배수유역이 안 보였다.
     응답 캐시 파일(00_watershed_response.json)이 아직 없어 자동 조회가
     빈 손으로 끝나는데, 그 사실을 화면에 알리지 않아 이유를 알 수 없었다.

조치
- 배수유역 전용 상태 줄(.b04-map__watershed-status)을 컨트롤 영역에 따로 둔다.
  지도 로딩 문구와 서로 덮어쓰지 않는다.
- 컨트롤에 배수유역 그룹을 만들어 재산정 버튼 + 갈래 토글 4종 + 상태 줄을 묶었다.
- 진행 상태를 버튼 라벨에도 반영: 배수유역 재산정 -> 분석 중… / 불러오는 중…
- 결과 문구에 출처와 소요를 붙인다: [저장분] ... / [재산정 28.4초] ...
- 저장분이 없으면 오류가 아니라 안내로 표시:
  "저장된 배수유역 분석이 없습니다. [배수유역 재산정]을 누르세요."
- 실패하면 버튼 활성 상태를 되돌려 껐다 켠 것처럼 보이지 않게 했다.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-31 21:26:32 +09:00
eomsangdonandClaude Fable 5 79fe2fb7c9 feat(B04): 표본 화살표 + 오버레이 갈래별 토글 버튼
화살표가 안 보이던 문제
  1m 격자를 도엽 전체 배율로 보면 셀이 1~2px 다. 줌 상한이 8배라 셀이
  화살표 최소 크기(7px)에 절대 못 미쳐 채움색만 보였다.
  -> 셀마다 그리지 않고 화면상 약 22px 간격이 되도록 건너뛰며 표본만 그린다.
     화살표 크기는 그 간격에 맞춰 커진다. 흐름장을 읽는 표준 방식이다.
  -> 채움색 위에서도 읽히도록 흰 테두리를 한 겹 깔고 그 위에 그린다.

갈래별 토글 버튼 추가 (1차 유역 / 2차 유역 / 유역 방향)
  GIS 버튼 줄에 배수유역 전체 토글 옆으로 붙는다. 전체 토글이 꺼져 있으면
  갈래 설정과 무관하게 아무것도 그리지 않는다.
  그리는 순서는 유역방향(격자/화살표) -> 1차 유역 -> 2차 유역/관.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-31 21:09:20 +09:00
eomsangdonandClaude Fable 5 395e6b4b13 fix(B04): 배수유역 오버레이가 화면에 안 그려지던 문제
분석은 돌고 상태 문구도 나오는데 지도에는 아무것도 안 보였다.

원인: 프레임 함수 이름이 draw() 가 아니라 drawVectorLayer() 라
오버레이 draw 호출을 끼워 넣는 치환이 조용히 실패했다. 호출 자체가
소스에 없었다.

- drawVectorLayer() 안, GIS 레이어와 등고 라벨 뒤에 오버레이 draw 삽입.
  격자/화살표가 등고선을 덮어야 읽히므로 맨 위에 얹는다.
- drawPrimaryRegion 이 drawGridCells 를 한 번 더 부르던 중복 제거
  (draw 체인이 이미 먼저 호출한다).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-31 21:02:52 +09:00
eomsangdonandClaude Fable 5 8a0d640e0e refactor(B04/B05): 배수유역 분석을 B04로 이관, B05는 저장분 소비만
분석이 30초 걸리는데 B05는 일반 사용자 화면이다. 관리자 확인용 B04에서
한 번 돌려 저장하고, B05는 그 결과를 읽어 관 보충과 세부유역만 처리한다
(2026-07-31 사용자 지시).

노선 원천 변경
- B05 확정 경로 -> B03 업로드 계획 노선 파일(CSV). 분석이 노선 설계보다
  먼저 끝나 있어야 하기 때문. 샘플 planned_route_sample_epsg5187.csv 로 검증.
- common_util_route_geometry.py 신설 — RouteVertex/StructureCandidate/누가거리
  보간/세류 교차점/계획 노선 CSV 리더. B04와 B05가 같은 표현을 쓰도록 공용화.
  열 이름은 대소문자·한글 표기를 함께 받는다(B03이 여러 형식 수용 예정).

B04 (관리자 확인용, 신규)
- Engine_Watershed_{Grid,Stream,Descent,Flow,Expand,Export} — B05에서 git mv
- Engine_Watershed_Analyze.py — 1~8단계 오케스트레이션
- Router_Watershed.py — GET /drainage/primary-region
- UI_Watershed.ts — 2D 지도 GIS 레이어 그룹에 "배수유역" 토글 추가.
  격자/화살표/세류망/1차영역/2차유역/기본관을 겹쳐 그린다.
- 저장 위치 B05_wf2_Route/drainage -> B04_wf1_Surface/drainage
- 03_road_routing 단계 추가: B05가 세부유역을 나눌 최소 배열(셀->도로셀 귀속,
  유하장, 강도, 도로셀 제원, 셀 표고) + 계획도로선/기본배관/2차유역 기하

B05 (일반 사용자용, 축소)
- Engine_Drainage_Basin.py — B04 산출물 로더 + 관 보충(9) + 측구 라우팅/세부유역(10,11)
- Engine_Drainage.py 는 관경 산정만 남기고 322 -> 27줄
- Router_Drainage.py 509 -> 142줄. POST /drainage/basins 만 남김
- 화살표·격자·강도 띠 렌더 제거. 계획도로선/기본배관/2차유역만 받는다

삭제
- _legacy_watershed/ 4파일 (능선 행진 방식 원본 보관본)
- Engine_Watershed_Basin.py (B04 Analyze + B05 Drainage_Basin 으로 분할)
- GET /drainage/candidates 와 propose_structure_stations (구방식 후보 제안)

E2E 검증 (실데이터)
  B04 분석 28.2s -> 저장(geojson 11KB + npz 2.6MB)
  B05 로드 + 세부 설계 0.11s   <-- 30초가 0.1초로
  면적 457,404m2 로 B04 2차 유역과 정확히 일치
  관 편집 재산정 0.12s, 관 3개 -> 세부유역 3개, 면적 보존

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-31 20:57:09 +09:00
eomsangdon 86d27add43 auto: 2026-07-28 18:33 (EOMSANGDON-HOME) 2026-07-28 18:33:47 +09:00
eomsangdon 0c51aef49e auto: 2026-07-28 18:28 (EOMSANGDON-HOME) 2026-07-28 18:28:02 +09:00
eomsangdon 5ee3b7e2cb auto: 2026-07-28 18:25 (EOMSANGDON-HOME) 2026-07-28 18:25:58 +09:00
eomsangdon 5e545d2b14 auto: 2026-07-28 18:19 (EOMSANGDON-HOME) 2026-07-28 18:19:57 +09:00
eomsangdon b55d10ddd6 auto: 2026-07-28 18:13 (EOMSANGDON-HOME) 2026-07-28 18:13:07 +09:00
eomsangdon 14724f4154 auto: 2026-07-28 18:07 (EOMSANGDON-HOME) 2026-07-28 18:07:38 +09:00
eomsangdon 7f2eec20fd auto: 2026-07-26 19:36 (ESD_LAPTOP) 2026-07-26 19:36:21 +09:00
eomsangdon d252c4e78a auto: 2026-07-26 19:29 (ESD_LAPTOP) 2026-07-26 19:29:27 +09:00
eomsangdon 721679fe5e auto: 2026-07-26 19:29 (ESD_LAPTOP) 2026-07-26 19:29:06 +09:00
eomsangdon 1a89a468d1 auto: 2026-07-26 19:16 (ESD_LAPTOP) 2026-07-26 19:16:57 +09:00
eomsangdon 2a7f11c102 auto: 2026-07-26 19:14 (ESD_LAPTOP) 2026-07-26 19:14:19 +09:00
eomsangdon e064f88856 auto: 2026-07-26 18:58 (ESD_LAPTOP) 2026-07-26 18:58:48 +09:00
eomsangdon 54ece3f1cb auto: 2026-07-26 18:55 (ESD_LAPTOP) 2026-07-26 18:55:42 +09:00
eomsangdon 0a1913eb6c 260726_2 2026-07-26 14:06:04 +09:00
eomsangdon 516c78ec7e 260718_0 2026-07-18 11:48:57 +09:00
eomsangdon 33815e0855 260717_3 2026-07-17 17:26:11 +09:00
eomsangdon f63e44fefd 260717_2 2026-07-17 17:16:09 +09:00
eomsangdon cf459f97a6 260717_0 2026-07-17 15:11:31 +09:00