feat: 스테이션바 측점 정확도 개선 + 영상 컨트롤 UI 통합 + 종합 기술문서

스테이션바/측점(체이니지)
- 역 재진입 마커 누락 수정: 측점기준 탐지에 좌표근접(pxPassesTo) 합집합 보강(중복 24px 제거)
- kmExists 판정: 좌표 반경만으로 잡힌 통과는 측점값 라벨/검색에서 제외(마커 동그라미는 유지)
- 측점값 라벨 겹침 숨김(좌측 우선), 동일항목 브래킷 클러스터
- 측점 검색 순환(통과방향 다음→끝에서 처음), 마커 기준 후보 산출, 입력값 유지/blur 삭제
- 연속 체이니지 수직투영 유틸 분리(client/src/utils/chainage.ts), Minimap 컴포넌트 추가

영상 컨트롤 UI
- 선형/드론궤적/좌측패널 토글을 재생바로 통합(settingsStore 공유·persist)
- 드론 GPS·고도 HUD 상시 표시, 경로표고·투명도 항상 노출, 겹침제외 버튼 숨김
- 재생바 요소 재배치(좌측패널→선형→드론궤적→드론위치정보→시설등급), 활성색 amber 통일

문서/도구
- 종합 기술명세서(인계+특허 기초) md/html/pdf 3종, UI개선 보고서 3종
- md→html→pdf 변환 스크립트(scripts/md2docs.sh) + 스타일(docs/assets/report.css)
- 작업 히스토리 다수 추가(docs/history/)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-29 14:56:27 +09:00
co-authored by Claude Opus 4.8
parent 78fc090360
commit e9052143d7
36 changed files with 3308 additions and 285 deletions
+20
View File
@@ -22,6 +22,18 @@ interface SettingsStore {
/** 화면 POI 겹침제외(겹치면 1개만). true=겹친 것 숨김(기본), false=모든 POI 표시. */
poiOverlapExclude: boolean;
setPoiOverlapExclude: (v: boolean) => void;
/** 좌측 노선 패널(RoutePanel) 표시 여부. '화면표시 옵션' 토글로 제어. 기본 표시. */
showRoutePanel: boolean;
setShowRoutePanel: (v: boolean) => void;
/** 측점 진단 HUD(드론 GPS·투영측점) 하단바 표시 여부. 기본 off. */
showStationDiag: boolean;
setShowStationDiag: (v: boolean) => void;
/** 선형(중심선) 영상 오버레이 표시 여부. 기본 표시. (VideoPlayer 바 토글로 제어) */
showCenterline: boolean;
setShowCenterline: (v: boolean) => void;
/** 드론 궤적 영상 오버레이 표시 여부. 기본 표시. (VideoPlayer 바 토글로 제어) */
showDronePath: boolean;
setShowDronePath: (v: boolean) => void;
}
const DEFAULT_GRADE_FILTER: Record<string, boolean> = {
@@ -39,6 +51,14 @@ export const useSettingsStore = create<SettingsStore>()(
set((s) => ({ gradeFilter: { ...s.gradeFilter, [grade]: checked } })),
poiOverlapExclude: true,
setPoiOverlapExclude: (v) => set({ poiOverlapExclude: v }),
showRoutePanel: true,
setShowRoutePanel: (v) => set({ showRoutePanel: v }),
showStationDiag: false,
setShowStationDiag: (v) => set({ showStationDiag: v }),
showCenterline: true,
setShowCenterline: (v) => set({ showCenterline: v }),
showDronePath: true,
setShowDronePath: (v) => set({ showDronePath: v }),
}),
{
name: 'ghivideo.settings',