커밋 그래프

93 커밋

작성자 SHA1 메시지 날짜
5afa5d4be9 fix: 모델 패널 위치 상향 — 확장된 재생 컨트롤러와 겹침 해소
bottom: 100 → 120 (재생 활성 시)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 09:45:36 +09:00
e8187b3a6c fix: 토글 패널 위치 재생 컨트롤러 정렬 + 일치율 필터 전역 적용
패널 위치:
- left: 10 → left: calc(50% - 210px) (재생 컨트롤러 중앙 정렬 근처)

일치율 드롭다운 전역 적용:
- 기존: 현재 ON인 모델의 대상만 필터
- 수정: 모든 모델의 모든 대상에 전역 적용 (모델 on/off 무관)
- 동일 MMSI가 여러 모델에 있을 때 최고 score 기준 판단

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 09:44:15 +09:00
6789f82e3b fix: 항적 토글 + 패널 레이아웃 + TripsLayer 색상 분리
항적 토글 역할 변경:
- 항상 ON: TripsLayer (애니메이션 트레일) + 센터 트레일 + 도트
- "항적" 토글: 전체 24h 정적 항적 PathLayer (멤버 + 연관 선박)
  ON 시 회색/연파랑 배경 경로 위에 고채도 TripsLayer 애니메이션

색상 계층:
- 정적 항적: 회색 [180,180,180,80] / 연파랑 [100,140,200,60]
- TripsLayer: 고채도 노랑 [255,200,60,220] / 고채도 파랑 [100,180,255,220]

패널 레이아웃:
- 토글 패널: position: sticky left: 0 (항상 좌측 고정)
- 모델 카드: 가로 스크롤 (maxWidth: calc(100vw - 340px))
- 다중 토글 유지, 화면 초과 시 스크롤

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 09:40:06 +09:00
5002105d18 feat: 재생 컨트롤 확장 — 항적/이름 토글 + 일치율 필터 + 개별 on/off
재생 컨트롤러:
- 항적 on/off → showTrails (TripsLayer + PathLayer + 센터도트)
- 이름 on/off → showLabels (TextLayer)
- 일치율 드롭다운 (50~90%) → enabledVessels 일괄 필터

패널 토글:
- 행 전체 클릭으로 체크박스 토글 (cursor: pointer)
- 체크박스 항상 표시, OFF 시 opacity 0.5
- correlationTracks prop 제거 (미사용)

enabledVessels OFF 효과:
- corrPositions 제외 → 아이콘/라벨/트레일/폴리곤 모두 제외

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 09:26:41 +09:00
21df325010 fix: prediction API 프록시 경로 수정 + nginx 라우팅 추가
vite dev: /api/prediction/ → 192.168.1.18:8001 (rewrite /api/prediction → /api)
nginx 프로덕션: /api/prediction/ → redis-211:8001 (동일 rewrite)
디버그 로그: fetchCorrelationTracks URL/status, loadHistory fetch 결과

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 09:13:52 +09:00
dddb978dea fix: prediction proxy rewrite 경로 수정
/api/prediction → rewrite: '' → '/api'
기존: /api/prediction/v1/... → /v1/... (404 - FastAPI 라우트 불일치)
수정: /api/prediction/v1/... → /api/v1/... (정상 매칭)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 09:07:33 +09:00
6ea394d120 fix: 트랙 끝점 clamp + 연관 선박 위치 디버그 강화
- 트랙 시간 범위 밖: 가장 가까운 끝점으로 clamp (기존: skip)
  → 트랙 시작 전 = 첫 점, 트랙 종료 후 = 마지막 점
- 디버그 로그: corrPositions 상세 (track/live 소스별, 모델별 위치확인 수)
- 기존 중복 로그 정리

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 08:55:00 +09:00
8eacbb2c91 feat: 트랙 API 전체 모델 확장 + 개별 선박 on/off → 폴리곤 반영
Prediction API:
- /correlation/{group}/tracks: is_default=TRUE 제거 → 모든 활성 모델 조회
- 응답에 models: {modelName: score} 딕셔너리 추가 (모델별 점수)
- MMSI 기준 중복 제거, 최고 점수 유지

