diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index a50d4a4..6e14fc3 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -666,7 +666,11 @@ function AuthenticatedApp({ user, onLogout }: AuthenticatedAppProps) { setShowReport(false)} /> )} {showOpsGuide && ( - setShowOpsGuide(false)} /> + setShowOpsGuide(false)} + onFlyTo={(lat, lng, zoom) => setFlyToTarget({ lat, lng, zoom })} + /> )} void; + onFlyTo?: (lat: number, lng: number, zoom: number) => void; } -type Tab = 'overview' | 'pt' | 'gn' | 'ps' | 'fc' | 'gear' | 'alert'; +interface SuspectVessel { + ship: Ship; + distance: number; // NM from selected KCG + reasons: string[]; + riskLevel: 'CRITICAL' | 'HIGH' | 'MEDIUM'; +} -const C = { - bg: '#0a0f1a', card: '#111827', border: '#1e293b', - text: '#e2e8f0', dim: '#64748b', accent: '#3b82f6', - green: '#22c55e', red: '#ef4444', yellow: '#f59e0b', cyan: '#06b6d4', -}; +function haversineNM(lat1: number, lng1: number, lat2: number, lng2: number): number { + const R = 3440.065; // Earth radius in NM + const dLat = (lat2 - lat1) * Math.PI / 180; + const dLng = (lng2 - lng1) * Math.PI / 180; + const a = Math.sin(dLat / 2) ** 2 + Math.cos(lat1 * Math.PI / 180) * Math.cos(lat2 * Math.PI / 180) * Math.sin(dLng / 2) ** 2; + return 2 * R * Math.asin(Math.sqrt(a)); +} -const TABS: { key: Tab; label: string; icon: string }[] = [ - { key: 'overview', label: '์ž‘์ „ ๊ฐœ์š”', icon: '๐Ÿ—บ' }, - { key: 'pt', label: 'PT ์ €์ธ๋ง', icon: '๐Ÿ”ด' }, - { key: 'gn', label: 'GN ์œ ์ž๋ง', icon: '๐ŸŸก' }, - { key: 'ps', label: 'PS ์œ„๋ง', icon: '๐ŸŸฃ' }, - { key: 'fc', label: 'FC ์šด๋ฐ˜์„ ', icon: '๐ŸŸ ' }, - { key: 'gear', label: '์–ด๊ตฌ ์ˆ˜๊ฑฐ', icon: '๐Ÿชค' }, - { key: 'alert', label: '์กฐ์น˜ ๊ธฐ์ค€', icon: '๐Ÿšจ' }, -]; +const RISK_COLOR = { CRITICAL: '#ef4444', HIGH: '#f59e0b', MEDIUM: '#3b82f6' }; +const RISK_ICON = { CRITICAL: '๐Ÿ”ด', HIGH: '๐ŸŸก', MEDIUM: '๐Ÿ”ต' }; -export function OpsGuideModal({ onClose }: Props) { - const [tab, setTab] = useState('overview'); +export function OpsGuideModal({ ships, onClose, onFlyTo }: Props) { + const [selectedKCG, setSelectedKCG] = useState(null); + const [searchRadius, setSearchRadius] = useState(30); // NM + + // ํ•ด๊ฒฝ์„œ/์ง€๋ฐฉ์ฒญ๋งŒ (ํŒŒ์ถœ์†Œ ์ œ์™ธ) + const kcgBases = useMemo(() => + COAST_GUARD_FACILITIES.filter(f => ['hq', 'regional', 'station', 'navy'].includes(f.type)) + .sort((a, b) => a.name.localeCompare(b.name)), + []); + + // ์„ ํƒ๋œ ํ•ด๊ฒฝ ๊ธฐ์ง€ ์ฃผ๋ณ€ ์˜์‹ฌ ์„ ๋ฐ• ํƒ์ง€ + const suspects = useMemo(() => { + if (!selectedKCG) return []; + + const results: SuspectVessel[] = []; + + for (const ship of ships) { + if (ship.flag !== 'CN') continue; + const dist = haversineNM(selectedKCG.lat, selectedKCG.lng, ship.lat, ship.lng); + if (dist > searchRadius) continue; + + const cat = getMarineTrafficCategory(ship.typecode, ship.category); + const isFishing = cat === 'fishing' || ship.category === 'fishing' || ship.typecode === '30'; + const isGear = /[_]\d+[_]|%$/.test(ship.name); + const analysis = isFishing ? analyzeFishing(ship) : null; + const zone = classifyFishingZone(ship.lat, ship.lng); + + const reasons: string[] = []; + let riskLevel: 'CRITICAL' | 'HIGH' | 'MEDIUM' = 'MEDIUM'; + + // ์ˆ˜์—ญ ์™ธ ์–ด์„  + if (isFishing && zone.zone === 'OUTSIDE') { + reasons.push('๋น„ํ—ˆ๊ฐ€ ์ˆ˜์—ญ ์ง„์ž…'); + riskLevel = 'CRITICAL'; + } + + // ์ˆ˜์—ญ I์— PT/OT ์„ ๋ฐ• + if (isFishing && zone.zone === 'ZONE_I' && ship.speed >= 2 && ship.speed <= 5) { + reasons.push('์ˆ˜์—ญI ์ €์ธ๋ง ์˜์‹ฌ (PT/OT ๋น„ํ—ˆ๊ฐ€)'); + riskLevel = 'HIGH'; + } + + // ๋‹คํฌ๋ฒ ์…€ ์˜์‹ฌ (์†๋„ 0, ๋ฐฉํ–ฅ 0) + if (isFishing && ship.speed === 0 && (!ship.heading || ship.heading === 0)) { + reasons.push('AIS ๋น„์ •์ƒ (๋‹คํฌ๋ฒ ์…€ ์˜์‹ฌ)'); + if (riskLevel === 'MEDIUM') riskLevel = 'HIGH'; + } + + // ์กฐ์—… ์ค‘ (2-6kn) + if (isFishing && ship.speed >= 2 && ship.speed <= 6) { + reasons.push(`์กฐ์—… ์ถ”์ • (${ship.speed.toFixed(1)}kn)`); + } + + // ์–ด๊ตฌ/์–ด๋ง + if (isGear) { + reasons.push('์–ด๊ตฌ/์–ด๋ง AIS ์‹ ํ˜ธ'); + if (riskLevel === 'MEDIUM') riskLevel = 'HIGH'; + } + + // ๋Œ€ํ˜• ์„ ๋ฐ• (์šด๋ฐ˜์„  ์˜์‹ฌ) + if (!isFishing && (cat === 'cargo' || cat === 'unspecified') && ship.speed < 3) { + reasons.push('์šด๋ฐ˜์„ /ํ™˜์  ์˜์‹ฌ (์ €์† ๋Œ€ํ˜•)'); + } + + if (reasons.length > 0) { + results.push({ ship, distance: dist, reasons, riskLevel }); + } + } + + return results.sort((a, b) => { + const riskOrder = { CRITICAL: 0, HIGH: 1, MEDIUM: 2 }; + return riskOrder[a.riskLevel] - riskOrder[b.riskLevel] || a.distance - b.distance; + }); + }, [selectedKCG, ships, searchRadius]); + + const criticalCount = suspects.filter(s => s.riskLevel === 'CRITICAL').length; + const highCount = suspects.filter(s => s.riskLevel === 'HIGH').length; return (
-
e.stopPropagation()}> +
e.stopPropagation()}> {/* Header */} -
+
โš“ - ๊ฒฝ๋น„ํ•จ์ • ์ž‘์ „ ๊ฐ€์ด๋“œ - GC-KCG-2026-001 ์ œ7์žฅ ๊ธฐ๋ฐ˜ - + ๊ฒฝ๋น„ํ•จ์ • ์ž‘์ „ ๊ฐ€์ด๋“œ + ํ•ด๊ฒฝ ๊ธฐ์ง€ ๊ธฐ์ค€ ์ฃผ๋ณ€ ๋ถˆ๋ฒ•์–ด์„ ยท์–ด๊ตฌ ํƒ์ง€ +
- {/* Tabs */} -
- {TABS.map(t => ( - - ))} + {/* Controls */} +
+ + + + + + + {selectedKCG && ( +
+ ๐Ÿ”ด CRITICAL {criticalCount} + ๐ŸŸก HIGH {highCount} + ๐Ÿ”ต TOTAL {suspects.length} +
+ )}
{/* Content */} -
- {tab === 'overview' && } - {tab === 'pt' && } - {tab === 'gn' && } - {tab === 'ps' && } - {tab === 'fc' && } - {tab === 'gear' && } - {tab === 'alert' && } +
+ {!selectedKCG ? ( +
+
โš“
+
์ถœ๋™ ๊ธฐ์ง€๋ฅผ ์„ ํƒํ•˜๋ฉด ์ฃผ๋ณ€ ๋ถˆ๋ฒ•์–ด์„ ยท์–ด๊ตฌ๋ฅผ ์ž๋™ ํƒ์ง€ํ•ฉ๋‹ˆ๋‹ค
+
ํ•ด๊ฒฝ์„œ/์ง€๋ฐฉ์ฒญ/ํ•ด๊ตฐ๋ถ€๋Œ€ ๊ธฐ์ค€ ๋ฐ˜๊ฒฝ ๋‚ด ์ค‘๊ตญ ์„ ๋ฐ• ๋ถ„์„
+
+ ) : suspects.length === 0 ? ( +
+
โœ…
+
{selectedKCG.name} ๋ฐ˜๊ฒฝ {searchRadius}NM ๋‚ด ์˜์‹ฌ ์„ ๋ฐ• ์—†์Œ
+
+ ) : ( +
+ {/* Route summary */} +
+
+ ๐Ÿ“ {selectedKCG.name} โ†’ ์ˆœ์ฐฐ ๋ฃจํŠธ ์ œ์•ˆ ({suspects.length}๊ฑด) +
+
+ ์šฐ์„ ์ˆœ์œ„: CRITICAL โ†’ HIGH โ†’ MEDIUM | ๊ฑฐ๋ฆฌ์ˆœ ์ •๋ ฌ | ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๊ณ ์œ„ํ—˜ ๋Œ€์ƒ๋ถ€ํ„ฐ ์ˆœ์ฐฐ +
+ {criticalCount > 0 && ( +
+ โš  CRITICAL {criticalCount}๊ฑด โ€” ์ฆ‰์‹œ ์ถœ๋™ ๊ถŒ๊ณ  +
+ )} +
+ + {/* Suspect list */} + {suspects.map((s, i) => ( +
onFlyTo?.(s.ship.lat, s.ship.lng, 12)} + > +
+ #{i + 1} + {RISK_ICON[s.riskLevel]} + {s.riskLevel} + {s.ship.name || s.ship.mmsi} + MMSI: {s.ship.mmsi} + {s.distance.toFixed(1)} NM +
+
+ {s.reasons.map((r, j) => ( + {r} + ))} +
+
+ SOG: {s.ship.speed?.toFixed(1) ?? '-'} kn + HDG: {s.ship.heading ?? '-'}ยฐ + {s.ship.lat.toFixed(4)}ยฐN, {s.ship.lng.toFixed(4)}ยฐE + {onFlyTo && ํด๋ฆญ โ†’ ์ง€๋„ ์ด๋™} +
+
+ ))} +
+ )} +
+ + {/* Footer */} +
+ ํ•œ์ค‘์–ด์—…ํ˜‘์ • ํ—ˆ๊ฐ€ํ˜„ํ™ฉ (906์ฒ™) ๊ธฐ๋ฐ˜ ์ž๋™ ๋ถ„์„ | ์ˆ˜์—ญ ํŒ์ •: Point-in-Polygon | ์œ„ํ—˜๋„: ์†๋„ยท์œ„์น˜ยทAIS ํŒจํ„ด ์ข…ํ•ฉ
); } - -// โ”€โ”€ Styles โ”€โ”€ -const h2: React.CSSProperties = { fontSize: 13, color: '#60a5fa', borderLeft: '3px solid #3b82f6', paddingLeft: 8, margin: '16px 0 8px' }; -const tbl: React.CSSProperties = { borderCollapse: 'collapse', width: '100%', fontSize: 10, margin: '6px 0' }; -const th: React.CSSProperties = { border: '1px solid #1e293b', padding: '4px 8px', background: '#1e293b', color: '#e2e8f0', fontSize: 9, fontWeight: 700, textAlign: 'left' }; -const td: React.CSSProperties = { border: '1px solid #1e293b', padding: '3px 8px', fontSize: 10 }; -const tdB: React.CSSProperties = { ...td, fontWeight: 700, color: '#e2e8f0' }; -const step: React.CSSProperties = { background: '#1e293b', borderRadius: 4, padding: '8px 12px', margin: '6px 0' }; -const stepNum: React.CSSProperties = { display: 'inline-block', background: '#3b82f6', color: '#fff', borderRadius: 3, padding: '1px 6px', fontSize: 9, fontWeight: 700, marginRight: 6 }; -const warn: React.CSSProperties = { background: 'rgba(239,68,68,0.1)', border: '1px solid rgba(239,68,68,0.3)', borderRadius: 4, padding: '6px 10px', margin: '8px 0', fontSize: 10, color: '#fca5a5' }; - -function OverviewTab() { - return (<> -

