prediction/ 변경 시 ssh redis-211으로 수동 scp + restart
CI/CD는 Frontend + Backend만 자동 배포
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
사전계산 (gearReplayPreprocess):
- buildModelCenterTrails(): 각 프레임에서 멤버+연관선박 위치 → 폴리곤 → 중심점
- 모델별 path[]/timestamps[] (PathLayer + 보간용)
스토어 (gearReplayStore):
- modelCenterTrails 필드 추가 (loadHistory/updateCorrelation에서 빌드)
렌더링 (useGearReplayLayers):
- PathLayer: 모델별 폴리곤 중심 경로 (연한 모델 색상, alpha 100)
- ScatterplotLayer: 현재 시간 중심점 (고채도 모델 색상, 흰 테두리)
- 모델 ON 시에만 표시 (enabledModels 체크)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
패널 위치:
- left: 10 → left: calc(50% - 210px) (재생 컨트롤러 중앙 정렬 근처)
일치율 드롭다운 전역 적용:
- 기존: 현재 ON인 모델의 대상만 필터
- 수정: 모든 모델의 모든 대상에 전역 적용 (모델 on/off 무관)
- 동일 MMSI가 여러 모델에 있을 때 최고 score 기준 판단
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- kcgdb.get_conn()을 with문 없이 사용 → cursor 에러
- with kcgdb.get_conn() as conn: 으로 수정
- 디버그 로그 추가 (rows 수, track 매칭 수, vessel_store 크기)
- 결과: 47 vessels, 47 with track data (25567#1 그룹)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- 트랙 시간 범위 밖: 가장 가까운 끝점으로 clamp (기존: skip)
→ 트랙 시작 전 = 첫 점, 트랙 종료 후 = 마지막 점
- 디버그 로그: corrPositions 상세 (track/live 소스별, 모델별 위치확인 수)
- 기존 중복 로그 정리
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
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>
- 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>
데이터 로딩:
- 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>
- 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>
- 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>
CorrelationPanel: historyData prop 제거 → useGearReplayStore 직접 구독
재생 활성 시 bottom: 80→100 (컨트롤러 높이 60px 확보)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- !historyData 조건 제거 — 어구 클릭 시 히스토리 자동 로딩되므로 항상 표시
- 히스토리 모드: bottom 80px (재생 컨트롤러 위), 비히스토리: bottom 20px
- z-index 21 (재생 컨트롤러 20 위)
- 오퍼레이셔널 폴리곤/이름 기반 하이라이트도 히스토리 조건 조정
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
호버 팝업은 마우스 이동 시 사라져서 토글 조작 불가 →
어구 그룹 선택 시 하단 중앙에 고정 패널 배치:
- 좌측: 그룹 정보 + 폴리곤 오버레이 토글 (이름 기반 + 5개 모델)
- 우측: 연관 선박 목록 (default 모델 상위 12건, 스크롤)
- ✕ 버튼으로 선택 해제
- 히스토리 재생 컨트롤러와 동일 위치/스타일
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- 어구 그룹 선택 시 전체 모델(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>
scores 테이블에는 composite 점수만, 세부 메트릭(proximity/visit/heading)은
raw_metrics에 있으므로 LATERAL JOIN으로 최신 raw 메트릭 결합
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- 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>
- fillGapFrames: API 응답 로드 시 빈 구간 보간 프레임 삽입
- gap ≤ 30분: 5분 간격 직선 보간 (중심만, 폴리곤 유지)
- gap > 30분: 30분 간격 멤버 위치 보간 + convex hull 가상 폴리곤
- _interp/_longGap 플래그로 원본/보간/장기gap 프레임 구분
- 빨간 중심 포인트: 현재 재생 시점 위치 표시
- 가상 구간 회색 렌더링 (폴리곤/아이콘/라벨)
- 중심선: 실데이터 노란색 + 장기gap 주황색 파선
- 재생바: 원본 데이터만 표시 (보간 프레임 제외)
- buildInterpPolygon: Python polygon_builder.py 동일 로직
- AI 파이프라인 PROC 순환 애니메이션 → analysisMap 기반 ON/OFF 상태
- BD-09 STANDBY → bd09OffsetM 실측 탐지 수 표시
- 보고서 수역별 허가업종: ZONE_ALLOWED 상수 동적 참조
- 건의사항: 월/최대 어구 선단 실데이터 연동
- 보고서 버튼: 헤더 → 현장분석 내부로 이동