- 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>
- useTrackingMode 훅 (함정 중심 지도 이동 + 반경 원)
- useRadiusFilter 훅 (Bounding Box + Haversine 거리 계산)
- shipStore 반경 필터 연동
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 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>
mergeFeatures, updateCountsThrottled, deleteFeatureById,
deleteFeaturesByIds, clearDarkSignals에서 new Map()/new Set()
전체 복사를 제거하고 기존 인스턴스를 직접 mutate.
Zustand 변경 감지는 featuresVersion/darkSignalVersion
카운터로 트리거.
5000척 기준 배치당 O(5000) Map 복사 → O(batch) 변경으로 개선.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Vite 마이그레이션, OpenLayers+Deck.gl 지도 연동
- STOMP WebSocket 선박 실시간 데이터 수신
- 선박 범례/필터/카운트, 다크시그널 처리
- Ctrl+Drag 박스선택, 우클릭 컨텍스트 메뉴
- 측정도구, 상세모달, 호버 툴팁
- darkSignalIds Set 패턴, INSHORE/OFFSHORE 타임아웃
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>