ํ•จ์ • ํ†ค๊ธ‰๋ณ„ ์ž‘์ „ ๊ตฌ์—ญ ๋ฐ ์šด์šฉ ์ฒด๊ณ„

- - - - - - - - -
ํ•จ์ • ๋“ฑ๊ธ‰์ž‘์ „ ๊ธฐ๊ฐ„๋‹ด๋‹น ๊ตฌ์—ญ์ฃผ์š” ์ž„๋ฌด
์†Œํ˜• (500ํ†ค๊ธ‰ ์ดํ•˜)5~7์ผ์—ฐ์•ˆ~๊ทผํ•ด ์†Œ๊ตฌ์—ญ์—ฐ์•ˆ ์ •์น˜๋ง ๋ถˆ๋ฒ•์–ด๊ตฌ ์ˆ˜๊ฑฐ. ์†Œํ˜• ์ค‘๊ตญ์–ด์„  ๋ฌด์„  ๊ฒฝ๊ณ . ์ˆ˜์—ญIV ์œ ์ž๋ง ์ˆœ์ฐฐ.
์ค‘ํ˜• (1,000ํ†ค๊ธ‰)7~10์ผ๊ทผํ•ด ์ค‘๊ตฌ์—ญ (2๊ฐœ ์‚ฌ๊ฐํ˜•)ํ—ˆ๊ฐ€์–ด์„  ํ—ˆ๊ฐ€์ฆยท์กฐ์—…์ผ์ง€ ๊ฒ€์‚ฌ. GN ๋‹คํฌ๋ฒ ์…€ ํƒ์ƒ‰. ๋ถˆ๋ฒ•์–ด๊ตฌ ์ˆ˜๊ฑฐ.
๋Œ€ํ˜• (3,000ํ†ค๊ธ‰)10~14์ผ์›ํ•ด ๋Œ€๊ตฌ์—ญ (๊ด‘์—ญ)PT ๋ณธ์„ ยท๋ถ€์†์„  ๋ถ„๋ฆฌ ๊ฐ์‹œยท๋‚˜ํฌ. PS ์„ ๋‹จ ์ถ”์ . ์•ผ๊ฐ„ ์ง‘์–ด๋“ฑ EO ํƒ์ง€.
๋Œ€ํ˜• ๊ฒฝ๋น„ํ•จ (5,000ํ†ค๊ธ‰)10~14์ผ์ž‘์ „ ์ˆ˜์—ญ ์ „์ฒด์ž‘์ „ ์ง€ํœ˜ํ•จ. ์œ„๋ง ์„ ๋‹จ ์ง‘์ค‘ ๊ฐ์‹œ. ๋‚˜ํฌ ์ธ๊ณ„. ํ—ฌ๊ธฐยท๋“œ๋ก  ์šด์šฉ.
-

