- 클라이언트(React/Vite): Video.js 플레이어, 하단 스테이션바, POI/구조물 영상 오버레이, 카메라 파라미터 보정, 미니맵/RoutePanel - 서버(Express): Range 스트리밍, HLS 변환, 프레임 추출, tus 업로드, 주석 API - 최근 작업: 스테이션바 종점역 표출/양끝 정렬/미도착(재생불가) 표시, POI 라벨 '구분' 우선·컴팩트 팝업·겹침제외 토글·동일좌표 다중행, 진행방향(상/하) 우선 표출, 커서 배지 크기·픽셀 떨림 개선 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
31 lines
1.8 KiB
Markdown
31 lines
1.8 KiB
Markdown
# POI 거리필터 — 앞/옆 분리 → 단일 표시 범위(직선거리)로 통합
|
|
|
|
**날짜**: 2026-06-24
|
|
**수정 파일**: `client/src/components/overlay/StationOverlay.tsx`
|
|
|
|
## 요구
|
|
"POI 앞쪽/옆쪽"을 **"POI 표시 범위"** 하나로 통합. 드론 위치와의 **직선거리**를 기준으로
|
|
범위 안이면 표시, 밖이면 제외.
|
|
|
|
## 구현
|
|
- 비등방 필터(`fwd > MAX_FRONT || |side| > MAX_SIDE`)를 **단일 반경 필터**로 교체:
|
|
```ts
|
|
if ((cc.distH ?? 0) > MAX_RANGE) continue; // distH = 드론↔POI 수평 직선거리(m, 고도차 무시)
|
|
```
|
|
`cc.distH`는 `toCameraCoords`가 항상 채우는 수평 평면 직선거리.
|
|
- 상태 `maxPoiFront`/`maxPoiSide` → **`maxPoiRange`** 단일화(ref/effect/precompute 인자/호출부/의존성 일괄).
|
|
- 패널 UI: 슬라이더 2개("POI 앞쪽"/"POI 옆쪽") → **1개 "POI 범위"**(10~1000m, 툴팁: "드론 위치와의 수평 직선거리 — 범위 안만 표시").
|
|
- 기본값(`DISPLAY_DEFAULTS`): `maxPoiFront 310 / maxPoiSide 135` → **`maxPoiRange 300`**. "기본값" 버튼·초기 useState 공유.
|
|
- 영속화(localStorage `ghivideo:calib`): `maxPoiRange` 저장. **구버전 마이그레이션** — 저장값에 `maxPoiRange`가 없고 `maxPoiFront`만 있으면 그 값으로 복원.
|
|
|
|
## 참고
|
|
- 직선거리는 수평 평면거리(distH) 사용(기존 앞/옆도 평면 분해였음 → 일관). 드론 높이(~35m)는 무시되나
|
|
100m+ 범위에선 3D 직선거리와 거의 동일.
|
|
- 트레이드오프: 단일 반경이라 "앞으로 멀리 + 옆으로 좁게"는 더 이상 불가(사용자 요청대로 단순화).
|
|
|
|
## 검증
|
|
- `npm run build -w client` (node20) tsc + vite build 통과.
|
|
|
|
**소요 시간**: 약 15분
|
|
**Context 사용량**: input ~165k / output ~5k tokens
|