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>
This commit is contained in:
htlee 2026-03-20 16:19:31 +09:00
부모 4c9eebab50
커밋 a009534c35
3개의 변경된 파일20개의 추가작업 그리고 16개의 파일을 삭제

파일 보기

@ -320,7 +320,7 @@ export function AnalysisStatsPanel({ stats, lastUpdated, isLoading, analysisMap,
{item.mmsi} {item.mmsi}
</span> </span>
<span style={{ color, fontWeight: 700, fontSize: 10, flexShrink: 0 }}> <span style={{ color, fontWeight: 700, fontSize: 10, flexShrink: 0 }}>
{Math.round(item.score * 100)} {item.score}
</span> </span>
<span style={{ color: '#94a3b8', fontSize: 9, flexShrink: 0 }}></span> <span style={{ color: '#94a3b8', fontSize: 9, flexShrink: 0 }}></span>
</div> </div>

파일 보기

@ -240,20 +240,24 @@ export function KoreaMap({ ships, allShips, aircraft, satellites, layers, osintF
return classifyFishingZone(s.lat, s.lng).zone !== 'OUTSIDE'; return classifyFishingZone(s.lat, s.lng).zone !== 'OUTSIDE';
}).slice(0, 200).map(s => ( }).slice(0, 200).map(s => (
<Marker key={`illegal-${s.mmsi}`} longitude={s.lng} latitude={s.lat} anchor="center"> <Marker key={`illegal-${s.mmsi}`} longitude={s.lng} latitude={s.lat} anchor="center">
<div style={{ <div style={{ position: 'relative', pointerEvents: 'none' }}>
width: 20, height: 20, borderRadius: '50%', {/* 강조 펄스 링 — 선박 아이콘 중앙에 오버레이 */}
border: '2px solid #ef4444', <div style={{
backgroundColor: 'rgba(239, 68, 68, 0.2)', width: 24, height: 24, borderRadius: '50%',
animation: 'pulse 2s infinite', border: '2px solid #ef4444',
pointerEvents: 'none', backgroundColor: 'rgba(239, 68, 68, 0.15)',
}} /> animation: 'pulse 2s infinite',
<div style={{ boxShadow: '0 0 8px rgba(239, 68, 68, 0.4)',
fontSize: 8, fontWeight: 700, color: '#ef4444', }} />
textShadow: '0 0 2px #000, 0 0 2px #000', {/* 선박명 — 아이콘 아래 */}
textAlign: 'center', marginTop: -2, <div style={{
whiteSpace: 'nowrap', pointerEvents: 'none', position: 'absolute', top: 26, left: '50%', transform: 'translateX(-50%)',
}}> fontSize: 8, fontWeight: 700, color: '#ef4444',
{s.name || s.mmsi} textShadow: '0 0 2px #000, 0 0 2px #000',
whiteSpace: 'nowrap',
}}>
{s.name || s.mmsi}
</div>
</div> </div>
</Marker> </Marker>
))} ))}

파일 보기

@ -10,7 +10,7 @@ logger = logging.getLogger(__name__)
def detect_group_clusters( def detect_group_clusters(
vessel_snapshots: list[dict], vessel_snapshots: list[dict],
spatial_eps_nm: float = 10.0, spatial_eps_nm: float = 3.0,
time_eps_hours: float = 2.0, time_eps_hours: float = 2.0,
min_vessels: int = 3, min_vessels: int = 3,
) -> dict[int, list[dict]]: ) -> dict[int, list[dict]]: