기존 GhiVideo 저장소 HEAD의 트래킹 소스 362개 파일을 복제. (node_modules·storage·빌드 산출물·대용량 미디어는 .gitignore 규칙대로 제외) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
5.3 KiB
5.3 KiB
폴더 임포트 v2.0 데이터 형상 전환
소요 시간: 약 16분 (기능개발 에이전트 기준) Context 사용량: input ~추정 / output ~107k tokens (기능개발 에이전트 subagent_tokens 106,989 기준)
작업 개요
폴더 선택 시 로딩하는 지리정보 데이터를 v1.0 형상에서 v2.0 형상으로 전환했다. v1.0(POI_위경도값/측점_위경도값/타원체고/center.csv 의존)을 더 이상 지원하지 않고, 실측 납품 폴더 구조(드론 base.csv + building/ 하위 번호 CSV + route.json 보정)에 맞춘 v2.0 전용 파서로 전면 재작성했다.
작업 배경 (v1.0 → v2.0)
- v1.0은 별도 가공 산출물(
POI_위경도값,측점_위경도값,center.csv, 타원체고 컬럼)에 의존 → 실제 납품 폴더와 컬럼/인코딩이 불일치 - v2.0 실데이터는 한 폴더에 드론 CSV(UTF-8)와 측량 CSV(EUC-KR)가 혼재하고, 중심선(center.csv)이 없음
- 따라서 인코딩 자동 감지 + 번호 CSV 직접 파싱 + 측점 기반 중심선 생성으로 구조를 단순화
변경 파일과 핵심 내용
client/src/types/geo.ts
DirectionChange타입 신설:{ station, from, to, atSeconds }RouteStructure에lengthM?,category?추가 (type 유니온bridge|tunnel|station유지, 구교 →bridge)FolderGeoData에structures: RouteStructure[],directionChanges: DirectionChange[]추가
client/src/utils/geoData.ts (전면 재작성, v2.0 전용)
- 인코딩 자동 감지
decodeBytes(buf): 앞 3바이트EF BB BF→ UTF-8, 아니면 EUC-KR, 잔여U+FEFF제거 readCsv(file)시그니처 단순화 (인코딩 인자 제거)makeFieldIndexer: 헤더명indexOf실패 시 위치 인덱스 폴백- 신규 파서:
parseStations/parsePois/parseStructures/buildCenterlineFromStations/mergeStructures - v1.0 코드 제거:
POI_위경도값/측점_위경도값/타원체고 식별,center.csv로더, 인코딩 하드코딩 분기
client/src/store/geoStore.ts
structures,directionChanges적재
client/src/stationbar/StationBar.tsx
- 구조물 마커 소스를
routeMeta.structures→geoStore.structures(CSV 유래) 우선으로 전환 - 위치 로직(station → lat/lon → 이름매칭 → mileage)은 lat/lon 지원으로 그대로 활용
컬럼 매핑 (실파일 검증)
| 구분 | 파일 | 인코딩 | 매핑 |
|---|---|---|---|
| 드론 | <base>.csv |
UTF-8 | frame_cnt/latitude/longitude/altitude/yaw/pitch/roll/focal_len — 변경 없음 |
| 측점 | building/01)측점.csv |
EUC-KR | title←측점, z←Z좌표, lat, lon, type=station; 비고에서 DirectionChange 추출(mm:ss→초) |
| POI(1) | 루트 <base>_POI.csv |
UTF-8 | title / category_clean / lat / lon, z=0 |
| POI(2) | building/02)지장물.csv |
EUC-KR | 명칭 / category='지장물' / lat / lon / z←Z좌표 |
| 구조물 | 03)교량(bridge) + 04)터널(tunnel) + 06)구교(bridge, category='구교') |
— | name / lengthM←연장(m) / lat / lon; 위경도 범위(33 |
| 중심선 | center.csv 없음 | — | 측점 mileage 정렬 폴리라인으로 생성 |
| 보정 | route.json | — | mergeStructures 가 name 매칭으로 offset/station/좌표 override + 미존재 항목 추가 (선택적 보정) |
결정 사항
- v2.0 전용화: v1.0 지원 코드를 제거하고 v2.0 형상만 로딩
- 구조물 = CSV 자동 + route.json 보정: 03/04/06 CSV에서 자동 수집하고 route.json은 선택적 override/augment 레이어로만 사용
- 측점 중심선: center.csv 부재 → 측점 mileage 정렬 폴리라인을 중심선으로 사용
- 비고 방향전환: 측점 비고 텍스트에서 상/하행 전환 + 시각(mm:ss)을 정규식으로 추출하여
DirectionChange생성
실데이터 검증값 (하행)회덕-대전조차장 데이터, v2.0)
- 인코딩: 드론/POI/05)출입문/06)구교 = UTF-8(BOM), 01~04 = EUC-KR (BOM 자동감지로 일괄 처리)
- directionChanges 2건: 157K930 상행→하행 @125s, 158K340 하행→상행 @75s
- 측점 47개
- POI 137개 (
<base>_POI114 + 지장물 23) - 구조물: 교량 12 (깨진 1행 필터) + 터널 2 + 구교 9
미구현 / 후속 과제
- 05)출입문번호.csv 파싱 스킵: 운영데이터로 재생바 아이콘이 과도해져 기본 표시 제외. 파싱 자체를 생략(Timeline 렌더는 bridge/tunnel/station만). 추후 필요 시
parseDoors추가. - directionChanges 와이어링: 타입/스토어까지 적재 완료. StationBar
barSegments의 방향전환은 현재 연속 체이니지(chain) 자동 판정 로직을 유지하고,directionChanges강제 분할은 미적용. 자동 판정이 영상과 일치하므로 회귀 위험 회피 목적의 후속 과제로 둠.
검수 포인트
- 한글 인코딩 깨짐 없음 (BOM 자동감지)
- 깨진 행 마커 제외 (위경도 범위 밖 필터)
- route.json 보정 동작
- RoutePanel / RouteInfoOverlay 는 POI category로 교량·터널을 필터 → v2.0에서는 structures가 분리되어 해당 목록이 비어 보일 수 있음(정상, 구조물은 StationBar로 표시)
빌드 결과
nvm use 20→npm run build -w client→tsc && vite build- ✓ built (215 modules), 에러 0
- chunk > 500kB 경고는 기존 video.js 특성 (정상)