Frontend:
- CorrelationVesselTrack 타입: models 필드 추가, type 필드 추가
- 오퍼레이셔널 폴리곤: enabledVessels 기반 on/off 제어
  (score 임계값 → 개별 체크박스 토글로 전환)
- identity OFF 시 폴리곤 base points에서 멤버 위치 제외

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 08:40:31 +09:00
c4186a327d fix: 연관 선박 위치 live fallback — 트랙 데이터 없을 때 ships 배열 사용
- useGearReplayLayers에 shipsRef 파라미터 추가
- corrPositions 계산: 트랙 보간 우선 → live 선박 위치 fallback
- KoreaMap: allShips → shipsRef에 매 렌더 동기화 (ref로 re-render 방지)
- globalThis.Map으로 react-map-gl Map 타입 충돌 해결

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 08:26:07 +09:00
6ba3db5cee fix: 순차 데이터 로딩 + enabledModels 토글 제어
데이터 로딩:
- loadHistory: Promise.all로 history/correlation/tracks 병렬 fetch
  → 모든 응답 완료 후 store.loadHistory + play() 순차 실행
- 개별 fetch effect는 비재생 모드에서만 실행 (historyActive 가드)
- 타이밍 문제 원천 제거 (race condition 없음)

enabledModels 토글 제어:
- identity OFF → 멤버 폴리곤/마커/트레일 숨김
- 각 모델 OFF → 해당 모델의 연관 선박/트레일 숨김
- 모든 모델 OFF → 센터 트레일/점만 표시
- correlation trails도 활성 모델에 속하는 선박만 표시

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 08:17:53 +09:00
e68f314093 fix: correlation 동기화 타이밍 수정 + 자동 재생 + 디버그 로그
- loadHistory 완료 후 store.play() 호출 (자동 재생)
- correlation sync effect에 historyActive 의존 추가
  (history 로드 후 이미 도착한 correlation 데이터 재동기화)
- loadHistory 직후 즉시 updateCorrelation 호출 (병렬 로드 대응)
- 디버그 로그: renderFrame 첫 프레임 데이터 상태, correlationByModel 갱신

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 08:13:52 +09:00
242fdb8034 fix: 리플레이 IconLayer 전환 + 모델 배지 + correlation 동기화
- ScatterplotLayer → IconLayer (ship-triangle/gear-diamond SVG 정적 캐시)
- shipIconSvg.ts: MapLibre와 동일한 삼각형/마름모 SVG + mask 모드
- 선박 COG 회전 반영 (getAngle), 어구는 회전 없음
- 모델별 색상 배지 ScatterplotLayer 추가 (각 모델 offset)
- correlation 데이터 비동기 로드 후 store.updateCorrelation() 동기화
- CorrPosition에 cog 필드 추가 (세그먼트 방향 계산)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 08:08:39 +09:00
4cf29521a9 fix: 모델 패널 위치 상향 — 재생 컨트롤러와 겹침 해소
CorrelationPanel: historyData prop 제거 → useGearReplayStore 직접 구독
재생 활성 시 bottom: 80→100 (컨트롤러 높이 60px 확보)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 08:01:23 +09:00
87d1b31ef3 feat: 어구 리플레이 deck.gl + Zustand 전환 완료
Phase 3: DeckGLOverlay에 overlayRef 추가, KoreaMap에서
리플레이 레이어 합성 (imperative setProps → React 렌더 우회)

Phase 4: 기존 MapLibre 리플레이 레이어 → deck.gl 전환
- FleetClusterLayer: 애니메이션 state/ref/timer 제거 → Zustand 스토어
- useFleetClusterGeoJson: 리플레이 useMemo 15개 제거 (618→389줄)
- FleetClusterMapLayers: MapLibre 재생 레이어 6개 제거 (492→397줄)
- HistoryReplayController: React refs → Zustand subscribe 바인딩

