From 18b827ced03b2341a08b3f84592cacbca99da378 Mon Sep 17 00:00:00 2001 From: htlee Date: Mon, 23 Mar 2026 12:46:23 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20=ED=95=9C=EA=B5=AD=20=ED=95=84=ED=84=B0?= =?UTF-8?q?=20=ED=86=A0=EA=B8=80=20=EC=8B=9C=20=EC=84=A0=EB=B0=95=20?= =?UTF-8?q?=ED=91=9C=EC=8B=9C=20=EB=B3=B5=EC=9B=90=20+=20=ED=95=84?= =?UTF-8?q?=ED=84=B0=EB=B3=84=20=EA=B0=9C=EB=B3=84=20=ED=83=90=EC=A7=80=20?= =?UTF-8?q?=EC=B9=B4=EC=9A=B4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - anyKoreaFilterOn 시 filteredShips(필터 결과) 전달, 비활성 시 allShips(전체) 전달 - 상단 배너: 합산 "N척 탐지" → 필터별 개별 카운트 (불법어선 3척, 다크베셀 5척 등) Co-Authored-By: Claude Opus 4.6 (1M context) --- frontend/src/components/korea/KoreaMap.tsx | 32 ++++++++++++++++++---- 1 file changed, 26 insertions(+), 6 deletions(-) diff --git a/frontend/src/components/korea/KoreaMap.tsx b/frontend/src/components/korea/KoreaMap.tsx index 844990d..ac3db2e 100644 --- a/frontend/src/components/korea/KoreaMap.tsx +++ b/frontend/src/components/korea/KoreaMap.tsx @@ -189,7 +189,8 @@ export function KoreaMap({ ships, allShips, aircraft, satellites, layers, osintF ); }, []); - // 줌 레벨별 아이콘/심볼 스케일 배율 — z4=1.0x 기준, 2단계씩 상향 + const anyKoreaFilterOn = koreaFilters.illegalFishing || koreaFilters.illegalTransship || koreaFilters.darkVessel || koreaFilters.cableWatch || koreaFilters.dokdoWatch || koreaFilters.ferryWatch; + // 줌 레벨별 아이콘/심볼 스케일 배율 — z4=0.8x, z6=1.0x 시작, 2단계씩 상향 const zoomScale = useMemo(() => { if (zoomLevel <= 4) return 0.8; @@ -568,7 +569,13 @@ export function KoreaMap({ ships, allShips, aircraft, satellites, layers, osintF /> - {layers.ships && } + {layers.ships && } {/* Transship suspect labels — Marker DOM, inline styles kept for dynamic border color */} {transshipSuspects.size > 0 && ships.filter(s => transshipSuspects.has(s.mmsi)).map(s => ( @@ -671,14 +678,29 @@ export function KoreaMap({ ships, allShips, aircraft, satellites, layers, osintF {layers.osint && } {layers.eez && } - {/* Filter Status Banner */} + {/* Filter Status Banner — 필터별 개별 탐지 카운트 */} {(() => { const active = (Object.keys(koreaFilters) as (keyof KoreaFiltersState)[]).filter(k => koreaFilters[k]); if (active.length === 0) return null; + const filterCount: Record = { + illegalFishing: (allShips ?? ships).filter(s => { + if (s.mtCategory !== 'fishing' || s.flag === 'KR') return false; + return classifyFishingZone(s.lat, s.lng).zone !== 'OUTSIDE'; + }).length, + illegalTransship: transshipSuspects.size, + darkVessel: ships.filter(s => { + const dto = vesselAnalysis?.analysisMap.get(s.mmsi); + return dto?.algorithms.darkVessel.isDark || (s.lastSeen && currentTime - s.lastSeen > 3600000); + }).length, + cableWatch: cableWatchSuspects.size, + dokdoWatch: dokdoWatchSuspects.size, + ferryWatch: (allShips ?? ships).filter(s => s.mtCategory === 'passenger').length, + }; return (
{active.map(k => { const color = FILTER_COLOR[k]; + const count = filterCount[k] ?? 0; return (
{FILTER_ICON[k]} {t(FILTER_I18N_KEY[k])} + {count}척
); })} -
- {t('korea.detected', { count: ships.length })} -
); })()}