# 2026-07-09 지장물 KML 신포맷 파싱 (다중 KML + 라벨 색상)

**소요 시간**: 13분
**Context 사용량**: input 300k / output 8k tokens

## 문제

새로 받은 `제주_중산간도로_지장물.kml`(구글어스 Pro에서 CSV 변환, 지장물 33개)의
좌표/라벨 색상이 화면에 표시되지 않음.

## 원인

1. **parseKmz 가 KML 을 1개만 읽음** — `files.find(...)` 라 폴더에 KML 이 2개(측점 KML + 지장물 KML)면
   첫 파일만 파싱되고 지장물 KML 은 통째로 무시됨 (핵심 원인)
2. 신포맷은 폴더(교량/터널 등) 구분이 없고 Placemark 직속 + Schema
   (`타입/타입상세/텍스트박스_색상/이름/연장/X/Y/높이`) — 기존 desc HTML 표 기반 분기와 불일치
3. 라벨 색상 개념이 렌더러에 없음 — 캔버스 라벨이 고정색(#64c8ff) 단일

## 수정 내용

### client/src/utils/geoData.ts
- **parseKmz 다중 파일 병합**: 폴더 내 모든 .kml/.kmz 를 순회 파싱해 pois/structures/stations 병합
  (파일 단위 실패는 경고 후 건너뜀)
- **신포맷(지장물 스키마) 브랜치**: `타입` SimpleData 존재로 감지 —
  - title=`이름`(폴백 name), category=`타입`(교차로/도로/교량/강.하천/마을/산/지장물/지장물L)
  - 좌표는 SimpleData X/Y(저정밀)가 아닌 **Point coordinates(고정밀)** 사용
  - `높이`는 표고가 아닌 구조물 높이 → z=0 유지(팝업 props 로만 노출)
  - 타입 교량/터널은 구조물(스테이션바·노선패널 마크)로도 중복 등록 (연장→lengthM)
- **라벨 색**: `텍스트박스_색상` 한국어명(검정/남색/빨강/연두/주황/초록/파랑 등 13색) → CSS 매핑,
  없으면 인라인 IconStyle 색(KML aabbggrr → #rrggbb) 폴백 → `GeoPoint.labelColor`

### client/src/types/geo.ts
- `GeoPoint.labelColor?: string` 추가

### client/src/components/overlay/StationOverlay.tsx
- labelColor 를 poiCand → poiMarkers(라벨 캐시) → 캔버스 렌더로 전달
- 십자 마커·라벨 텍스트를 지정 색으로 렌더, 어두운 색(검정·남색)은 외곽선을 밝게 반전(가독성)
- CATEGORY_EMOJI 확장: 교차로🚦 도로🛣️ 강.하천🌊 마을🏘️ 산⛰️ 지장물L🏢

## 검증

- tsc+vite 빌드 통과, 54000 포트 새 번들(index-CLmojEn3.js) 서빙
- 지장물 KML 데이터 검증: 33개 전부 파싱, 색상 매핑 33/33, 교량 3건 구조물 중복 등록,
  좌표 불량 0 (Point coordinates 고정밀 사용)
- 기존 측점 KML(STA 71개)과 병합 로드 확인 (다중 KML)

## 다음 단계 참고

- 신포맷 감지 키는 `타입` SimpleData — 회덕 desc표/STA 스키마와 충돌 없음
- styleUrl(#pointStyleMap1) → StyleMap 참조 해석은 미구현 (인라인 Style 이 항상 존재해 불필요)
- 색상명 미정의 시(예: 새로운 색 이름) 인라인 IconStyle 색 폴백 → 그것도 없으면 기본 하늘색
