# 2026-07-09 오버레이 라벨 표고 앵커 + 측점 거리 제한

**소요 시간**: 10분
**Context 사용량**: input 340k / output 6k tokens

## 문제 (스크린샷 제보)

1. 빨간 측점 라벨(0k000~6k998)이 수평선 부근에 전부 겹쳐서 깨진 글자처럼 보임
2. POI 라벨이 실제 지물보다 높게 떠서, 카메라(드론)가 전진하면 라벨이 계속 뒤로 밀림(시차 불일치)

## 원인

1. **측점 라벨엔 거리 제한이 없음** — POI는 maxPoiRange(기본 1000m) 필터가 있지만 측점은 없어서
   7km 앞 측점까지 전부 FOV 안 수평선 근처에 투영·중첩됨
2. **라벨 표고 근사가 틀림** — 직전 작업에서 측점 z를 "드론고도−24m ≈ 124m"로 근사했으나
   실제 지면은 ≈60m(경로표고 기본값 58이 도로에 붙는 것으로 확인) → 라벨이 지면보다
   약 60m 공중에 떠서 원근 시차가 안 맞아 전진 시 라벨이 뒤로 흐름.
   드론고도 모드(pz=드론고도−이격24)도 동일하게 124m 평면이라 같은 증상

## 수정 내용

### client/src/utils/geoData.ts
- KML 측점의 z 근사(드론고도−24) 제거 → z=0(표고 미상 표식) 유지

### client/src/components/overlay/StationOverlay.tsx
- **표고 미상(z≤0) 라벨을 '경로 표고'(dronePathZ) 평면에 앵커**:
  - 측점 라벨 sz: 유효 z 없으면 PATH_Z(경로표고) 사용
  - POI gz 폴백 체인: 보정값 → 중심선 z(>0만) → POI z(>0만) → PATH_Z
  - 경로표고 슬라이더 변경 시 라벨 캐시 재계산(500ms 디바운스, 기존 트리거에 dronePathZ 추가)
  - → **궤적을 도로에 맞추는 슬라이더 하나로 측점/POI 라벨 높이가 함께 보정됨**
- **측점 라벨에도 maxPoiRange 거리 제한 적용** — 원거리 측점 수평선 뭉침 해소
- **poiDroneHeight 기본값 true→false(지면고도 기준)**:
  - 실측 z 데이터셋(회덕)은 지물에 정확히 붙음(원래 이 모드가 정확)
  - 표고 미상 데이터셋(제주)은 경로표고 앵커로 일괄 보정 가능
  - 드론고도 모드는 UI 토글로 여전히 선택 가능

## 검증

- tsc+vite 빌드 통과, 54000 포트 새 번들(index-Nv1HLuS3.js) 서빙
- 기하 검증(계산): 지면 60m/드론 148m 기준, 124m 라벨은 300m 전방 지물 대비 화면상 약
  12% 위쪽에 투영(수평선 방향) → 전진 시 벌어짐. PATH_Z(58) 앵커 시 지물과 동일 평면 → 시차 일치

## 사용법 (사용자 안내)

- 새로고침 후 폴더 재선택 → '경로 표고' 슬라이더로 파란 궤적을 도로 노면에 맞추면
  측점·POI 라벨도 같은 평면으로 따라옴 (기본 58m가 대략 맞음)
- 측점 라벨 표시 거리는 'POI 표시범위'(maxPoiRange) 슬라이더로 조절

## 다음 단계 참고

- 지형 기복이 큰 구간은 단일 평면 앵커의 한계 있음 — 필요 시 구간별 z 또는 DEM 도입 검토
- RoutePanel 가시범위(초록 박스) 계산은 여전히 pt.z(0) 사용 — 부정확할 수 있으나 부차적
