- 제주 DJI 시간기반 비행로그(CSV) 파싱 어댑터: 세그먼트 창 정렬, 가상 fps 환산 - 분할 영상(이름 오름차순) 연속재생 + 좌상단 영상목록 콤보(선택 재생), 세그먼트별 드론 로그 재정렬 - KML 다중 파일 병합 파싱: STA 체이니지 측점(71개) + 지장물 신포맷(타입/이름/텍스트박스_색상) - 시설물 라벨: 지정색 배경 박스 + 흰 글자, 팝업 중앙 정렬, 호버 구간 깜빡임 수정 - 카메라 자동감지(djmd: ZenmuseP1, focal 29.9mm) + <영상명>.camera.json PC 저장/폴더 자동 적용 - Yaw 자동추정(GPS 진행방위 기반) + 라벨 드래그 Yaw 역산 모드 - 스테이션바: GPS 이동거리 진행도(호버 시 정지), 노선밖 거리 표기, 원거리 구조물 마크 제외 - 서버: /api/camera 라우트, ecosystem 포트 54000·제주 데이터 경로 - docs/history: 작업 이력 21건 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
3.4 KiB
3.4 KiB
2026-07-09 제주 DJI 비행로그 드론궤적 어댑터
소요 시간: 30분 Context 사용량: input 175k / output 12k tokens
문제
제주 데이터 폴더 선택 시 드론 궤적 오버레이가 표시되지 않음.
원인
클라이언트 지리정보 파이프라인(폴더 선택 → geoData.ts 파싱 → geoStore → StationOverlay 투영)이 회덕 v2.0 프레임 기반 CSV(frame_cnt,latitude,…,yaw,pitch,roll,focal_len) 전용이었음. 제주 CSV는 DJI 비행로그 시간 기반(time(millisecond),latitude,…,compass_heading,gimbal_heading,…)이라:
- 위치 폴백 인덱스로 컬럼이 밀림 — frame←ms값(89500~), altitude←X(E) 평면좌표, yaw←Y(N), focalLen←pitch 등 전부 오염
effectiveFps(=마지막 frame ÷ 영상길이) 자기보정이 깨져 시간↔프레임 변환 실패- 분할 영상 4개(_0002~_0005) 중 첫 영상 길이(197.1s)에 로그 전체(672.6s)가 압축 매핑됨
- 경로표고 슬라이더 상한(중심선 z 기반, 폴백 60m)이 제주 지형(드론 148m ASL)에 못 미침
수정 내용
client/src/utils/geoData.ts
parseDroneFrames:time(millisecond)헤더 감지 시 DJI 시간 기반 브랜치로 분기- 컬럼: lat/lon/
altitude_above_seaLevel(meter), 자세는 gimbal_* 우선(기체 compass/pitch/roll 폴백), focalLen=24mm 기본 frame = ((time−t0)/1000 − offsetSec) × 59.94(가상fps)— effectiveFps 자기보정과 정합SegmentWindow(offsetSec/durationSec)로 재생 영상 구간 밖 행 클리핑
- 컬럼: lat/lon/
findVideoFiles: 영상 이름순 정렬(DJI 분할본 _0002 먼저 확정)probeVideoDuration: objectURL +preload=metadata로 영상 길이만 측정loadFolderGeoData: 첫 영상 길이 측정 → 세그먼트 창 전달, 분할본 감지 시 콘솔 경고parseRouteMeta: 임의 접두*.route.json인식 (제주 route.json 파일명 대응)parseKmz: 체이니지 표점(0+100형식) Point는 POI 제외 (z=0이라 투영 깨짐 방지)kmzMissing: KML/KMZ 파일 자체가 없을 때만 alert (파일은 있으나 POI 0건은 콘솔 경고만)
client/src/components/overlay/StationOverlay.tsx
pathZMax: 중심선 z에 더해 드론 고도(ASL) 최대값도 상한 근거에 포함 → 제주에서 슬라이더 159m까지
검증
npm run build -w client(tsc + vite) 통과, 54000 포트가 새 번들(index-Cp4zEgX_.js) 서빙 확인- 실제 CSV로 파싱 수학 시뮬레이션: 6649행 → 세그먼트 내 1947행, frame 0~11814, effectiveFps 59.9248→59.94 스냅, 영상 t=100s ↔ 로그 t=100.00s 왕복 정합, 자세값 정상(yaw 65.1°, pitch −15°, alt 147.9m)
남은 제약 / 다음 단계 참고
- 분할 영상 2
4번째(_0003_0005) 미지원 — 세그먼트 선택 UI + offsetSec(누적 길이) 연결 필요. 로그 폭(672.6s) ≈ 영상 총길이(671.7s) 검증됨, 오프셋: 0 / 197.147 / 394.211 / 591.475s - 드론 고도 거의 일정(147.8
148.6m ASL) — 도로 표고는 그 아래. 경로표고 슬라이더로 90140m 부근 튜닝 필요 - KML LineString(도로 중심선)은 고도가 전부 0이라 중심선(선형 오버레이) 소스로 미사용
- 측점/POI 데이터가 제주 데이터셋에 없음 — KML 체이니지 표점(0+000~) 활용하려면 표고 부여 필요
- route.json의 durationSec(568)이 실제 영상 총길이(671.7s)와 불일치 — 사용자 확인 필요