성능: React re-render 20회/초 → 0회/초 (재생 중)
      GeoJSON 직렬화 15개/프레임 → 0 (raw 배열 → deck.gl)
      트레일: 매 프레임 재생성 → TripsLayer GPU 셰이더

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 07:54:50 +09:00
bbbc326e38 refactor: FleetClusterLayer 10파일 분리 + deck.gl 리플레이 기반 구축
FleetClusterLayer.tsx 2357줄 → 10개 파일 분리:
- fleetClusterTypes/Utils/Constants: 타입, 기하 함수, 모델 상수
- useFleetClusterGeoJson: 27개 useMemo GeoJSON 훅
- FleetClusterMapLayers: MapLibre Source/Layer JSX
- CorrelationPanel/HistoryReplayController: 패널 서브컴포넌트
- GearGroupSection/FleetGearListPanel: 좌측 목록 (DRY)
- FleetClusterLayer: 오케스트레이터 524줄

deck.gl + Zustand 리플레이 기반 (Phase 0~2):
- zustand 5.0.12, @deck.gl/geo-layers 9.2.11 설치
- gearReplayStore: Zustand + rAF 애니메이션 루프
- gearReplayPreprocess: TripsLayer 전처리 + cursor O(1) 보간
- useGearReplayLayers: deck.gl 레이어 빌더 (10fps 스로틀)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 07:44:07 +09:00
2fb0842523 fix: 연관성 패널 historyData 조건 제거 + 재생 컨트롤러 위 배치
- !historyData 조건 제거 — 어구 클릭 시 히스토리 자동 로딩되므로 항상 표시
- 히스토리 모드: bottom 80px (재생 컨트롤러 위), 비히스토리: bottom 20px
- z-index 21 (재생 컨트롤러 20 위)
- 오퍼레이셔널 폴리곤/이름 기반 하이라이트도 히스토리 조건 조정

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-30 12:56:22 +09:00
dc6070d619 fix: 모델 토글을 호버 팝업에서 하단 고정 패널로 이동
호버 팝업은 마우스 이동 시 사라져서 토글 조작 불가 →
어구 그룹 선택 시 하단 중앙에 고정 패널 배치:
- 좌측: 그룹 정보 + 폴리곤 오버레이 토글 (이름 기반 + 5개 모델)
- 우측: 연관 선박 목록 (default 모델 상위 12건, 스크롤)
- ✕ 버튼으로 선택 해제
- 히스토리 재생 컨트롤러와 동일 위치/스타일

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-30 12:45:30 +09:00
4c994e277a feat: 어구 그룹 멀티모델 폴리곤 오버레이 + 토글 UI
- 어구 그룹 선택 시 전체 모델(5개) 연관성 데이터 로드
- enabledModels 상태: 'identity'(이름 기반) + 'default' 기본 ON
- 모델별 오퍼레이셔널 폴리곤 클라이언트 생성 (70%+ 연관 대상 합산 convex hull)
- Source+Layer 오버레이: 모델별 고유 색상, 대시 라인 구분
- 팝업 UI: 모델 토글 체크박스 (최대 5개), 색상 인디케이터 + 70%+ 대상 수
- 연관 선박 상위 8건 바 그래프 (default 모델 기준)
- 선택 시 팝업 maxWidth 280px로 확장

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-30 12:38:09 +09:00
d025809793 feat: 어구 연관성 프론트엔드 표시 — Backend API + 팝업 UI
- Backend: GET /api/vessel-analysis/groups/{groupKey}/correlations 엔드포인트
- GroupPolygonService: gear_correlation_scores JOIN correlation_param_models 쿼리
- Frontend: fetchGroupCorrelations API 클라이언트 + GearCorrelationItem 타입
- FleetClusterLayer: 어구 그룹 선택 시 연관 선박/어구 목록 팝업에 표시
  - default 모델 기준 일치율 % + 바 그래프
  - 선박(⛴)/어구(◆) 유형 구분, 상위 8건 표시

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-30 11:33:56 +09:00
54b49551e2 feat(replay): 어구/선단 히스토리 보간 애니메이션 강화
- fillGapFrames: API 응답 로드 시 빈 구간 보간 프레임 삽입
  - gap ≤ 30분: 5분 간격 직선 보간 (중심만, 폴리곤 유지)
  - gap > 30분: 30분 간격 멤버 위치 보간 + convex hull 가상 폴리곤
