fix: 중국어선감시 지도 멈춤 해결 — 마커 수 제한 + 이벤트 차단 CSS, 탑메뉴 불법어선 제거

This commit is contained in:
Nan Kyung Lee 2026-03-20 08:54:32 +09:00
부모 a467540dda
커밋 d000807909
3개의 변경된 파일25개의 추가작업 그리고 30개의 파일을 삭제

파일 보기

@ -1881,6 +1881,11 @@
border-top-color: rgba(10, 10, 26, 0.96) !important; border-top-color: rgba(10, 10, 26, 0.96) !important;
} }
/* 중국어선 오버레이 마커 — 이벤트 차단 */
.maplibregl-marker:has(.cn-fishing-no-events) {
pointer-events: none;
}
.gl-popup .maplibregl-popup-close-button, .gl-popup .maplibregl-popup-close-button,
.event-popup .maplibregl-popup-close-button { .event-popup .maplibregl-popup-close-button {
color: #aaa !important; color: #aaa !important;

파일 보기

@ -253,15 +253,6 @@ function AuthenticatedApp({ user, onLogout }: AuthenticatedAppProps) {
{dashboardTab === 'korea' && ( {dashboardTab === 'korea' && (
<div className="mode-toggle"> <div className="mode-toggle">
<button
type="button"
className={`mode-btn ${koreaFiltersResult.filters.illegalFishing ? 'active live' : ''}`}
onClick={() => koreaFiltersResult.setFilter('illegalFishing', !koreaFiltersResult.filters.illegalFishing)}
title={t('filters.illegalFishing')}
>
<span className="text-[11px]">🚫🐟</span>
{t('filters.illegalFishing')}
</button>
<button <button
type="button" type="button"
className={`mode-btn ${koreaFiltersResult.filters.illegalTransship ? 'active live' : ''}`} className={`mode-btn ${koreaFiltersResult.filters.illegalTransship ? 'active live' : ''}`}

파일 보기

@ -194,32 +194,33 @@ export function ChineseFishingOverlay({ ships }: Props) {
</Source> </Source>
)} )}
{/* 어구/어망 위치 마커 (모선 연결된 것) */} {/* 어구/어망 위치 마커 (모선 연결된 것) — 최대 50개 */}
{gearLinks.map(link => ( {gearLinks.slice(0, 50).map(link => (
<Marker key={`gearlink-${link.gear.mmsi}`} longitude={link.gear.lng} latitude={link.gear.lat} anchor="center"> <Marker key={`gearlink-${link.gear.mmsi}`} longitude={link.gear.lng} latitude={link.gear.lat} anchor="center">
<div style={{ filter: 'drop-shadow(0 0 3px #f9731688)', pointerEvents: 'none' }}> <div className="cn-fishing-no-events">
<FishingNetIcon color="#f97316" size={10} /> <div style={{ filter: 'drop-shadow(0 0 3px #f9731688)' }}>
</div> <FishingNetIcon color="#f97316" size={10} />
<div style={{ </div>
fontSize: 5, color: '#f97316', textAlign: 'center', <div style={{
textShadow: '0 0 2px #000', fontWeight: 700, marginTop: -1, fontSize: 5, color: '#f97316', textAlign: 'center',
whiteSpace: 'nowrap', pointerEvents: 'none', textShadow: '0 0 2px #000', fontWeight: 700, marginTop: -1,
}}> whiteSpace: 'nowrap',
{link.parentName} }}>
{link.parentName}
</div>
</div> </div>
</Marker> </Marker>
))} ))}
{/* 조업 중 어선 — 어구 아이콘 */} {/* 조업 중 어선 — 어구 아이콘 — 최대 80개 */}
{operating.map(({ ship, analysis }) => { {operating.slice(0, 80).map(({ ship, analysis }) => {
const meta = GEAR_LABELS[analysis.gearType]; const meta = GEAR_LABELS[analysis.gearType];
return ( return (
<Marker key={`gear-${ship.mmsi}`} longitude={ship.lng} latitude={ship.lat} anchor="bottom"> <Marker key={`gear-${ship.mmsi}`} longitude={ship.lng} latitude={ship.lat} anchor="bottom">
<div style={{ <div className="cn-fishing-no-events" style={{
marginBottom: 8, marginBottom: 8,
filter: `drop-shadow(0 0 3px ${meta?.color || '#f97316'}88)`, filter: `drop-shadow(0 0 3px ${meta?.color || '#f97316'}88)`,
opacity: 0.85, opacity: 0.85,
pointerEvents: 'none',
}}> }}>
<GearIcon gear={analysis.gearType} size={12} /> <GearIcon gear={analysis.gearType} size={12} />
</div> </div>
@ -227,10 +228,10 @@ export function ChineseFishingOverlay({ ships }: Props) {
); );
})} })}
{/* 본선/부속선/어선 역할 라벨 */} {/* 본선/부속선/어선 역할 라벨 — 최대 100개 */}
{analyzed.filter(a => a.role.role).map(({ ship, role }) => ( {analyzed.filter(a => a.role.role).slice(0, 100).map(({ ship, role }) => (
<Marker key={`role-${ship.mmsi}`} longitude={ship.lng} latitude={ship.lat} anchor="top"> <Marker key={`role-${ship.mmsi}`} longitude={ship.lng} latitude={ship.lat} anchor="top">
<div style={{ <div className="cn-fishing-no-events" style={{
marginTop: 6, marginTop: 6,
fontSize: 5, fontSize: 5,
fontWeight: 700, fontWeight: 700,
@ -238,7 +239,6 @@ export function ChineseFishingOverlay({ ships }: Props) {
textShadow: '0 0 2px #000, 0 0 2px #000', textShadow: '0 0 2px #000, 0 0 2px #000',
textAlign: 'center', textAlign: 'center',
whiteSpace: 'nowrap', whiteSpace: 'nowrap',
pointerEvents: 'none',
}}> }}>
{role.roleKo} {role.roleKo}
</div> </div>
@ -248,7 +248,7 @@ export function ChineseFishingOverlay({ ships }: Props) {
{/* 운반선 라벨 */} {/* 운반선 라벨 */}
{carriers.map(s => ( {carriers.map(s => (
<Marker key={`carrier-${s.mmsi}`} longitude={s.lng} latitude={s.lat} anchor="top"> <Marker key={`carrier-${s.mmsi}`} longitude={s.lng} latitude={s.lat} anchor="top">
<div style={{ <div className="cn-fishing-no-events" style={{
marginTop: 6, marginTop: 6,
fontSize: 5, fontSize: 5,
fontWeight: 700, fontWeight: 700,
@ -256,7 +256,6 @@ export function ChineseFishingOverlay({ ships }: Props) {
textShadow: '0 0 2px #000, 0 0 2px #000', textShadow: '0 0 2px #000, 0 0 2px #000',
textAlign: 'center', textAlign: 'center',
whiteSpace: 'nowrap', whiteSpace: 'nowrap',
pointerEvents: 'none',
}}> }}>
</div> </div>