diff --git a/docs/RELEASE-NOTES.md b/docs/RELEASE-NOTES.md index 2c5f029..adbe1a5 100644 --- a/docs/RELEASE-NOTES.md +++ b/docs/RELEASE-NOTES.md @@ -4,6 +4,23 @@ ## [Unreleased] +### 추가 +- 중국어선 조업분석: AIS Ship Type 30 + 선박명 패턴 분류, GC-KCG-2026-001/CSSA 기반 안강망 추가 +- 중국어선 선단 탐지: 본선-부속선 쌍, 운반선 환적, 선망 선단 +- 어구/어망 카테고리 신설 + 모선 연결선 시각화 +- 어구 SVG 아이콘 5종 (트롤/자망/안강망/선망/기본) +- 이란 주변국 시설 레이어 (MEFacilityLayer 35개소) +- 사우스파르스 가스전 피격 + 카타르 라스라판 보복 공격 반영 +- 한국 해군부대 10개소, 항만, 풍력발전단지, 북한 발사대/미사일 이벤트 레이어 +- 정부기관 건물 레이어 (GovBuildingLayer) +- CCTV 프록시 컨트롤러 + +### 변경 +- 레이어 재구성: 선박(최상위) → 항공망 → 해양안전 → 국가기관망 +- 오른쪽 패널 접기/펼치기 기능 +- 센서차트 기본 숨김 +- CCTV 레이어 리팩토링 + ## [2026-03-19] ### 변경 diff --git a/frontend/src/components/korea/MilitaryBaseLayer.tsx b/frontend/src/components/korea/MilitaryBaseLayer.tsx index 03a1396..f33cd5e 100644 --- a/frontend/src/components/korea/MilitaryBaseLayer.tsx +++ b/frontend/src/components/korea/MilitaryBaseLayer.tsx @@ -18,7 +18,7 @@ const TYPE_STYLE: Record joint: { icon: '⭐', label: '합동기지', color: '#a78bfa' }, }; -function MilIcon({ type, size = 16 }: { type: string; size?: number }) { +function _MilIcon({ type, size = 16 }: { type: string; size?: number }) { const ts = TYPE_STYLE[type] || TYPE_STYLE.army; return ( @@ -34,7 +34,7 @@ export function MilitaryBaseLayer() { return ( <> {MILITARY_BASES.map(base => { - const cs = COUNTRY_STYLE[base.country] || COUNTRY_STYLE.CN; + const _cs = COUNTRY_STYLE[base.country] || COUNTRY_STYLE.CN; const ts = TYPE_STYLE[base.type] || TYPE_STYLE.army; return ( ; __kindCodeLogged?: boolean }; + if (!w.__kindCodeMap) w.__kindCodeMap = {}; + const km = w.__kindCodeMap; const key = `${kindCode}|${rawShipTy}`; km[key] = (km[key] || 0) + 1; - if (!(window as any).__kindCodeLogged && Object.keys(km).length > 20) { - (window as any).__kindCodeLogged = true; + if (!w.__kindCodeLogged && Object.keys(km).length > 20) { + w.__kindCodeLogged = true; console.log('[SHIP DEBUG] kindCode|shipTy distribution:', JSON.stringify( - Object.entries(km).sort((a: any, b: any) => (b[1] as number) - (a[1] as number)).slice(0, 30) + Object.entries(km).sort((a, b) => b[1] - a[1]).slice(0, 30) )); } } diff --git a/frontend/src/utils/fishingAnalysis.ts b/frontend/src/utils/fishingAnalysis.ts index 66c79ff..ad93e24 100644 --- a/frontend/src/utils/fishingAnalysis.ts +++ b/frontend/src/utils/fishingAnalysis.ts @@ -45,7 +45,7 @@ export { GEAR_META as GEAR_LABELS }; /** * 특정어업수역 정의 (한중어업협정) */ -const FISHING_ZONES = { +const _FISHING_ZONES = { I: { name: '수역Ⅰ(동해)', lngMin: 128.86, lngMax: 131.67, latMin: 35.65, latMax: 38.25, allowed: ['PS', 'FC'] }, II: { name: '수역Ⅱ(남해)', lngMin: 126.00, lngMax: 128.89, latMin: 32.18, latMax: 34.34, allowed: ['PT', 'OT', 'GN', 'PS', 'FC'] }, III:{ name: '수역Ⅲ(서남해)', lngMin: 124.01, lngMax: 126.08, latMin: 32.18, latMax: 35.00, allowed: ['PT', 'OT', 'GN', 'PS', 'FC'] }, diff --git a/frontend/src/utils/fleetDetection.ts b/frontend/src/utils/fleetDetection.ts index a84cbab..fc2dc5a 100644 --- a/frontend/src/utils/fleetDetection.ts +++ b/frontend/src/utils/fleetDetection.ts @@ -40,7 +40,7 @@ function distNm(lat1: number, lng1: number, lat2: number, lng2: number): number export function detectFleet(selectedShip: Ship, allShips: Ship[]): FleetConnection | null { if (selectedShip.flag !== 'CN') return null; - const mtCat = getMarineTrafficCategory(selectedShip.typecode, selectedShip.category); + const _mtCat = getMarineTrafficCategory(selectedShip.typecode, selectedShip.category); const members: FleetMember[] = []; // 주변 중국 선박 탐색 (10NM 반경)