커밋 그래프

59 커밋

작성자 SHA1 메시지 날짜
98c81cd548 refactor: 현장분석/보고서 더미 데이터를 실데이터로 전환
- AI 파이프라인 PROC 순환 애니메이션 → analysisMap 기반 ON/OFF 상태
- BD-09 STANDBY → bd09OffsetM 실측 탐지 수 표시
- 보고서 수역별 허가업종: ZONE_ALLOWED 상수 동적 참조
- 건의사항: 월/최대 어구 선단 실데이터 연동
- 보고서 버튼: 헤더 → 현장분석 내부로 이동
2026-03-25 10:44:28 +09:00
caaedfa5e2 feat: 어구/어망 마름모 아이콘 분리 + 리플레이 모선 색상 구분
- gear-diamond SDF 이미지 등록 (ShipLayer.tsx)
- 라이브/가상/히스토리 전 레이어에서 어구 패턴 → 마름모, 회전 없음
- 모선/선단 선박은 삼각형 유지 (isGear 속성 기반 분기)
- 어구 아이콘 크기 80% 축소 (baseSize 0.14→0.11, 히스토리 0.7→0.55)
- 리플레이 시 모선 아이콘/라벨 노란색(#fbbf24) 구분

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-25 09:33:10 +09:00
a6e91a8e81 fix: 가상선박 아이콘 SDF halo 아티팩트 제거
- 모선 icon-halo-color 노란색 제거 (SDF 바운딩박스 채움 현상)
- halo 통일: rgba(0,0,0,0.6) / width 0.5

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-25 07:43:24 +09:00
8f9b347e1f feat: 폴리곤 히스토리 애니메이션 + 어구 추적 안정화
- FleetClusterLayer: 12시간 타임라인 기반 폴리곤 재생 애니메이션
  - 중심 이동 궤적 (점선) + 어구별 개별 궤적 (실선)
  - 가상 어구/선박 아이콘 COG 회전 + 스냅샷 동기화
  - 재생 컨트롤러: 재생/일시정지 + 프로그레스 바 (드래그/클릭)
  - 신호없음 구간: 마지막 유효 스냅샷 유지 + 회색 점선 표시
  - 히스토리 모드 시 현재 강조 레이어 (deck.gl + MapLibre) 숨김
  - ESC 키: 히스토리 닫기 + 선택 해제
- polygon_builder: STALE_SEC 3600→21600 (6시간, 어구 P75 갭 3.5h 커버)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-25 07:33:48 +09:00
a3ba0d070b feat: 작전가이드/보고서 모달 병합 + 어구 그룹 섹션 자동 전환
- feature/korea-layers-enhancement 브랜치 기능 이식 (develop 구조 적용)
- OpsGuideModal: 경비함정 작전가이드 3탭 + 임검침로 해상 루트 + TTS
- ReportModal: 중국어선 감시현황 자동 보고서 생성
- KoreaMap: buildSeaRoute (육지 우회) + externalFlyTo + opsRoute 렌더링
- KoreaDashboard: 작전가이드/보고서 버튼 + 모달 상태 관리
- vite.config: /api/gtts 프록시 추가 (Google TTS CORS 우회)
- FleetClusterLayer: 지도 어구 클릭 시 해당 섹션 자동 오픈 + 스크롤

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-24 16:24:38 +09:00
433141a3e8 feat: AI 분석 통계 서버사이드 전환 + 어구/선단 UI 개선
- Backend: /api/vessel-analysis 응답에 stats 집계 필드 추가
- Backend: GroupPolygonService.getGearStats() 어구 SQL 집계
- Frontend: 클라이언트 사이드 stats/gearStats 계산 로직 완전 제거
- Frontend: 가상 선박 마커, 어구 겹침 팝업, 패널 아코디언
- Frontend: cnFishingSuspects에 모선 포함
- Python: vessel_store COG bearing 계산 (마지막 2점 기반)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-24 15:55:15 +09:00
00067fa165 fix: 불법어선 탭 복원 (임시 숨김 해제) 2026-03-24 14:05:50 +09:00
9cad89113d feat(frontend): FleetClusterLayer 서버사이드 폴리곤 전환
- vesselAnalysis.ts: GroupPolygonDto 타입 + fetchGroupPolygons/Detail/History
- useGroupPolygons.ts: 5분 폴링 훅 (fleetGroups/gearInZone/gearOutZone)
- FleetClusterLayer: 클라이언트 convexHull/padPolygon 제거 → API GeoJSON 렌더링
- KoreaDashboard/KoreaMap: groupPolygons 훅 연결 + props 전달
2026-03-24 13:42:14 +09:00
3f2052a46e feat: 웹폰트 내장 + 이란 시설물 색상/가독성 개선
- @fontsource-variable Inter, Noto Sans KR, Fira Code 자체 호스팅
- 전체 font-family 통일 (CSS, deck.gl, 인라인 스타일)
- 이란 시설물 색상 사막 대비 고채도 팔레트로 교체
- 이란 라벨 fontWeight 600→700, alpha 200→255
- 접힘 패널 상하 패딩 균일화
2026-03-24 10:11:59 +09:00
7ce71209cc style: 폰트 외곽 테두리 최소 두께로 축소 (outlineWidth 8→3) 2026-03-24 09:36:22 +09:00
c9d504a28f fix: 불법어선 탭 임시 숨김 (준비 중) 2026-03-24 09:34:09 +09:00
44aa449b03 feat: 지도 글꼴 크기 커스텀 시스템 (4개 그룹 슬라이더)
- FontScaleContext + FontScalePanel: 시설/선박/분석/지역 4그룹 × 0.5~2.0 범위
- LAYERS 패널 하단 슬라이더 UI, localStorage 영속화
- Korea static 14개 + Iran 4개 + 분석 3개 + KoreaMap 5개 TextLayer 적용
- MapLibre 선박 라벨/국가명 실시간 반영
- 모든 useMemo deps + updateTriggers에 fontScale 포함
2026-03-24 09:27:11 +09:00
6d4ac4d3fe feat(frontend): 이란 리플레이 실데이터 전환 + 피격선박 이벤트 통합
- GeoEvent.type에 'sea_attack' 추가 + SEA ATK 배지 (#0ea5e9)
- damagedShips → GeoEvent 변환, mergedEvents에 합류
- 더미↔API 토글 UI (ReplayControls 배속 우측)
- useIranData: dataSource 분기 (dummy=sampleData, api=Backend DB)
- API 모드: events/aircraft/osint 시점 범위 조회 (3월1일~오늘)
- 중복 방지: API 모드에서 damageEvents 프론트 병합 건너뜀
- fetchAircraftByRange, fetchOsintByRange, fetchEventsByRange 서비스 함수
2026-03-24 07:52:22 +09:00
dc8a30a58b feat: LayerPanel 공통 트리 구조 + SVG 아이콘 전수 전환
- LayerTreeNode 공통 인터페이스 + LayerTreeRenderer 재귀 컴포넌트
- 한국/이란 양쪽 트리 데이터 정의 + batchToggle 캐스케이드
- 위험시설/해외시설 emoji→SVG IconLayer 전환 (12 SVG 함수, 3 IconLayer)
- 부모 토글→하위 전체 ON/OFF, 카운트 합산 동기화
- 대시보드 탭 localStorage 영속화
2026-03-24 06:34:42 +09:00
e2b531d9c5 fix: LIVE 모드 렌더링 최적화 + 특정어업수역 폴리곤 수정
- useMonitor 1초 setInterval 제거 (LIVE 60배 과잉 재계산 해소)
- useKoreaFilters currentTime 의존성 제거 (5분 polling 시에만 재계산)
- useKoreaData aircraft/satellite LIVE/REPLAY 분리
- 특정어업수역 실제 폴리곤 좌표 적용 (bbox→원본 GeoJSON 변환)
- FishingZoneLayer zone 속성 매칭 수정
- 선박/분석 라벨 폰트 크기 80% 축소
2026-03-23 15:26:41 +09:00
498c198336 feat: 이란 시설 deck.gl SVG 전환 + 아이콘 품질 통합 + AI 챗 (#161) 2026-03-23 14:51:14 +09:00
2511a33444 perf: 렌더링 성능 최적화 + 환적 Python 이관 + 중국어선감시 통합 (#158) 2026-03-23 13:16:24 +09:00
2c566041ca refactor: 프론트엔드 구조 리팩토링 Phase 1~6 (#155) 2026-03-23 11:14:49 +09:00
cdc4cb57b1 feat: 중국어선감시 탭 강화 + localStorage 상태 영속화 (#152) 2026-03-23 09:31:38 +09:00
5bf3ef8f79 fix: UX 개선 — 줌 스케일 연동 + 호버 커서 (#149) 2026-03-23 08:22:26 +09:00
e26a4db6e0 feat: 시설 Popup 디자인 통합 + LAYERS 카운트 통일 + 해외시설 토글 수정 (#148) 2026-03-23 08:21:59 +09:00
2f0ff22d1b feat: 한국 레이어 핵심 기능 통합 — 해외시설·현장분석·선단강조·버그수정 (#145) 2026-03-23 08:19:54 +09:00
f0c991c9ec refactor: deck.gl 전면 전환 — DOM Marker → GPU 렌더링
- deck.gl 9.2 설치 + DeckGLOverlay(MapboxOverlay interleaved) 통합
- 정적 마커 11종 → useStaticDeckLayers (IconLayer/TextLayer, SVG DataURI)
- 분석 오버레이 → useAnalysisDeckLayers (ScatterplotLayer/TextLayer)
- 불법어선/어구/수역 라벨 → deck.gl ScatterplotLayer/TextLayer
- 줌 레벨별 스케일 (0~6: 0.6x, 7~9: 1.0x, 10~12: 1.4x, 13+: 1.8x)
- NK 미사일 궤적 PathLayer 추가 + 정적 마커 클릭 Popup
- 해저케이블 날짜변경선(180도) 좌표 보정
- 기존 DOM Marker 제거로 렌더링 성능 대폭 개선

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 21:11:56 +09:00
8c008c69ec feat: 선택 어구그룹 하이라이트 폴리곤 + 모선 강조 마커
- 선택된 어구그룹: 진한 주황 fill(0.25) + 굵은 경계선(3px)
- 모선 존재 시: 28px 주황 원 + glow + 'M' 라벨 + 선박명
- zoom 시 자동 선택 + 펼침

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 19:07:46 +09:00
a5dc5bbf35 fix: 비허가 어구 독립그룹에도 거리제한(10NM) 적용 — 동명 원거리 어구 분리
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 18:53:45 +09:00
befcd12277 fix: 비허가 어구 그룹핑에 거리제한(10NM) + 수신시각(60분) 조건 추가
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 18:50:12 +09:00
730872d47e feat: 비허가 어구 클러스터 집계 + 폴리곤 시각화
- AnalysisStatsPanel: 어구그룹/어구수 통계 (주황색)
- FleetClusterLayer: 비허가 어구 ConvexHull 폴리곤 (주황 점선) + 목록 패널
- 허가 선단(HSL 색상) vs 비허가 어구(주황) 별도 시각화

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 18:43:48 +09:00
83bcbf48ab feat: 선단 클러스터 UI — 폴리곤 경계 + 목록 패널 + hover/zoom 인터랙션
- FleetClusterLayer: ConvexHull 폴리곤 + 패딩 + 회사별 색상
- 선단 목록 패널: hover→하이라이트, zoom→fitBounds, 선박/어구 목록
- FleetCompanyController: GET /api/fleet-companies (회사명 조회)
- AuthFilter: /api/fleet-* 인증 예외

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 18:19:27 +09:00
72f0dc4eba fix: 선단 그룹핑을 Python cluster 결과로 전환 — 프론트 BFS 제거
- ShipLayer: buildFleetGroups() 제거 → Python analysisMap cluster_id 기반
- 선박 클릭 시 같은 cluster_id 멤버만 연결선 표시
- AnalysisOverlay: 보라색 100NM+ 클러스터 연결선 제거
- 프론트엔드 전체 순회 제거로 성능 복원

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 17:27:51 +09:00
418225c6a7 feat: 선단 그룹핑 재설계 — 사전 클러스터링 + 동일 그룹 보장
- buildFleetGroups(): BFS 3NM 클러스터링으로 전체 중국어선 사전 그룹핑
- mmsi → groupId 맵으로 어느 멤버를 눌러도 같은 그룹 표시
- 그룹별 유형 자동 판별 (trawl_pair/purse_seine/transship/cluster)
- ShipLayer: detectFleet → buildFleetGroups 기반으로 전환

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 17:12:42 +09:00
a009534c35 fix: 점수 표시 8000→80 + 강조마커 위치 중앙정렬 + 클러스터 eps 3NM
- AnalysisStatsPanel: score*100 제거 (이미 0~100 정수)
- KoreaMap: 불법어선 펄스 링 position:relative+absolute로 선박 아이콘 중앙 오버레이
- fleet.py: DBSCAN spatial_eps_nm 10→3 (116척 단일 클러스터 해소)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 16:19:31 +09:00
48c15f9c33 feat: AI 분석 패널 개선 — 항적 API + 범례 + 스크롤 + 중복 제거
- Backend: mmsi별 최신 1건만 반환 (중복 제거)
- 항적: signal-batch tracks API 호출 (6시간, 5분 캐시)
- 범례: 위험도 점수 기준 상세 (위치/조업/AIS/허가, 0~100)
- 선박 목록: maxHeight 300px 스크롤 가능
- 선박 클릭 → flyTo + 항적 표시 + 근거 상세

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 15:42:13 +09:00
fe133b142e feat: AI 분석 패널 인터랙티브 — 선박 목록 + flyTo + 근거 상세 + 항적 표시
- 위험도 버튼 클릭 → 해당 레벨 선박 목록 펼침 (최대 50척)
- 선박 행 클릭 → 지도 중심이동(flyTo) + 근거 상세 펼침
- 근거: 위치/활동/다크/GPS/선단 정보 표시
- 선택 선박 항적: trail 데이터를 GeoJSON LineString으로 렌더링
- KoreaMap flyTo 기능 구현 (mapRef.flyTo)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 15:22:06 +09:00
1b2f8c65c6 fix: 분석 오버레이 라이브 선박 위치 사용 — allShips prop 전달
- KoreaMap에 allShips(전체 라이브 선박) prop 추가
- AnalysisOverlay: allShips 기반으로 분석 대상 매칭 (필터링 무관)
- 불법어선 마커: allShips에서 라이브 위치 참조 (위치 갭 해소)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 15:16:51 +09:00
9507b0da26 fix: 불법어선 수역 내 한정 + AI 패널 항상 표시 + API 1시간 윈도우
- 불법어선 필터: classifyFishingZone으로 수역 내 비한국 어선만 판별
- 수역 내 어선에 빨간 강조 링+선박명 마커 표시
- AI 분석 패널: 데이터 유무 무관하게 항상 표시
- Backend: analyzed_at 기준 1시간 윈도우로 확대 (10분 → 1시간)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 14:16:42 +09:00
af02ad12ff feat: 불법어선 필터 시 수역 폴리곤 오버레이 + 선박 마커 가시성 개선
- WGS84 사전 변환 GeoJSON 생성 (런타임 변환 제거)
- FishingZoneLayer: 수역별 색상 fill/line + 이름 라벨
- AnalysisOverlay: 마커 크기 확대, 한글 라벨, 선박명 표시
- fishingAnalysis.ts: EPSG:3857 변환 로직 제거, WGS84 JSON 직접 사용

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 14:05:35 +09:00
e82b2d77e7 feat: Python 분석 결과 오버레이 + 메뉴 연동 — Backend API 복원 + DB 테이블 + 통계패널 + 위험도 마커
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 13:28:50 +09:00
8c5ba0000c fix: 중국어선감시 연결선 폭발 — 부분매칭 제거 + 거리제한 + 마커 상한
- gearLinks: 부분 매칭(startsWith) 제거 → 정확 이름 매칭만
- gearLinks: 거리 제한 0.15도(~10NM) 추가 — 원거리 연결선 차단
- gearLinks: 최대 200개 제한
- operating 마커: 최대 100척
- 역할 라벨: 일반 어선(FV) 제외, 본선/부속/운반만 최대 100개
- parentName 최소 3글자 이상만 매칭

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 12:30:25 +09:00
Nan Kyung Lee
a467540dda fix: 중국어선감시 활성화 시 지도 드래그 불가 — 마커 pointerEvents none 추가 2026-03-20 08:49:58 +09:00
Nan Kyung Lee
8f4558a81c fix: 선박 팝업 텍스트 색상 고정 — 라이트 모드에서 정보 안 보이는 문제 해결 2026-03-20 08:45:43 +09:00
bb7c428528 docs: 릴리즈 노트 업데이트 + lint 에러 수정 2026-03-20 08:44:55 +09:00
Nan Kyung Lee
8b69bea667 fix: 한국/중국 선박 현황 패널 기본 접힘 처리 2026-03-20 07:27:47 +09:00
Nan Kyung Lee
7174dfd629 feat: 중국어선 조업분석, 어구/어망 분류, 이란 시설, 레이어 재구성
- 어선 분류 개선: AIS Ship Type 30 + category fallback + 선박명 패턴
- 어구/어망 카테고리 신설: 선박명_숫자_ / 선박명% 패턴으로 분류
- 중국어선 조업분석: GC-KCG-2026-001 + CSSA 보고서 기반 (안강망 추가)
- 중국어선 선단 탐지: 본선-부속선 쌍, 운반선 환적, 선망 선단
- 어구/어망 → 모선 연결선 시각화
- 어구 SVG 아이콘 5종 (트롤/자망/안강망/선망/기본)
- 이란 주변국 시설 레이어 (MEFacilityLayer 35개소)
- 사우스파르스 가스전 피격 + 카타르 라스라판 보복 공격 반영
- 한국 해군부대 10개소 추가
- 레이어 재구성: 선박(최상위) → 항공망(항공기+위성) → 해양안전 → 국가기관망
- 어선 국적별 하위 분류 (선박 분류 내 어선 펼치기)
- 오른쪽 패널 접기/펼치기 (한국현황, 중국현황, 조업분석, OSINT)
- 항공망 기본 접힘 처리
- 센서차트 기본 숨김

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 16:46:27 +09:00
Nan Kyung Lee
e9ce6ecdd2 feat(korea): 한국 현황 레이어 대규모 확장 — 국적 필터, 풍력단지, 항구, 군사시설, 정부기관, 미사일 낙하
- 국적 분류 필터 추가 (한국/중국/북한/일본/미분류)
- S&P Global / MarineTraffic 탭 디자인 개선
- CCTV 백엔드 프록시 연결 (CctvProxyController)
- 풍력단지 레이어 (8개소 해상풍력)
- 항구 레이어 (한국/중국/일본/북한/대만 46개)
- 공항 확장 (중국 20, 일본 18, 북한 5, 대만 9개 추가)
- 군사시설 레이어 (중국/일본/북한/대만 38개소)
- 정부기관 레이어 (중국/일본 32개소)
- 북한 발사/포병진지 레이어 (19개소)
- 북한 미사일 낙하 시각화 (2026년 4건, 궤적 라인, 인근 선박 감지)
- 항행정보/팝업 공통 스타일 정리
- 선박 현황 정렬 스타일 개선
- 레이어 패널 폰트 축소

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 10:34:16 +09:00
e304a841ed fix: OSINT 기사 중복 수집 방지 + MapLibre symbol layer race condition 해소
- OsintCollector: title 기반 24h 중복 체크 추가 (GDELT/Google News)
- ShipLayer: hover를 feature-state로 분리하여 setData 빈도 감소
- ShipLayer: ships-korean-label 조건부 마운트 → visibility 제어로 변경
2026-03-19 10:19:06 +09:00
4dd1597111 refactor: 인라인 CSS 정리 — 공통 클래스 추출 + Tailwind 전환
- CollectorMonitor: 29건 인라인 → CSS 클래스 (~3건 동적만 잔존)
- 팝업 공통 CSS: .popup-header, .popup-body, .popup-grid, .popup-label 추출
  - AirportLayer, DamagedShipLayer, InfraLayer, SubmarineCableLayer 적용
- LoginPage: var(--kcg-*) 인라인 → Tailwind 유틸리티 전환 (hover 포함)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-18 14:23:09 +09:00
60edd6bcfd fix: LIVE 모드 더미 피격선박 제거 + 선박 분류/배지 색상 통일
- DamagedShipLayer: 시나리오 범위(3/1~3/14) 밖이면 피격선박 미표시
- getMarineTrafficCategory: VesselType 문자열 매칭 우선 (Cargo→fishing 오분류 수정)
- EventLog 배지 색상: CSS 변수 통일 (LayerPanel/ShipLayer와 동일)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-18 12:11:46 +09:00
387c4e42c8 fix: 선박 분류 오류 수정 + 배지 색상 통일
- getMarineTrafficCategory: VesselType 문자열 매칭을 STAT5CODE 접두사보다 우선 적용
- STAT5CODE 매칭: 2번째 문자가 숫자인 경우만 적용 ("Cargo" → fishing 오분류 방지)
- EventLog 로컬 getShipMTCategory 제거 → 공통 getMarineTrafficCategory 통합
- EventLog 배지 색상: 하드코딩 hex → CSS 변수 (LayerPanel/ShipLayer와 동일)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-18 11:58:32 +09:00
7fa4e2bfb1 feat: 센서 그래프 개선 + 지진 마커 + 시설 아이콘 정렬 + SSH 재시도 v2
- SensorChart: 히스토리 1H/2H/3H/6H, 기압 SLP 보정, 데이터 범위 확장(y축 시작)
- SensorChart Tooltip: KST 시간 포맷, 위치 상단 고정, 스타일 통일
- 지진 포인트 클릭 → 지도 flyTo + SeismicMarker 진도별 펄스 원형 표시
- SatelliteMap flyTo 지원 추가
- OilFacilityLayer: planned ring SVG 내부로 이동 (아이콘 중심 정렬 수정)
- 밝은 테마 text-shadow CSS 변수 분리 (dark/light)
- deploy.yml: SSH SCP+실행 각 3회 재시도 (kex_exchange 거부 대응)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-18 11:02:55 +09:00
e765cc6636 feat: 센서 그래프 개선 + 한국 선박 지도 강조/인터랙션
- SensorChart: 지진 ScatterChart(진도별 색상/크기) + 기압 관측소별 개별 라인
- 한국 선박 현황 ON/OFF 토글 → 지도 강조 링/라벨 표시 (기본 ON)
- 우측 패널 한국 선박 목록: hover 시 지도 강조 링, 클릭 시 모달 호출
- ShipLayer: hoveredMmsi/focusMmsi props, 외부 모달 트리거

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-18 09:54:17 +09:00