- _interp/_longGap 플래그로 원본/보간/장기gap 프레임 구분
- 빨간 중심 포인트: 현재 재생 시점 위치 표시
- 가상 구간 회색 렌더링 (폴리곤/아이콘/라벨)
- 중심선: 실데이터 노란색 + 장기gap 주황색 파선
- 재생바: 원본 데이터만 표시 (보간 프레임 제외)
- buildInterpPolygon: Python polygon_builder.py 동일 로직
2026-03-26 15:53:21 +09:00
7fe9e048bf refactor(debug): DebugTools 허브 패턴 — 단일 lazy import로 통합
- debug/index.tsx: 모든 디버그 도구 조합 export
- KoreaMap: lazy import 1줄 + JSX 1줄만 유지
- 디버그 도구 추가/제거 시 debug/index.tsx만 수정
2026-03-26 10:46:05 +09:00
364a34ce10 refactor(debug): 자체 완결형 DevCoordDebug로 전환 — 프로덕션 번들 완전 제거 보장
- lazy + 동적 import로 DEV에서만 청크 로드
- mapRef 기반 이벤트 등록으로 KoreaMap 코드에 디버그 흔적 없음
- 이전 CoordDebugTool/useCoordDebug 삭제
2026-03-26 10:30:58 +09:00
8f342f70b7 feat(debug): Ctrl+Click 좌표 디버그 도구 + DEV 가드 체계 구축
- CoordDebugTool: Ctrl+Click 다중 좌표 표시 (DD/DMS, WGS84)
- import.meta.env.DEV 가드로 프로덕션 빌드에서 코드 제거
- CLAUDE.md: 디버그 도구 가이드 섹션 추가
2026-03-26 10:17:04 +09:00
e797beaac6 feat(chat): Ollama Qwen3 기반 AI 해양분석 채팅 구축
- Ollama Docker(14b/32b) + Redis 컨텍스트 캐싱 + 대화 히스토리
- Python SSE 채팅 엔드포인트 + 사전 쿼리 + Tool Calling
- 도메인 지식(해양법/어업협정/알고리즘) + DB 스키마 가이드
- Frontend SSE 스트리밍 + 타이머 + thinking 접기 + 확장 UI
2026-03-26 09:03:05 +09:00
1bf70f46ac feat: 분석 용어/색상 통일 + 경량 분석 + 항적 미니맵
- AI분석/현장분석/보고서 위험도 용어 통일 (HIGH→WATCH, MEDIUM→MONITOR, LOW→NORMAL)
- 공통 riskMapping.ts: ALERT_COLOR/EMOJI/LEVELS, RISK_TO_ALERT, STATS_KEY_MAP
- deck.gl 오버레이 색상 현장분석 팔레트로 통일
- Python 경량 분석: 파이프라인 미통과 412* 선박에 위치 기반 간이 AnalysisResult 생성
- 현장분석 fallback 제거: classifyStateFallback/classifyFishingZone → Python 결과 전용
- 보고서 위험 평가: Python riskCounts 실데이터 기반으로 전면 교체
- 현장분석 우측 패널: 항적 미니맵 (72시간, fetchVesselTrack API)
- 현장분석 좌측 패널: 위험도 점수 기준 섹션 추가
2026-03-25 12:39:22 +09:00
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
Nan Kyung Lee
81bced4367 feat(iran): S&P Global Marine Risk Note 반영 — 이란 상선공격 27척 피격 데이터
- S&P Global Market Intelligence (2026-03-19) 보고서 기반
- 이란 상선 공격 총 30건 중 식별 가능한 27척 데이터 추가
- 선박별: IMO, 국적, 유형, 피격 일시, 위치, 피해 정도
- 유형별: 탱커 52%, 벌크선 21%, 컨테이너 17%, 예인선 7%
- 해역별: UAE 48%, 오만 28%, 쿠웨이트/카타르 등
- 기존 리플레이 이벤트 ID와 연동

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-24 06:34:51 +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