์ž‘์ „ ์Šค์ผ€์ค„ (์ค‘ํ˜• 7~10์ผ)

- - - - - - - - - - -
์ผ์ฐจ์ฃผ์š” ์ž„๋ฌด์„ธ๋ถ€ ํ™œ๋™
D+1๊ตฌ์—ญ ์ง„์ž…ยท์ดˆ๊ธฐ ํƒ์ƒ‰AIS ํ˜„ํ™ฉ ํŒŒ์•…, ์ค‘๊ตญ ํ—ˆ๊ฐ€์–ด์„  ๋ชฉ๋ก ํ™•์ธ, ๋ถ€ํ‘œ ํƒ์ƒ‰
D+2~3 (์ฃผ๊ฐ„)์ง‘์ค‘ ์ˆœ์ฐฐPT ์Œ ์ด๊ฒฉ๊ฑฐ๋ฆฌ ํ™•์ธ, GN ํˆฌ๋ง ์˜์‹ฌ ์ถ”์ , ํ—ˆ๊ฐ€์ฆ ๊ฒ€์‚ฌ
D+2~3 (์•ผ๊ฐ„)์•ผ๊ฐ„ ํƒ์ƒ‰EOยท๋ ˆ์ด๋” ์ง‘์–ด๋“ฑ ํƒ์ƒ‰, PS ์›ํ˜• ํŒจํ„ด ๊ฐ์‹œ, AIS ์†Œ์‹ค SAR ํ™•์ธ
D+4~5๋ถˆ๋ฒ•์–ด๊ตฌ ์ˆ˜๊ฑฐํ‘œ์ง€ ์—†๋Š” ์ž๋งยท์ •์น˜๋ง ๋ฐœ๊ฒฌยท์ˆ˜๊ฑฐ, GPS ๊ธฐ๋กยท์‚ฌ์ง„
D+5~6๋‚˜ํฌยท๊ฒ€๋ฌธ์œ„๋ฐ˜ ์„ ๋ฐ• ์ •์„ , ํ—ˆ๊ฐ€์ฆยท์–ดํš๋Ÿ‰ ํ™•์ธ, ๋‚˜ํฌ ๊ฒฐ์ •
D+7๊ตฌ์—ญ ์ •๋ฆฌยท๋ณต๊ท€์ž”์—ฌ ์–ด๊ตฌ ์ˆ˜๊ฑฐ, ๋ณด๊ณ ์„œ ์ž‘์„ฑ, ํ›„์† ์ธ๊ณ„, ํ•ญ๊ตฌ ๊ท€ํ™˜
- ); -} - -function PTTab() { - return (<> -

2์ฒ™์‹ ์ €์ธ๋ง (PT) ๋Œ€์‘ ์ ˆ์ฐจ

-
โš  ๋ง์„ ์˜ˆ์ธํ•˜๋Š” ์„ ๋ฏธ(่ˆนๅฐพ) ๋ฐฉํ–ฅ ์ ‘๊ทผ ์ ˆ๋Œ€ ๊ธˆ์ง€ โ€” ์˜ˆ์ธ์‚ญ์ด ์ˆ˜์ค‘์œผ๋กœ ๊ธธ๊ฒŒ ๋ป—์–ด ์Šคํฌ๋ฃจ ๊ฐ๊น€ ์œ„ํ—˜
-
STEP 1ํƒ์ง€ ๋ฐ ์‹๋ณ„
AIS MMSI ์กฐํšŒ โ†’ ํ—ˆ๊ฐ€ํ˜„ํ™ฉ DB ๋Œ€์กฐ. ํ—ˆ๊ฐ€ ์—ฌ๋ถ€ยท์—…์ข…ยท์กฐ์—… ๊ธฐ๊ฐ„ ์ฆ‰์‹œ ํ™•์ธ. ๋ณธ์„ (PT)ยท๋ถ€์†์„ (PT-S) ์Œ ์—ฌ๋ถ€ ํ™•์ธ, ๋ถ„๋ฆฌ ๊ฑฐ๋ฆฌ ์ธก์ •.
-
STEP 2์ ‘๊ทผ ๋ฐ ๊ฒฝ๊ณ 
์ „๋ฐฉ ์ธก๋ฉด(์„ ์ˆ˜ 45ยฐ ๋ฐฉํ–ฅ)์œผ๋กœ ์ ‘๊ทผ. VHF Ch.16 ๋ฌด์„  ๊ฒฝ๊ณ  3ํšŒ. ์ค‘๊ตญ์–ด ๊ฒฝ๊ณ : "่ฏท็ซ‹ๅณๅœ่ˆนๆŽฅๅ—ๆฃ€ๆŸฅ"
-
STEP 3์ •์„  ํ›„ ์Šน์„  ๊ฒ€์‚ฌ
โ‘ ํ—ˆ๊ฐ€์ฆ(่ฎธๅฏ่ฏ) ์›๋ณธ โ€” ํ—ˆ๊ฐ€๋ฒˆํ˜ธ(C21-xxxxx) ๋ฐ ์œ ํšจ๊ธฐ๊ฐ„
โ‘ก์กฐ์—…์ผ์ง€ ์–ดํš๋Ÿ‰ โ€” ํ• ๋‹น๋Ÿ‰(100ํ†ค/์ฒ™) ๋Œ€๋น„ ๋ˆ„์ ๋Ÿ‰
โ‘ข๋ง๋ชฉ ๊ทœ๊ฒฉ ์‹ค์ธก โ€” 54mm ๋ฏธ๋งŒ ์‹œ ๊ธˆ์ง€ ์–ด๊ตฌ
-
STEP 4์œ„๋ฐ˜ ์œ ํ˜• ํŒ์ •
โ‘ ํœด์–ด๊ธฐ ์กฐ์—… (4/16~10/15) โ†’ ์ฆ‰์‹œ ๋‚˜ํฌ
โ‘กํ• ๋‹น๋Ÿ‰ 100ํ†ค ์ดˆ๊ณผ โ†’ ๋‚˜ํฌ ๋˜๋Š” ์••์ˆ˜
โ‘ข๋ถ€์†์„  ๋ถ„๋ฆฌ ๋…๋ฆฝ์กฐ์—… โ†’ ์–‘์„  ๋™์‹œ ๋‚˜ํฌ
-
STEP 5๋‚˜ํฌ ๋˜๋Š” ๋ฐฉ๋ฉด
์œ„๋ฐ˜ ํ™•์ •: ๋‚˜ํฌ ํ›„ ๋ชฉํฌยท์—ฌ์ˆ˜ยท์ œ์ฃผยทํƒœ์•ˆ ์ž…ํ•ญ ๋˜๋Š” ๋Œ€ํ˜• ํ•จ์ • ์ธ๊ณ„
๊ฒฝ๋ฏธ ์œ„๋ฐ˜: ํ˜„์žฅ ๊ฒฝ๊ณ ยท์‹œ์ • ํ›„ ๋ฐฉ๋ฉด. ๊ฐ์‹œ ์‹œ์Šคํ…œ ์•Œ๋žŒ ๊ธฐ๋ก ๋“ฑ๋ก
- ); -} - -function GNTab() { - return (<> -

์œ ์ž๋ง (GN) ๋Œ€์‘ โ€” ๋‹คํฌ๋ฒ ์…€ ์ฃผ์˜

-
โš  ์•ผ๊ฐ„ ๋ถ€ํ‘œ ์•ผ๊ด‘๋“ฑ ์—†์œผ๋ฉด ์‹๋ณ„ ์–ด๋ ค์›€ โ€” ๋ ˆ์ด๋”๋กœ ๋ถ€ํ‘œ ๊ตฐ์ง‘ ์œ„์น˜ ์„ (ๅ…ˆ) ํ™•์ธ ํ›„ ์™ธ๊ณฝ ์ ‘๊ทผ
-
STEP 1๋‹คํฌ๋ฒ ์…€ ํƒ์ง€
AIS ๊ณต๋ฐฑ ์„ ๋ฐ• ๋ ˆ์ด๋” ํƒ์ƒ‰. SAR ์œ„์„ฑ ์š”์ฒญ. ๋ถ€ํ‘œ ๋‹ค์ˆ˜ ๋ฐœ๊ฒฌ ์‹œ ์ž๋ง ์„ค์น˜ ์„ ๋ฐ• ๊ทผ์ ‘ ์ •๋ฐ• โ€” ๋ถ€ํ‘œ ๋ฐ˜๊ฒฝ 1NM ์ง‘์ค‘ ์ˆ˜์ƒ‰
-
STEP 2๊ทธ๋ฌผ ๋ฒ”์œ„ ํ™•์ธ ํ›„ ์ ‘๊ทผ
๋ถ€ํ‘œ ๋ฐฐ์น˜ ๋ฐฉํ–ฅ์œผ๋กœ ์ž๋ง ์—ฐ์žฅ์„  ์ถ”์ •. ๊ทธ๋ฌผ ์„ค์น˜ ๋ฐฉํ–ฅ ์ˆ˜์ง(90ยฐ)์œผ๋กœ ์™ธ๊ณฝ ์ ‘๊ทผ
-
STEP 3AIS ์žฌ๊ฐ€๋™ ์š”๊ตฌ
"่ฏทๆ‰“ๅผ€AIS" ๊ฒฝ๊ณ . ์žฌ๊ฐœ ํ™•์ธ ํ›„ MMSI ๊ธฐ๋ก. ๊ฑฐ๋ถ€ ์‹œ ๊ฐ•์ œ ์ž„๊ฒ€
-
STEP 4์Šน์„  ๊ฒ€์‚ฌ
โ‘ ํ—ˆ๊ฐ€์ฆ(C25-xxxxx)
โ‘ก์ˆ˜์—ญ ํ™•์ธ โ€” GN์€ ์ˆ˜์—ญIV๊นŒ์ง€ ํ—ˆ๊ฐ€, ์ˆ˜์—ญI ๋ฐœ๊ฒฌ ์‹œ ์ฆ‰์‹œ ์œ„๋ฐ˜
โ‘ข์–ดํš๋ฌผ โ€” ํ• ๋‹น๋Ÿ‰ ํ‰๊ท  28ํ†ค/์ฒ™
โ‘ฃ๋ง๋ชฉ ๊ทœ๊ฒฉ ๋ฐ ๊ทธ๋ฌผ ๊ทœ๋ชจ(๊ธธ์ดยทํญ)
-
STEP 5๋ถˆ๋ฒ• ์–ด๊ตฌ ํŒ์ •
ํ—ˆ๊ฐ€ ๊ตฌ์—ญ ์™ธ ์ž๋ง: ์ฆ‰์‹œ ์ˆ˜๊ฑฐ/์ ˆ๋‹จ
๋ง๋ชฉ ๊ธฐ์ค€ ๋ฏธ๋‹ฌ: ์–ด๊ตฌ ์ „๋Ÿ‰ ์••์ˆ˜
์ž๋ง ์œ„์น˜(GPS)ยท์ˆ˜๊ฑฐ๋Ÿ‰ ์ดฌ์˜ ๊ธฐ๋ก
- ); -} - -function PSTab() { - return (<> -

์œ„๋ง (PS) ์„ ๋‹จ ๋Œ€์‘ โ€” ์„ ๋‹จ ๋ถ„์‚ฐ ์ฃผ์˜

-
โš  ๋‹จ๋… ์ ‘๊ทผ ๊ธˆ์ง€ โ€” ์กฐ๋ช…์„  ์‹œ์•ผ ๊ต๋ž€, ์„ ๋‹จ ๋ถ„์‚ฐ ๋„์ฃผ ์ „์ˆ ์— ๋Œ€๋น„. ๋Œ€ํ˜• ํ•จ์ • ์ง€์› ์š”์ฒญ ํ›„ ์„ ๋‹จ ์ „์ฒด ๋™์‹œ ์ œ์••
-
STEP 1์„ ๋‹จ ํ™•์ธ ๋ฐ ๋ณด๊ณ 
์›ํ˜• ๊ถค์  + ๊ณ ์†(8~10kn)โ†’์ €์†({'<'}3kn) ํŒจํ„ด ํƒ์ง€. 3์ฒ™+ AIS ํด๋Ÿฌ์Šคํ„ฐ ํ™•์ธ. ์ฆ‰์‹œ ์ƒ๊ธ‰ ํ•จ์ •ยท๊ด€์ œ์„ผํ„ฐ ๋ณด๊ณ . ๋‹จ๋… ์ ‘๊ทผ ๊ธˆ์ง€
-
STEP 2์•ผ๊ฐ„ ์ง‘์–ด๋“ฑ ์‹๋ณ„
EO ํƒ์ง€ ๋˜๋Š” ์œก์•ˆ ์ง‘์–ด๋“ฑ ํ™•์ธ. ์กฐ๋ช…์„  MMSI ๊ธฐ๋ก. ์กฐ๋ช…์„  ์ฐจ๋‹จ์€ ์„ ๋‹จ ์ œ์•• ์ตœํ›„ ๋‹จ๊ณ„
-
STEP 3์„ ๋‹จ ํฌ์œ„ (๋Œ€ํ˜• ํ•จ์ • ํ•ฉ๋ฅ˜)
๋ชจ์„ ยท์šด๋ฐ˜์„ ยท์กฐ๋ช…์„  ๋™์‹œ ํฌ์œ„. ํƒˆ์ฃผ ๋ฐฉํ–ฅ(์„œ๋ฐฉ ์ค‘๊ตญ ์ธก) ์ฐจ๋‹จ ์šฐ์„  ๋ฐฐ์น˜. VHF ๊ฒฝ๊ณ  โ†’ ์ •์„  ์š”๊ตฌ โ†’ ์ง€์† ๋„์ฃผ ์‹œ ๊ฒฝ๊ณ  ์‚ฌ๊ฒฉ
-
STEP 4์„ ๋‹จ ์ผ์ œ ์ž„๊ฒ€
๋ชจ์„ : ํ—ˆ๊ฐ€์ฆ(C23-xxxxx)ยท์–ดํš๋ฌผยท๋ƒ‰๋™ ์„ค๋น„. ํ• ๋‹น๋Ÿ‰ 1,500ํ†ค/์ฒ™(4์ฒ™๋งŒ)
์šด๋ฐ˜์„ ยท์กฐ๋ช…์„ : ํ• ๋‹น๋Ÿ‰ 0ํ†ค โ†’ ์–ดํš๋ฌผ ์ ์žฌ ์‹œ ๋ถˆ๋ฒ• ์šด๋ฐ˜ ์ฆ๊ฑฐ
-
STEP 5๋‚˜ํฌ ๋ฐ ์ฆ๊ฑฐ ํ™•๋ณด
์–ดํš๋ฌผ ์ค‘๋Ÿ‰ยท์–ด์ข… ์ดฌ์˜. ๋ƒ‰๋™ ์„ค๋น„ ์˜จ๋„ยท์ €์žฅ ์šฉ๋Ÿ‰ ๊ธฐ๋ก. ๅฎๆณขๆตท่ฃ• ์„ ๋‹จ VHF ๊ต์‹  ํ™•๋ณด ๊ถŒ๊ณ . ๋Œ€ํ˜• ํ•จ์ •์ด ๋ชฉํฌยท์—ฌ์ˆ˜ํ•ญ ์ธ๊ณ„
-

๊ณ ์œ„ํ—˜ ์„ ๋ฐ•

- - - - - - -
์„ ๋ฐ•ํ†ค์ˆ˜๋น„๊ณ 
ๅฎๆธ” 22490ํ†คํ• ๋‹น๋Ÿ‰ 0ํ†ค โ€” ํ•ด์ƒ ๋ƒ‰๋™ยท์ง‘ํ•˜ ๊ฑฐ์ (๋ชจ์„ ) ์˜์‹ฌ
ๅฎๆธ” 23541ํ†คํ• ๋‹น๋Ÿ‰ 0ํ†ค โ€” ํ•ด์ƒ ๋ƒ‰๋™ยท์ง‘ํ•˜ ๊ฑฐ์ (๋ชจ์„ ) ์˜์‹ฌ
- ); -} - -function FCTab() { - return (<> -

์šด๋ฐ˜์„  (FC) ๋ฐ ํ™˜์  ํ˜„์žฅ ๋Œ€์‘

-
STEP 1ํ™˜์  ์˜์‹ฌ ์•Œ๋žŒ ์ˆ˜์‹ 
๊ฐ์‹œ ์‹œ์Šคํ…œ: FC + ์กฐ์—…์„  0.5NM ์ด๋‚ด + ์–‘์ชฝ 2kn ์ดํ•˜ + 30๋ถ„ ์ด์ƒ โ†’ HIGH ์•Œ๋žŒ. ํ•ด๋‹น ์ขŒํ‘œ ์ฆ‰์‹œ ์ด๋™. ํ•ญ๊ณต๊ธฐยท๋“œ๋ก  ์„ ํ–‰ ํ™•์ธ ์š”์ฒญ
-
STEP 2ํ˜„์žฅ ์ฆ๊ฑฐ ์ดฌ์˜
๋‘ ์„ ๋ฐ• ์ ‘ํ˜„(ๆŽฅ่ˆท) ๋˜๋Š” ๊ณ ๋ฌด๋ณดํŠธ ์šด๋ฐ˜ ํ™•์ธ. ๋“œ๋ก  ํ•ญ๊ณต ์ดฌ์˜. ์–‘์„  MMSIยท์„ ๋ช…ยท์„ ์ ํ•ญ ๊ธฐ๋ก. ์ ‘ํ˜„ ํ”์ (๋กœํ”„ยท์ถฉ๊ฒฉ ์ž๊ตญ)
-
STEP 3์–‘์„  ๋™์‹œ ์ •์„ ยท์ž„๊ฒ€
์šด๋ฐ˜์„ : ์–ดํš๋ฌผ ์ ์žฌ ๋‚ด์—ญยท์ถœ๋ฐœ์ง€ยท๋„์ฐฉ์ง€. ๋ƒ‰๋™ ํ™”๋ฌผ ๊ทœ๋ชจยท์–ด์ข…
์กฐ์—…์„ : ํ—ˆ๊ฐ€๋Ÿ‰ ๋Œ€๋น„ ์‹ค์–ดํš๋Ÿ‰. PT-S ๋ถ€์†์„ ์ด ์šด๋ฐ˜์„  ์—ญํ•  ์‹œ ์ด์ค‘ ์œ„๋ฐ˜
-
STEP 4์ฆ๊ฑฐ ํ™•๋ณด ๋ฐ ์กฐ์น˜
์–ดํš๋ฌผ ์‚ฌ์ง„ยท์ค‘๋Ÿ‰ ํ™•๋ณด. ํ•„์š” ์‹œ ์ „๋Ÿ‰ ์••์ˆ˜. ๋„์ฃผ ์‹œ ๊ฒฝ๊ณ  ์‚ฌ๊ฒฉ ์ ˆ์ฐจ. ๋‚˜ํฌ ํ›„ ์ตœ๊ทผ์ ‘ ํ•ญ๊ตฌ ์ž…ํ•ญ
-

ํ™˜์  ์‹ ๋ขฐ๋„ ํŒ์ •

- - - - - - - -
์ง€์† ์‹œ๊ฐ„์‹ ๋ขฐ๋„๋“ฑ๊ธ‰
30๋ถ„60%HIGH
60๋ถ„80%HIGH
120๋ถ„+95%CRITICAL
- ); -} - -function GearTab() { - return (<> -

๋ถˆ๋ฒ• ์–ด๊ตฌ ์ˆ˜๊ฑฐ ์ ˆ์ฐจ

-
โš  ๋ฐฉ์น˜ ์ž๋ง์— ์Šคํฌ๋ฃจ ๊ฐ๊น€ โ†’ ํ‘œ๋ฅ˜ ์‚ฌ๊ณ  ์œ„ํ—˜. ์ˆ˜๊ฑฐ ์ „ ๋ฐ˜๋“œ์‹œ ์—”์ง„ ์ •์ง€ ๋˜๋Š” ์ €์†. ์•ผ๊ฐ„ ์ˆ˜๊ฑฐ๋Š” ์ต์ผ๋กœ ์—ฐ๊ธฐ ์›์น™
-
STEP 1์–ด๊ตฌ ๋ฐœ๊ฒฌ ๋ฐ ์ดˆ๊ธฐ ๊ธฐ๋ก
GPS ์ขŒํ‘œ(WGS84). ์–ด๊ตฌ ์ข…๋ฅ˜ ์ถ”์ •ยท์‚ฌ์ง„ ์ดฌ์˜. ์†Œ์œ ์ž ๋ฒˆํ˜ธยทํ—ˆ๊ฐ€๋ฒˆํ˜ธ ํ™•์ธ. ๊ทœ๋ชจ(๊ธธ์ดยทํญยท๊ทธ๋ฌผ์ฝ”) ์œก์•ˆ ์ถ”์ •
-
STEP 2์ค‘๊ตญ ์–ด๊ตฌ ์—ฌ๋ถ€ ํŒ๋‹จ
์ค‘๊ตญ์–ด ํ‘œ๊ธฐ ๋ถ€ํ‘œ ๋˜๋Š” ๊ด‘ํญยท์žฅํ˜• ์ž๋ง ํ™•์ธ. ์ธ๊ทผ ์ค‘๊ตญ ์–ด์„  ์กด์žฌ ์—ฌ๋ถ€. ํŒ๋‹จ ๋ถˆ๊ฐ€ ์‹œ ์ˆ˜๊ฑฐ ํ›„ ํ•ญ๊ตฌ ๊ฐ์‹
-
STEP 3์ˆ˜๊ฑฐ ์‹คํ–‰
RIB ๋˜๋Š” ํฌ๋ ˆ์ธ ์žฅ๋น„ ํ™œ์šฉ. ์–ดํš๋ฌผ ์žˆ์œผ๋ฉด ์–ด์ข…ยท์ค‘๋Ÿ‰ ๊ธฐ๋ก ํ›„ ์ „๋Ÿ‰ ์••์ˆ˜. ์ ˆ๋‹จ ๋ถˆ๊ฐ€ํ”ผ ์‹œ ์œ„์น˜ยท์ž”์กด ๊ธฐ๋ก
-
STEP 4์ˆ˜๊ฑฐ ํ›„ ๋ณด๊ณ 
์ผ์‹œยท์œ„์น˜ยท์ข…๋ฅ˜ยท๊ทœ๋ชจยท์–ดํš๋ฌผ ํ˜„ํ™ฉ โ†’ ๊ฐ์‹œ ์‹œ์Šคํ…œ ๋“ฑ๋ก. ํ•ญ๊ตฌ ๊ฐ์‹ยท์ฆ๊ฑฐ ๋ณด์กด. ๋ฐ˜๋ณต ๋ฐœ๊ฒฌ ์œ„์น˜ โ†’ ์ง‘์ค‘ ๊ฐ์‹œ ๊ตฌ์—ญ ์ง€์ • ์š”์ฒญ
-

์–ด๊ตฌ ์ข…๋ฅ˜๋ณ„ ์‹๋ณ„

- - - - - - - -
์–ด๊ตฌ์™ธํ˜•๋ฐœ๊ฒฌ ์œ„์น˜์ˆ˜๊ฑฐ ๋ฐฉ๋ฒ•
๋ถˆ๋ฒ• ์ž๋ง (ๆตๅˆบ็ถฒ)์ˆ˜์ง ๊ทธ๋ฌผ, ๋ถ€ํ‘œ ๋‚˜์—ด, ๊ด‘ํญยท์žฅํ˜•์ˆ˜๋ฉด ์งํ•˜~์ค‘์ธต ํ‘œ๋ฅ˜RIB + ์–‘๋ง๊ธฐ
๋ถˆ๋ฒ• ์ •์น˜๋ง (ๅผต็ถฒ)์‚ฌ๊ฐ ํ”„๋ ˆ์ž„, ๋ฌ˜๋ฐ• ๊ณ ์ •ํ•ด์ € ๊ณ ์ •, ์ข์€ ์ˆ˜๋กœํฌ๋ ˆ์ธยท์–‘๋ง๊ธฐ
๋ถˆ๋ฒ• ํ†ต๋ฐœ (็ฌผๅฃถ)์›ํ†ต/์ƒ์žํ˜•, ๋กœํ”„ ์—ฐ๊ฒฐํ•ด์ €, ๋ถ€ํ‘œ ํ‘œ์‹œRIB + ์ธ๋ ฅ ์ธ์–‘
- ); -} - -function AlertTab() { - return (<> -

๋‹จ์† ์ƒํ™ฉ๋ณ„ ์กฐ์น˜ ๊ธฐ์ค€

- - - - - - - - - - - - -
์œ„๋ฐ˜ ์œ ํ˜•ํŒ์ • ๊ธฐ์ค€์ฆ‰์‹œ ์กฐ์น˜์•Œ๋žŒ
๋ฏธ๋“ฑ๋ก ์„ ๋ฐ•MMSI ํ—ˆ๊ฐ€ DB ๋ฏธ๋“ฑ๋ก์ฆ‰์‹œ ์ •์„ ยท๋‚˜ํฌโ—‰ CRITICAL
ํœด์–ด๊ธฐ ์กฐ์—…C21ยทC22: 4/16~10/15
C25: 6/2~8/31
์ฆ‰์‹œ ๋‚˜ํฌโ—‰ CRITICAL
ํ—ˆ๊ฐ€ ์ˆ˜์—ญ ์ดํƒˆ๋น„ํ—ˆ๊ฐ€ ์ˆ˜์—ญ ์ง„์ž…๊ฒฝ๊ณ  ํ›„ ๋‚˜ํฌโš  HIGH
PT ๋ถ€์†์„  ๋ถ„๋ฆฌ๋ณธ์„  ์ด๊ฒฉ 3NM+์–‘์„  ๋™์‹œ ๋‚˜ํฌ ๊ฒ€ํ† โš  HIGHโ†’CRITICAL
ํ™˜์  ํ˜„์žฅ ํฌ์ฐฉFC+์กฐ์—…์„  0.5NM+2kn+30๋ถ„ํ˜„์žฅ ์ดฌ์˜ ํ›„ ์–‘์„  ๋‚˜ํฌโš  HIGH
๋ถˆ๋ฒ• ์–ด๊ตฌ ๋ฐœ๊ฒฌํ‘œ์ง€ ์—†์Œ ๋˜๋Š” ๋ฏธํ—ˆ๊ฐ€์ฆ‰์‹œ ์ˆ˜๊ฑฐยท๊ธฐ๋ก์ž์ฒด ํŒ๋‹จ
ํ• ๋‹น๋Ÿ‰ ์ดˆ๊ณผ80~100% ์ดˆ๊ณผ์–ดํš๋ฌผ ๊ณ„๋Ÿ‰ยท์••์ˆ˜โ—‰ CRITICAL
๋‹คํฌ๋ฒ ์…€AIS ๊ณต๋ฐฑ 6์‹œ๊ฐ„+์ ‘๊ทผยท์ž„๊ฒ€ ํ›„ ํ™•์ธโš  HIGH
-

๊ฐ์‹œ ๊ฐ•ํ™” ์‹œ๊ธฐ

- - - - - - - - -
์‹œ๊ธฐ์ƒํ™ฉ๋Œ€์‘
7~8์›”PS 16์ฒ™๋งŒ ์กฐ์—… ํ—ˆ๊ฐ€C21ยทC22ยทC25 ๋ฐœ๊ฒฌ ์‹œ ์ „์› ๋น„ํ—ˆ๊ฐ€. ์ตœ๋Œ€ ๊ฐ์‹œ ์ง‘์ค‘
5์›”GN๋งŒ ํ—ˆ๊ฐ€์ˆ˜์—ญ ๋‚ด ์ €์ธ๋ง(C21ยทC22) ํƒ์ง€ ์‹œ ์ฆ‰์‹œ ์œ„๋ฐ˜
4์›”ยท10์›”๊ธฐ๊ฐ„ ๊ฒฝ๊ณ„ ์‹œ์ 4/16, 10/16 ๊ธฐ์ค€์ผ ์ „ํ›„ ์ง‘์ค‘ ๋ชจ๋‹ˆํ„ฐ๋ง
1~3์›”ยท11~12์›”์ „ ์—…์ข… ๊ฐ€๋Šฅ์ˆ˜์—ญ ์ดํƒˆ ๋ฐ ํ• ๋‹น๋Ÿ‰ ์ดˆ๊ณผ ์ค‘์‹ฌ ๊ฐ์‹œ
- ); -}