## ENC 베이스맵 (features/encMap/)
- gcnautical 타일 서버 연동 (nautical.json 49개 레이어, 73개 S-52 스프라이트)
- 설정 패널: 12개 레이어 토글, 영역 색상 3종, 수심 색상 5단계
- 배경색 밝기 기반 선박 라벨 색상 자동 전환 (labelColor.ts)
- useMapStyleSettings에 ENC 가드 추가 (스타일 간섭 방지)
- useBaseMapToggle 초기 로드 스킵 (useMapInit과 중복 setStyle 방지)
## 선박 표시 개선
- Globe 원형 halo/outline 제거 — 아이콘 본체만 표시
- Globe 아이콘 스케일 1.3배, 줌아웃 최소 크기 보장 (minzoom 2)
- SDF icon-halo로 테두리 적용 (성능 영향 없음)
- 기타 AIS 투명도 상향 (0.28→0.6 ~ 1.0)
- 선박명 영문 우선 표시 (shipNameRoman > shipNameCn)
## 오버레이 제어 수정
- 연결선/범위/선단 토글 off 시 인터랙티브 오버레이도 비활성
- Globe pair/fc/fleet 레이어: || active 제거 → 토글 우선
- 강조 링/알람 링: shipData→shipLayerData (클러스터링 연동)
## 기본값 변경
- 경고 필터 5개: 초기 false
- 연결선/범위/선단: 초기 false
- 사진 파란 원 아이콘: Globe+Mercator 모두 제거
## 폰트 정리
- Open Sans 폴백 전면 제거 → Noto Sans 단독
- ENC 스타일 fetch 시 text-font 패치
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
기존 대상선박 전용 우클릭 메뉴를 모든 선박 아이콘으로 확장.
선명 복사, MMSI 복사 항목을 상단에 추가하고,
항적조회는 대상선박(isPermitted)에만 조건부 표시.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
다중 항적 조회 모달에서 반복 선택을 줄이기 위해 선박 그룹 관리 기능 추가.
계정별 localStorage 영속화(usePersistedState), 최대 10개 그룹, 동명 덮어쓰기.
그리드 헤더 클릭으로 6개 컬럼 asc/desc 정렬, 푸터에 선택 초기화 버튼 추가.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- 대상 선박 멀티 선택 모달 (features/vesselSelect, widgets/vesselSelect)
· 업종/상태 필터 분리 + 그룹별 전체 on/off
· 드래그 선택 (클릭+드래그로 범위 체크/언체크)
· 기간 프리셋 7/14/21/28일, 최대 조회 28일 제한(초과 시 자동 조정)
· MAX_VESSEL_SELECT=20, MAX_QUERY_DAYS=28
- trackReplay 확장: beginMultiQuery, queryMultiTrack, 다중 CSV 내보내기
- GlobalTrackReplayPanel: 기간 편집/재조회, 선박 목록 on/off 토글
- 경고 브리딩 효과: filled circle → stroked ring
· Globe: zoom-interpolated offset 기반 반경
· Mercator: ScatterplotLayer → IconLayer + SVG ring (깜빡임 해결)
- hideLiveShips 조회 시 기본 체크
- Topbar "다중항적" 버튼 강조 스타일
- 공지사항 id:2 추가
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
gc-wing-simple의 SVG 기반 선종별 아이콘 시스템을 도입하여 기타 AIS 선박을
8종 선종별 색상+형태(이동:화살표/정지:원형)로 구분하고, 대상 선박에는
legacy code 색상 + 브리딩 링 강조 효과를 적용한다.
- shipKind.ts: 선종별 SVG 생성기 + 아이콘 스펙 사전 생성
- Mercator: 기타 AIS 20px SVG IconLayer, 대상 선박 26px SVG IconLayer
- Globe: signalKindCode 기반 색상, 대상 선박 1.3x 크기
- 브리딩 rAF: 시안(선택)/주황(강조) 링, 2000ms 주기
- 범례: "기타 AIS(선종)" 7항목으로 변경
- shipIconCache.ts, SHIP_ICON_MAPPING 삭제
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
MapTiler Ocean 완전 스타일 기반 별도 베이스맵 모드.
features/oceanMap/ 자체 완결 블록 — 기존 enhanced 코드 변경 없음.
- resolveOceanStyle: Ocean style.json fetch + 한국어 라벨
- useOceanMapSettings: 런타임 커스텀 (수심색상/등심선/hillshade/라벨)
- OceanMapSettingsPanel: 9개 섹션 설정 UI
- 사이드바 Ocean 토글 + 설정 패널 baseMap 분기
- resolveMapStyle dynamic import로 번들 분리
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- AIS 타겟에 shipImagePath/shipImageCount 필드 추가
- 선박 이미지 API 연동 (fetchShipImagesByImo)
- 지도 위 사진 인디케이터 (ScatterplotLayer)
- 호버 툴팁에 썸네일 표시
- 정보 패널 카드 갤러리 (스크롤+화살표)
- 고화질 이미지 모달 (initialIndex 지원)
- Vite 프록시 /shipimg 추가
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- shipData를 ref로 관리하여 AIS poll마다 effect 재실행 방지
- isStyleLoaded 가드 제거 → try/catch로 즉시 실행
- duration 700→400ms로 단축
- selectedMmsi만 의존성으로 → 선택 시 1회만 fly-to 실행
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- mapInitiatedSelectRef 도입: 지도 클릭 선택과 패널 선택을 구분
- 좌측 패널(선박 목록, 알람 목록) 선택 시 해당 위치로 fly-to
- 지도에서 직접 클릭/우클릭 선택 시에는 fly-to 비활성화
- onMapSelectMmsi 래퍼로 지도 내 선택 경로 통합 (Globe+Mercator)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Part A — 오버레이 라인 가시성:
- Globe/Mercator 쌍끌이·FC·선단 라인 굵기 ~2x 증가
- Globe 범위 원·선단 원 대시 패턴 추가
- Globe 오버레이 호버 시 브리딩(breathing) 맥동 rAF
Part B — 경고 선박 강조:
- DashboardPage → Map3D alarmMmsiMap 전달
- Globe: 경고 맥동 레이어(ships-globe-alarm-pulse) + 배지(ships-globe-alarm-badge)
- Mercator: Deck.gl ScatterplotLayer 맥동 + TextLayer 배지
- 경고 종류별 배지(이/수/환/휴/A), z-index 상향, 호버 스케일 확대
- 경고 필터 OFF 시 맥동/배지 자동 비표시
Part C — Mercator 선명 라벨:
- MapLibre 라벨 → Deck.gl TextLayer 교체 (z-order 안정)
Part D — 프로젝션 전환 안정화:
- Globe→Mercator 전환 시 Globe custom layer 맵에서 분리
- alarm rAF에 projectionBusyRef 가드 추가
- overlay.setProps() stale WebGL 자원 참조 방지
Part E — 김개발(DEV) 모드 더미 데이터:
- mockOverlayData.ts: 서해 12척 가상 선박 (5종 경고 시나리오)
- 김개발 로그인 시 자동 주입, 일반 계정 미노출
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 통계 펼치기 버튼을 topbar 내부에서 하단 우측 탭으로 이동
- 통계 바를 absolute→flow 레이아웃으로 변경 (지도 줌 겹침 방지)
- 모바일 grid-rows를 auto로 변경하여 통계 바 높이 수용
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- POLL/DATA/API/READY 상태 표시 제거
- 데스크톱: 통계 칩 항상 인라인 표시
- 모바일: 통계 펼치기 버튼 + 하단 확장 바
- 시스템명/시계/테마/로그아웃 항상 표시
- pollingStatus/lastFetchMinutes props 제거
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- useTheme: localStorage 기반 다크/라이트 테마 전환
- data-theme 속성으로 CSS 변수 자동 전환
- Topbar에 Light/Dark 토글 버튼 추가
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Mercator/Globe track-replay 레이어 충돌 및 setProps 레이스 해결
- track DTO 좌표/시간 정규화 + stale query 응답 무시
- 조회 직후 표시 안정화 및 기본 100x 자동재생 적용
- Global Track Replay 패널 초기 위치 조정 + 헤더 드래그 지원
- liveRenderer batch rendering + trackReplay store 기반 구조 반영
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 대상선박 우클릭 컨텍스트 메뉴로 항적 조회 (6h~5d)
- Mercator: PathLayer(고정) + TripsLayer(애니메이션) + ScatterplotLayer(포인트)
- Globe: MapLibre 네이티브 line + arrow + circle 레이어
- rAF 직접 overlay 조작으로 React 재렌더링 방지
- SVG 아이콘 data URL 캐시로 네트워크 재요청 방지
- 항적 조회 시 자동 fitBounds (전체 항적 뷰포트 맞춤)
- API 프록시 /api/ais-target/:mmsi/track 엔드포인트 추가
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- fill 3-tier 제거 → 단일 레이어(전체 depth) 복원
- setSky: sky/horizon/fog를 심해색(#010610)으로 설정
- 캔버스/map-area 배경: #010610 (타일 gap seam 비가시화)
- 타일 경계 gap으로 배경이 비칠 때 색상 차이를 제거
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 심해 fill 폴리곤이 globe 타일 경계에서 seam 아티팩트 발생
- bathymetry-fill: z3-7 (depth >= -2000, 천해만)
- bathymetry-fill-medium: z7-9 (depth >= -4000)
- bathymetry-fill-deep: z9+ (전체 depth)
- applyDepthGradient: 3개 fill 레이어 모두 적용
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- shallowFilter 제거: 전체 depth 범위 렌더링 복원
- bathyFillColor: -8000m, -4000m 색상 stop 복원
- DEPTHS_MEDIUM: -4000m 추가 (z7-9)
- DEPTHS_DETAIL: -4000m, -8000m 추가 (z9+)
- 줌 기반 LOD가 vertex 제어 담당 (depth 필터 불필요)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
소스 데이터 간소화가 projectionBusy 가드 뒤에 있어서
globe 전환 시 원본 데이터(2100+ vertex)로 tessellation 진행 →
73,000+ vertex 폭증. setData를 가드 앞으로 이동하고
useMemo로 간소화 데이터 캐싱.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- overlay 파괴/재생성 대신 layers 비움으로 전환
- globe ship 레이어 visibility 즉시 토글 (projectionBusy 우회)
- fleet circles fill vertex 초과 수정 (steps 72→36/24)
- globe scrollZoom easing 경고 수정
- projection 비영속화 (항상 mercator 시작)
- globe 레이어 준비 전까지 3D 토글 비활성화
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
usePersistedState hook으로 대시보드 상태를
localStorage에 자동 저장. 지도 뷰(중심/줌/방위)도
60초 주기 + 언마운트 시 저장하여 새로고침 복원.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
shared/lib/datetime.ts에 KST 고정 포맷 함수 추가.
AIS 정보, 선박 목록, 대시보드 등의 날짜 표시를
로컬 포맷에서 KST 명시적 포맷으로 통일.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- shared/auth 모듈: AuthProvider, ProtectedRoute, useAuth, authApi
- 페이지: LoginPage(Google OAuth), PendingPage, DeniedPage
- WING_PERMIT 역할 기반 접근 제어
- Topbar에 사용자 이름 + 로그아웃 버튼 추가
- App.tsx에 react-router 라우팅 + AuthProvider 래핑
- DEV 모드 Mock 로그인 지원 (김개발)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>