- useRealmLayer: OL VectorLayer → MapLibre GeoJSON source + fill/line/symbol layer
- data-driven expression으로 개별 스타일링 (fillColor, outlineColor, isDotted)
- line-dasharray data-driven 미지원 → 실선/점선 레이어 분리
- style.load 이벤트로 배경지도 전환 후 레이어 자동 복구
- useTrackingMode: @turf/circle 기반 반경 원 시각화 추가
- trackingModeStore subscribe로 선박 이동/반경 변경에 동기화
- style.load 복구 패턴 적용
- baseLayer: glyphs URL 추가 (symbol layer 텍스트 렌더링용)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 해경 관련 코드/에셋 정리 (KCGV, 해경관할구역 FGB, PatrolShipSelector)
- 위성/기상/퍼블리시/레거시 모듈 전체 삭제
- STOMP WebSocket → AIS Target API HTTP 폴링 방식 전환
- 세션 인증 임시 비활성화 (VITE_DEV_SKIP_AUTH)
- 환경변수 민간 데모용으로 재구성
- 팀 워크플로우 v1.2.0 구조 적용 (.claude/rules, skills, settings)
- .githooks, .editorconfig, .node-version 추가
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- useCoastGuardLayer: flatgeobuf 해경관할구역 레이어 (테마별 스타일)
- userSettingApi: 필터 개인설정 저장/불러오기 API
- applyFilterSettings/buildFilterSettings에 AI모드(6개 서브) + 위험물 추가
- AI모드 전체 토글: 선종/국적/신호와 동일 every 패턴으로 통일
- DisplayComponent: AI모드/위험물/해경관할구역/관심구역 토글 바인딩
- 해경관할구역 기본값 ON
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- favoriteApi: 관심선박/관심구역 API 연동
- favoriteStore: favoriteSet(O(1) lookup), realmList 상태 관리
- ShipBatchRenderer: 관심선박 필터 우선 통과 + 밀도 제한 최우선
- shipLayer: 관심선박 위치에 ico_favship.svg 강조 IconLayer 오버레이
- useRealmLayer: 관심구역 OpenLayers 폴리곤(이름/색상/윤곽선) 렌더링
- useShipLayer: favoriteStore 변경 시 즉시 리렌더 구독
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- authStore: 메인 프로젝트 세션 쿠키 기반 인증 상태 관리
- fetchWithAuth: 401 응답 시 메인 프로젝트 로그인 페이지 리다이렉트
- SessionGuard: 앱 진입 시 세션 유효성 검증 래퍼 컴포넌트
- 기존 API 모듈 fetch → fetchWithAuth 전환
- 환경변수에 VITE_MAIN_APP_URL, VITE_DEV_SKIP_AUTH 추가
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- STS(Ship-to-Ship) 접촉 분석 기능 전체 구현
- API 연동 (vessel-contacts), 스토어, 레이어 훅, 레이어 레지스트리
- 접촉 쌍 그룹핑, 그룹 카드 목록, 상세 모달 (그리드 레이아웃)
- ScatterplotLayer 접촉 포인트 + 위험도 색상
- 항적분석 탭 UI 분리 (구역분석 / STS분석)
- AreaSearchPage → AreaSearchTab, StsAnalysisTab 추출
- 탭 전환 시 결과 초기화 확인, 구역 클리어
- 지도 호버 하이라이트 구현 (구역분석 + STS)
- MapContainer pointermove에 STS 레이어 ID 핸들러 추가
- STS 쌍 항적 동시 하이라이트 (vesselId → groupIndex 매핑)
- 목록↔지도 호버 연동 자동 스크롤
- pickingRadius 12→20 확대
- 재생 컨트롤러(AreaSearchTimeline) STS 지원
- 항적/궤적 토글 activeTab 기반 스토어 분기
- 닫기 시 양쪽 스토어 + 레이어 정리
- 패널 닫기 초기화 수정 (isOpen 감지, clearResults로 탭 보존)
- 조회 중 로딩 오버레이 (LoadingOverlay 공통 컴포넌트)
- 항적분석 다중 방문 대응, 선박 상세 모달, 구역 편집 기능
- trackLayer updateTriggers Set 직렬화, highlightedVesselIds 지원
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
구역 기반 선박 항적 검색 기능 추가. 사용자가 지도에 최대 3개 구역을
그리고 ANY/ALL/SEQUENTIAL 조건으로 해당 구역을 통과한 선박의 항적을
조회·재생할 수 있다.
신규 패키지 (src/areaSearch/):
- stores: areaSearchStore, areaSearchAnimationStore (재생 제어)
- services: areaSearchApi (REST API + hitDetails 타임스탬프/위치 보간)
- components: AreaSearchPage, ZoneDrawPanel, AreaSearchTimeline, AreaSearchTooltip
- hooks: useAreaSearchLayer (Deck.gl 레이어), useZoneDraw (OL Draw)
- utils: areaSearchLayerRegistry, csvExport (BOM+UTF-8 엑셀 호환)
- types: areaSearch.types (상수, 색상, 모드)
주요 기능:
- 폴리곤/사각형/원 구역 그리기 + 드래그 순서 변경
- 구역별 색상 구분 (빨강/청록/황색)
- 시간 기반 애니메이션 재생 (TripsLayer 궤적 + 가상선박 이동)
- 선종/개별 선박 필터링, 항적 표시/궤적 표시 토글
- 호버 툴팁 (국기 SVG, 구역별 진입/진출 시각·위치)
- CSV 내보내기 (신호원, 식별번호, 국적 ISO 변환, 구역 통과 정보)
기존 파일 수정:
- SideNav/Sidebar: gnb8 '항적분석' 메뉴 활성화
- useShipLayer: areaSearch 레이어 병합
- MapContainer: useAreaSearchLayer 훅 + 호버 핸들러 + 타임라인 렌더링
- trackLayer: layerIds 파라미터 추가 (area search/track query 레이어 ID 분리)
- ShipLegend: 항적분석 모드 선종 카운트 지원
- countryCodeUtils: MMSI MID→ISO alpha-2 매핑 추가
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- git 이력에서 publish 파일 45개 복원 (layouts, pages, components, scss)
- Sidebar.jsx: import.meta.glob 패턴으로 publish 폴더 없이도 빌드 가능
- App.jsx: lazy import에 catch 추가로 publish 누락 시 안내 메시지 표시
- .gitignore: src/publish/ 제외 해제 (git 추적 포함)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- ScatterplotLayer 기반 수동 프레임 기록 → TripsLayer(deck.gl/geo-layers) GPU 기반 렌더링 전환
- 궤적 길이: 1시간 (시간 기반, 배속 무관 동일 시각적 길이)
- 32비트 float 정밀도 문제 해결: startTime 기준 상대 타임스탬프 사용
이상치 선박 자동 '삭제' 그룹 분류:
- 조건1: 인접 포인트 간 거리 > 100km가 (조회일수 × 5)건 이상
- 조건2: 선박별 평균 속도 > 50노트
- queryCompleted 시 1회만 계산, 렌더링 성능 영향 없음
- 사용자가 이후 그룹 변경 가능
기본값 변경:
- 궤적 표시: true (기본 활성화)
- 재생 배속: 500배속
- 로딩 완료 시 자동 재생 시작
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 리플레이 전용 범례(ReplayLegend): 재생 시점 선종별 카운트, 필터 동기화
- 궤적 표시 성능 최적화: 거리 필터(100m), 역비례 프레임 계산, 배속별 동일 시각적 길이
- 궤적 필터 동기화: 선종 OFF 즉시 제거, 프로그레스 드래그 시 클리어, 배속 변경 시 리셋
- 리플레이 로딩 프로그레스: 화면 중앙 원형 오버레이, 머지 타임스탬프 기반 진행률
- 선박 메뉴에서 필터 패널 직접 열기, 좌측 하단 필터/레이어 버튼 비활성화
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- useTrackingMode 훅 (함정 중심 지도 이동 + 반경 원)
- useRadiusFilter 훅 (Bounding Box + Haversine 거리 계산)
- shipStore 반경 필터 연동
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- replay 패키지 (stores, components, hooks, services, utils, types)
- WebSocket 기반 청크 데이터 수신 (ReplayWebSocketService)
- 시간 기반 애니메이션 (재생/일시정지/정지, 배속 1x~1000x)
- 항적 표시 토글 (playbackTrailStore - 프레임 기반 페이딩)
- 선박 상태 관리 + 필터링 (선종, 신호원)
- 드래그 가능한 타임라인 컨트롤러
- 라이브/리플레이 전환 (liveControl)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 배경지도 타입 전환 (일반/전자해도/야간)
- 테마 연동 색상 시스템 (선박 라벨, 속도벡터 등)
- mapStore에 subscribeWithSelector 적용
- 신호원 우선순위/항적 조회기간 상수 추가
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- publish 영역 lazy loading 적용 (빌드 시 tree-shaking)
- Toast 공통 컴포넌트 추가
- assetPath 유틸 추가 (BASE_URL 기반 경로 해석)
- csvDownload 유틸 추가
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- esbuild drop 옵션으로 빌드 시 console/debugger 자동 제거
- 개발용 폴더(publish, component/wrap) 빌드 시 제외
- 프록시 설정 추가 (signal-api, ship/image, tracks)
- index.html root 이동 (public/ → root)
- 의존성 업데이트
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
[TopBar 구현]
- 좌표 표시 (마우스 위치 실시간 표시, 도분초/도 토글)
- 시간 표시 (UTC/KST 토글)
- 선박 검색 기능 (like 검색, 디바운싱)
- 지도/선박 모드 토글 버튼
[추적 모드 기능]
- PatrolShipSelector: 경비함정 선택 패널
- 검색 기능 (함정명/ID like 검색)
- 반경 설정 (10/25/50/100/200 NM)
- 스크롤 가능한 함정 목록
- ShipContextMenu: 반경설정 서브메뉴 추가
- 단일 경비함정 우클릭 시 반경 선택 가능
- 화면 위치에 따른 서브메뉴 방향 자동 조정
[반경 필터링]
- 선박 렌더링: 반경 내 선박만 표시
- 범례 카운트 계산: 반경 내 선박 수 표시
- 검색 결과: 추적 모드 시 반경 내 선박만 검색
- Haversine 거리 계산 + Bounding Box 사전 필터링
[추적 선박 표시]
- ScatterplotLayer 3중 구조 (외곽링, 내부원, 중심점)
- 추적 중인 경비함정 위치에 시각적 마커 표시
- integrate 플래그를 활용한 통합선박 판별 로직 추가
- shipStore.js: buildDynamicPrioritySet에 integrate 조건 추가
- ShipBatchRenderer.js: 카운트 로직에 integrate 조건 추가
- shipLayer.js: isIntegratedShip 함수 개선
- 선박 모달 생성 로직 개선
- openDetailModal에서 레이더 대표 선박 자동 교체
- 통합선박의 비레이더 신호원 우선순위 기반 선택
- 모달 신호상태 아이콘 표시 통일
- ShipDetailModal.jsx: SignalFlags에 integrate 조건 추가
- 선박 아이콘과 모달의 신호상태 표시 로직 통일
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
메인프로젝트(deck.ts:274-278)와 동일하게 signalSourceCode가
RADAR이면 통합/단독 무관하게 카운트에서 항상 제외.
기존: 단독 레이더(!integrate)만 제외 → 통합 레이더가 카운트에 포함되어
VTS_RADAR 필터 ON 시 과다집계 발생
수정: 모든 레이더를 카운트 + 타임아웃 체크에서 통합 조건 제거
원인: 통합그룹의 다른 장비(AIS 등)가 삭제/다크시그널 상태일 때
레이더만 features에 남아 있으면 해당 targetId가 추가 카운트됨
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
메인프로젝트(deckStore.ts:163)와 동일하게 기존 저장된 데이터의
receivedTimestamp보다 이전 시간대의 메시지는 무시하도록 수정.
이전: 모든 메시지를 무조건 덮어씀 → 오래된 메시지가 최신 데이터를
덮어쓰거나 삭제/다크시그널 처리된 선박을 부활시킴
이후: newTimestamp < currentFeature.receivedTimestamp이면 스킵
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
문제:
- incremental count가 매 메시지마다 스토어 갱신하여 범례 실시간 변동
- targetId 중복 제거 없이 개별 장비별로 카운트되어 수치 과다
수정:
- incremental count 제거, 5초 주기 fullRecount 방식으로 복원
- updateCountsThrottled: 타임아웃 체크 + calculateCounts 통합 (5초 주기)
- calculateCounts: targetId 중복 제거 포함 정확한 카운트 계산
- mergeFeatures에서는 features/darkSignalIds만 갱신, 카운트는 5초마다
- 필터 변경/삭제 시에는 recalculateCounts로 즉시 재계산
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
countRegistry가 initialKindCounts보다 먼저 선언되어 발생한
ReferenceError 수정. initialKindCounts를 countRegistry 위로 이동.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- countCache 기반 5초 주기 O(n) 전체 카운트 → countRegistry 기반 incremental delta 카운트
- 변경된 선박만 카운트 증감 (mergeFeatures, deleteFeature, clearDarkSignals)
- fullRecount는 필터 변경/통합모드 전환 시에만 사용
- processTimeoutsThrottled 분리: 타임아웃 체크만 담당 (5초 주기)
- 미사용 parseAvetdr 함수 제거, throttle 설정 정리
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>