kcg-monitoring/src/services/opensky.ts
htlee ccdfb3517b feat: KCG 모니터링 대시보드 초기 프로젝트 구성
React 19 + TypeScript + Vite + MapLibre 기반 해양 모니터링 대시보드.
선박 AIS, 항공기, CCTV, 위성, 해양 인프라 등 다중 레이어 지원.
ESLint React Compiler 규칙 조정 및 lint 에러 수정 포함.
2026-03-17 09:01:18 +09:00

587 lines
38 KiB
TypeScript

import type { Aircraft, AircraftCategory } from '../types';
// OpenSky Network API - free tier, no auth needed for basic queries
const OPENSKY_BASE = 'https://opensky-network.org/api';
// Middle East bounding box (lat_min, lat_max, lng_min, lng_max)
const ME_BOUNDS = {
lamin: 24,
lamax: 42,
lomin: 30,
lomax: 62,
};
// Known military callsign prefixes
const MILITARY_PREFIXES: Record<string, AircraftCategory> = {
'RCH': 'cargo', // C-17 / C-5 AMC
'REACH': 'cargo',
'KING': 'tanker', // HC-130 rescue tanker
'ETHYL': 'tanker', // KC-135
'STEEL': 'tanker', // KC-135
'PACK': 'tanker', // KC-135
'NCHO': 'tanker', // KC-10
'JULEP': 'tanker',
'IRON': 'fighter',
'VIPER': 'fighter',
'RAGE': 'fighter',
'TOXIN': 'surveillance', // RC-135
'OLIVE': 'surveillance', // RC-135
'COBRA': 'surveillance',
'FORTE': 'surveillance', // RQ-4 Global Hawk
'HAWK': 'surveillance',
'GLOBAL': 'surveillance',
'SNTRY': 'surveillance', // E-3 AWACS
'WIZARD': 'surveillance',
'DOOM': 'military',
'EVAC': 'military',
'SAM': 'military', // VIP/govt
'EXEC': 'military',
'NAVY': 'military',
'TOPCT': 'military',
'DEATH': 'fighter', // B-2 Spirit
'REAPER': 'surveillance', // MQ-9
'DRAGON': 'surveillance', // U-2
};
function classifyAircraft(callsign: string): AircraftCategory {
const cs = callsign.toUpperCase().trim();
for (const [prefix, cat] of Object.entries(MILITARY_PREFIXES)) {
if (cs.startsWith(prefix)) return cat;
}
return 'civilian';
}
function parseOpenSkyResponse(data: { time: number; states: unknown[][] | null }): Aircraft[] {
if (!data.states) return [];
return data.states
.filter(s => s[6] !== null && s[5] !== null) // must have position
.map(s => {
const callsign = ((s[1] as string) || '').trim();
const category = classifyAircraft(callsign);
return {
icao24: s[0] as string,
callsign,
lat: s[6] as number,
lng: s[5] as number,
altitude: (s[7] as number) || 0,
velocity: (s[9] as number) || 0,
heading: (s[10] as number) || 0,
verticalRate: (s[11] as number) || 0,
onGround: s[8] as boolean,
category,
lastSeen: (s[4] as number) * 1000,
};
});
}
export async function fetchAircraftOpenSky(): Promise<Aircraft[]> {
try {
const url = `${OPENSKY_BASE}/states/all?lamin=${ME_BOUNDS.lamin}&lomin=${ME_BOUNDS.lomin}&lamax=${ME_BOUNDS.lamax}&lomax=${ME_BOUNDS.lomax}`;
const res = await fetch(url);
if (!res.ok) throw new Error(`OpenSky ${res.status}`);
const data = await res.json();
return parseOpenSkyResponse(data);
} catch (err) {
console.warn('OpenSky fetch failed, using sample data:', err);
return getSampleAircraft();
}
}
// ═══ Korea region ═══
const KR_BOUNDS = { lamin: 20, lamax: 45, lomin: 115, lomax: 145 };
export async function fetchAircraftOpenSkyKorea(): Promise<Aircraft[]> {
try {
const url = `${OPENSKY_BASE}/states/all?lamin=${KR_BOUNDS.lamin}&lomin=${KR_BOUNDS.lomin}&lamax=${KR_BOUNDS.lamax}&lomax=${KR_BOUNDS.lomax}`;
const res = await fetch(url);
if (!res.ok) throw new Error(`OpenSky Korea ${res.status}`);
const data = await res.json();
return parseOpenSkyResponse(data);
} catch (err) {
console.warn('OpenSky Korea fetch failed:', err);
return [];
}
}
// T0 = main Iranian retaliation wave
const T0 = new Date('2026-03-01T12:01:00Z').getTime();
const HOUR = 3600_000;
const MIN = 60_000;
// ── 2026 March 1 verified aircraft deployments ──
// Based on OSINT: Operation Epic Fury order of battle
function getSampleAircraft(): Aircraft[] {
const now = Date.now();
return [
// ═══════════════════════════════════════════
// SURVEILLANCE / ISR (persistent coverage)
// ═══════════════════════════════════════════
// RQ-4B Global Hawk "FORTE12" - 24h ISR orbit over Iraq/Iran border
// Deployed from Al Dhafra, UAE (standard CENTCOM ISR asset)
{
icao24: 'ae1461', callsign: 'FORTE12', lat: 33.2, lng: 43.5, altitude: 16764,
velocity: 170, heading: 135, verticalRate: 0, onGround: false,
category: 'surveillance', typecode: 'RQ4B', lastSeen: now,
activeStart: T0 - 12 * HOUR, activeEnd: T0 + 12 * HOUR,
},
// MQ-4C Triton "FORTE13" - Maritime ISR over Persian Gulf
// One MQ-4C lost near Iran Feb 22; this is replacement sortie
{
icao24: 'ae1462', callsign: 'FORTE13', lat: 27.0, lng: 55.0, altitude: 15240,
velocity: 165, heading: 90, verticalRate: 0, onGround: false,
category: 'surveillance', typecode: 'MQ4C', lastSeen: now,
activeStart: T0 - 10 * HOUR, activeEnd: T0 + 10 * HOUR,
},
// RC-135V Rivet Joint "TOXIN31" - SIGINT, relocated to Crete (Souda Bay)
// Per OSINT: RC-135 shifted from Turkey-Syria border to Crete Mar 2026
{
icao24: 'ae5420', callsign: 'TOXIN31', lat: 35.5, lng: 34.0, altitude: 9144,
velocity: 230, heading: 90, verticalRate: 0, onGround: false,
category: 'surveillance', typecode: 'RC135V', lastSeen: now,
activeStart: T0 - 10 * HOUR, activeEnd: T0 + 8 * HOUR,
},
// E-3G AWACS "SNTRY60" - Airborne early warning over northern Iraq
// Al Dhafra-based, orbiting for Iranian missile launch detection
{
icao24: 'ae0005', callsign: 'SNTRY60', lat: 34.5, lng: 44.0, altitude: 9144,
velocity: 200, heading: 45, verticalRate: 0, onGround: false,
category: 'surveillance', typecode: 'E3G', lastSeen: now,
activeStart: T0 - 6 * HOUR, activeEnd: T0 + 10 * HOUR,
},
// U-2S Dragon Lady "DRAGON01" - Ultra-high altitude recon from Al Dhafra
// Facilities hit by Iranian missile strike ~T0+1h; U-2 airborne before impact
{
icao24: 'ae0006', callsign: 'DRAGON01', lat: 30.5, lng: 52.0, altitude: 21336,
velocity: 200, heading: 0, verticalRate: 0, onGround: false,
category: 'surveillance', typecode: 'U2S', lastSeen: now,
activeStart: T0 - 8 * HOUR, activeEnd: T0 + 4 * HOUR,
},
// MQ-9A Reaper "REAPER41" - Armed ISR over western Iraq
// Launched from Al Dhafra pre-strike; base facilities damaged by Iranian missiles
{
icao24: 'ae0007', callsign: 'REAPER41', lat: 32.0, lng: 41.5, altitude: 7620,
velocity: 80, heading: 180, verticalRate: 0, onGround: false,
category: 'surveillance', typecode: 'MQ9A', lastSeen: now,
activeStart: T0 - 6 * HOUR, activeEnd: T0 + 8 * HOUR,
},
// MQ-9A Reaper "REAPER42" - Armed ISR over Strait of Hormuz
{
icao24: 'ae0008', callsign: 'REAPER42', lat: 26.5, lng: 56.0, altitude: 6096,
velocity: 75, heading: 270, verticalRate: 0, onGround: false,
category: 'surveillance', typecode: 'MQ9A', lastSeen: now,
activeStart: T0 - 4 * HOUR, activeEnd: T0 + 10 * HOUR,
},
// ═══════════════════════════════════════════
// TANKERS (aerial refueling for strike packages)
// ═══════════════════════════════════════════
// KC-135R "ETHYL71" - Refueling orbit over western Iraq for strike package
{
icao24: 'ae0001', callsign: 'ETHYL71', lat: 31.5, lng: 42.0, altitude: 10668,
velocity: 250, heading: 270, verticalRate: 0, onGround: false,
category: 'tanker', typecode: 'KC135R', lastSeen: now,
activeStart: T0 - 8 * HOUR, activeEnd: T0 + 6 * HOUR,
},
// KC-46A Pegasus "STEEL55" - Refueling support for B-2 bombers
// B-2s flew from Diego Garcia/Whiteman; needed multiple refueling
{
icao24: 'ae0009', callsign: 'STEEL55', lat: 28.5, lng: 50.0, altitude: 10972,
velocity: 245, heading: 315, verticalRate: 0, onGround: false,
category: 'tanker', typecode: 'KC46A', lastSeen: now,
activeStart: T0 - 10 * HOUR, activeEnd: T0 + 4 * HOUR,
},
// KC-135R "PACK22" - Refueling orbit over eastern Jordan
// Supporting Israeli F-35I and F-15I strike missions
{
icao24: 'ae0003', callsign: 'PACK22', lat: 32.8, lng: 38.5, altitude: 10972,
velocity: 245, heading: 180, verticalRate: 0, onGround: false,
category: 'tanker', typecode: 'KC135R', lastSeen: now,
activeStart: T0 - 3 * HOUR, activeEnd: T0 + 4 * HOUR,
},
// KC-10A Extender "NCHO45" - Large refueling orbit over northern Gulf
{
icao24: 'ae0002', callsign: 'NCHO45', lat: 29.8, lng: 47.5, altitude: 10058,
velocity: 240, heading: 300, verticalRate: 0, onGround: false,
category: 'tanker', typecode: 'KC10A', lastSeen: now,
activeStart: T0 - 4 * HOUR, activeEnd: T0 + 5 * HOUR,
},
// ═══════════════════════════════════════════
// BOMBERS (US stealth strikes on Iran)
// ═══════════════════════════════════════════
// B-2A Spirit "DEATH11" - Stealth bomber, Whiteman via Diego Garcia
// B-2s confirmed conducting deep strikes on Iranian nuclear/military facilities
{
icao24: 'ae2001', callsign: 'DEATH11', lat: 29.0, lng: 53.0, altitude: 12192,
velocity: 260, heading: 0, verticalRate: 0, onGround: false,
category: 'fighter', typecode: 'B2A', lastSeen: now,
activeStart: T0 - 6 * HOUR, activeEnd: T0 + 2 * HOUR,
},
// B-2A Spirit "DEATH12" - Second stealth bomber in pair
{
icao24: 'ae2002', callsign: 'DEATH12', lat: 28.5, lng: 52.5, altitude: 12192,
velocity: 260, heading: 10, verticalRate: 0, onGround: false,
category: 'fighter', typecode: 'B2A', lastSeen: now,
activeStart: T0 - 6 * HOUR, activeEnd: T0 + 2 * HOUR,
},
// ═══════════════════════════════════════════
// US FIGHTERS (Al Udeid, Al Dhafra based)
// ═══════════════════════════════════════════
// F-22A Raptor "RAGE01" - Al Udeid-based, air superiority
{
icao24: 'ae3001', callsign: 'RAGE01', lat: 30.0, lng: 48.0, altitude: 10668,
velocity: 320, heading: 45, verticalRate: 0, onGround: false,
category: 'fighter', typecode: 'F22A', lastSeen: now,
activeStart: T0 - 2 * HOUR, activeEnd: T0 + 4 * HOUR,
},
// F-22A Raptor "RAGE02" - Wingman
{
icao24: 'ae3002', callsign: 'RAGE02', lat: 29.8, lng: 47.5, altitude: 10668,
velocity: 318, heading: 50, verticalRate: 0, onGround: false,
category: 'fighter', typecode: 'F22A', lastSeen: now,
activeStart: T0 - 2 * HOUR, activeEnd: T0 + 4 * HOUR,
},
// F-35A Lightning II "VIPER11" - From RAF Lakenheath (deployed to Al Udeid)
{
icao24: 'ae3003', callsign: 'VIPER11', lat: 31.0, lng: 46.0, altitude: 9144,
velocity: 300, heading: 60, verticalRate: 0, onGround: false,
category: 'fighter', typecode: 'F35A', lastSeen: now,
activeStart: T0 - 3 * HOUR, activeEnd: T0 + 3 * HOUR,
},
// F-35A Lightning II "VIPER12" - Wingman
{
icao24: 'ae3004', callsign: 'VIPER12', lat: 30.8, lng: 45.5, altitude: 9144,
velocity: 298, heading: 65, verticalRate: 0, onGround: false,
category: 'fighter', typecode: 'F35A', lastSeen: now,
activeStart: T0 - 3 * HOUR, activeEnd: T0 + 3 * HOUR,
},
// F-15E Strike Eagle "IRON41" - From RAF Lakenheath/Al Dhafra
// Deep strike mission into Iran
{
icao24: 'ae3005', callsign: 'IRON41', lat: 29.5, lng: 50.0, altitude: 8534,
velocity: 310, heading: 30, verticalRate: 0, onGround: false,
category: 'fighter', typecode: 'F15E', lastSeen: now,
activeStart: T0 - 4 * HOUR, activeEnd: T0 + 2 * HOUR,
},
// F-15E Strike Eagle "IRON42" - Wingman
{
icao24: 'ae3006', callsign: 'IRON42', lat: 29.3, lng: 49.5, altitude: 8534,
velocity: 308, heading: 35, verticalRate: 0, onGround: false,
category: 'fighter', typecode: 'F15E', lastSeen: now,
activeStart: T0 - 4 * HOUR, activeEnd: T0 + 2 * HOUR,
},
// F/A-18E/F Super Hornet "NAVY51" - USS Abraham Lincoln CVW
// Lincoln CSG in Arabian Sea; launching strikes on Iran
{
icao24: 'ae3007', callsign: 'NAVY51', lat: 24.0, lng: 60.0, altitude: 7620,
velocity: 280, heading: 350, verticalRate: 5, onGround: false,
category: 'fighter', typecode: 'FA18F', lastSeen: now,
activeStart: T0 - 1 * HOUR, activeEnd: T0 + 3 * HOUR,
},
// F/A-18E Super Hornet "NAVY52" - Lincoln CAP flight
{
icao24: 'ae3008', callsign: 'NAVY52', lat: 23.5, lng: 59.5, altitude: 6096,
velocity: 275, heading: 0, verticalRate: 0, onGround: false,
category: 'fighter', typecode: 'FA18E', lastSeen: now,
activeStart: T0 - 1 * HOUR, activeEnd: T0 + 3 * HOUR,
},
// ═══════════════════════════════════════════
// ISRAELI AIR FORCE (strikes on Iran)
// ═══════════════════════════════════════════
// F-35I Adir "IRON33" - From Nevatim AB, deep strike into Iran
// F-35I confirmed shooting down Iranian Yak-130 on Mar 4
{
icao24: 'ae0012', callsign: 'IRON33', lat: 31.2, lng: 34.9, altitude: 10000,
velocity: 310, heading: 90, verticalRate: 3, onGround: false,
category: 'fighter', typecode: 'F35I', lastSeen: now,
activeStart: T0 - 2 * HOUR, activeEnd: T0 + 3 * HOUR,
},
// F-35I Adir "IRON34" - Wingman from Nevatim
{
icao24: 'ae4002', callsign: 'IRON34', lat: 31.0, lng: 35.2, altitude: 10000,
velocity: 308, heading: 95, verticalRate: 2, onGround: false,
category: 'fighter', typecode: 'F35I', lastSeen: now,
activeStart: T0 - 2 * HOUR, activeEnd: T0 + 3 * HOUR,
},
// F-15I Ra'am "RAGE22" - From Ramon AB, carrying Black Sparrow standoff missiles
{
icao24: 'ae0011', callsign: 'RAGE22', lat: 30.2, lng: 35.3, altitude: 7620,
velocity: 300, heading: 45, verticalRate: 0, onGround: false,
category: 'fighter', typecode: 'F15I', lastSeen: now,
activeStart: T0 - 90 * MIN, activeEnd: T0 + 2 * HOUR,
},
// F-15I Ra'am "RAGE23" - Wingman
{
icao24: 'ae4004', callsign: 'RAGE23', lat: 30.0, lng: 35.5, altitude: 7620,
velocity: 298, heading: 50, verticalRate: 0, onGround: false,
category: 'fighter', typecode: 'F15I', lastSeen: now,
activeStart: T0 - 90 * MIN, activeEnd: T0 + 2 * HOUR,
},
// F-16I Sufa "VIPER01" - CAP over Negev/Golan (intercept duty)
{
icao24: 'ae0010', callsign: 'VIPER01', lat: 30.5, lng: 35.0, altitude: 6096,
velocity: 280, heading: 60, verticalRate: 5, onGround: false,
category: 'fighter', typecode: 'F16I', lastSeen: now,
activeStart: T0 - 2 * HOUR, activeEnd: T0 + 3 * HOUR,
},
// ═══════════════════════════════════════════
// CARGO / LOGISTICS
// ═══════════════════════════════════════════
// C-17A Globemaster III "RCH882" - Al Udeid → Al Asad logistics
{
icao24: 'ae0004', callsign: 'RCH882', lat: 29.0, lng: 48.0, altitude: 9753,
velocity: 220, heading: 340, verticalRate: -2, onGround: false,
category: 'cargo', typecode: 'C17A', lastSeen: now,
activeStart: T0 - 6 * HOUR, activeEnd: T0 - 1 * HOUR,
},
// C-17A "RCH445" - Post-strike logistics, Ramstein → Gulf
{
icao24: 'ae0013', callsign: 'RCH445', lat: 32.0, lng: 46.0, altitude: 10000,
velocity: 215, heading: 200, verticalRate: 0, onGround: false,
category: 'cargo', typecode: 'C17A', lastSeen: now,
activeStart: T0 + 2 * HOUR, activeEnd: T0 + 9 * HOUR,
},
// C-5M Super Galaxy "RCH901" - Heavy lift from Ramstein (ammo resupply)
{
icao24: 'ae5001', callsign: 'RCH901', lat: 35.0, lng: 38.0, altitude: 10668,
velocity: 230, heading: 120, verticalRate: 0, onGround: false,
category: 'cargo', typecode: 'C5M', lastSeen: now,
activeStart: T0 - 3 * HOUR, activeEnd: T0 + 5 * HOUR,
},
// ═══════════════════════════════════════════
// CIVILIAN (diverted/cancelled due to airspace closures)
// ═══════════════════════════════════════════
// Qatar Airways QR8101 - Doha → Amman (before airspace closure)
{
icao24: '738012', callsign: 'QTR8101', lat: 25.3, lng: 51.5, altitude: 3048,
velocity: 130, heading: 300, verticalRate: -5, onGround: false,
category: 'civilian', lastSeen: now,
activeStart: T0 - 11 * HOUR, activeEnd: T0 - 5 * HOUR,
},
// Emirates EK412 - Dubai → Istanbul (before airspace closure)
{
icao24: '710104', callsign: 'EK412', lat: 25.1, lng: 55.2, altitude: 10668,
velocity: 260, heading: 330, verticalRate: 3, onGround: false,
category: 'civilian', lastSeen: now,
activeStart: T0 - 8 * HOUR, activeEnd: T0 - 2 * HOUR,
},
// Qatar Airways QR306 - Doha → London (transiting region post-strike)
{
icao24: '738020', callsign: 'QTR306', lat: 26.0, lng: 50.5, altitude: 11000,
velocity: 240, heading: 315, verticalRate: 0, onGround: false,
category: 'civilian', lastSeen: now,
activeStart: T0 + 3 * HOUR, activeEnd: T0 + 10 * HOUR,
},
// Etihad EY55 - Abu Dhabi → Cairo (post-strike, restricted routing)
{
icao24: '710110', callsign: 'ETD55', lat: 24.5, lng: 54.0, altitude: 10500,
velocity: 250, heading: 280, verticalRate: 2, onGround: false,
category: 'civilian', lastSeen: now,
activeStart: T0 + 3 * HOUR, activeEnd: T0 + 9 * HOUR,
},
// ═══════════════════════════════════════════
// ADDITIONAL MILITARY — Coalition & Regional
// ═══════════════════════════════════════════
// RAF Typhoon FGR4 "TYPHON1" — RAF Akrotiri, Cyprus CAP
{
icao24: 'ae6001', callsign: 'TYPHON1', lat: 35.0, lng: 33.5, altitude: 9144,
velocity: 310, heading: 120, verticalRate: 0, onGround: false,
category: 'fighter', typecode: 'EUFI', lastSeen: now,
activeStart: T0 - 4 * HOUR, activeEnd: T0 + 8 * HOUR,
},
// RAF Typhoon FGR4 "TYPHON2"
{
icao24: 'ae6002', callsign: 'TYPHON2', lat: 34.8, lng: 33.8, altitude: 9144,
velocity: 308, heading: 125, verticalRate: 0, onGround: false,
category: 'fighter', typecode: 'EUFI', lastSeen: now,
activeStart: T0 - 4 * HOUR, activeEnd: T0 + 8 * HOUR,
},
// French Rafale "RAFALE1" — FS Charles de Gaulle launch
{
icao24: 'ae6003', callsign: 'RAFALE1', lat: 34.5, lng: 30.0, altitude: 10000,
velocity: 320, heading: 90, verticalRate: 0, onGround: false,
category: 'fighter', typecode: 'RFAL', lastSeen: now,
activeStart: T0 + 4 * HOUR, activeEnd: T0 + 10 * HOUR,
},
// USAF E-8C JSTARS "WIZARD21" — Ground surveillance over Iraq
{
icao24: 'ae6004', callsign: 'WIZARD21', lat: 33.5, lng: 42.5, altitude: 10668,
velocity: 210, heading: 45, verticalRate: 0, onGround: false,
category: 'surveillance', typecode: 'E8C', lastSeen: now,
activeStart: T0 - 8 * HOUR, activeEnd: T0 + 6 * HOUR,
},
// P-8A Poseidon "NAVY61" — Maritime patrol, Arabian Sea
{
icao24: 'ae6005', callsign: 'NAVY61', lat: 24.0, lng: 58.0, altitude: 7620,
velocity: 210, heading: 270, verticalRate: 0, onGround: false,
category: 'surveillance', typecode: 'P8A', lastSeen: now,
activeStart: T0 - 6 * HOUR, activeEnd: T0 + 8 * HOUR,
},
// P-8A Poseidon "NAVY62" — Maritime patrol, Strait of Hormuz
{
icao24: 'ae6006', callsign: 'NAVY62', lat: 26.0, lng: 55.5, altitude: 6096,
velocity: 200, heading: 180, verticalRate: 0, onGround: false,
category: 'surveillance', typecode: 'P8A', lastSeen: now,
activeStart: T0 - 3 * HOUR, activeEnd: T0 + 9 * HOUR,
},
// E-2D Hawkeye "NAVY71" — USS Abraham Lincoln AEW
{
icao24: 'ae6007', callsign: 'NAVY71', lat: 23.0, lng: 61.0, altitude: 7620,
velocity: 160, heading: 30, verticalRate: 0, onGround: false,
category: 'surveillance', typecode: 'E2D', lastSeen: now,
activeStart: T0 - 2 * HOUR, activeEnd: T0 + 6 * HOUR,
},
// KC-135R "JULEP31" — Refueling over Saudi
{
icao24: 'ae6008', callsign: 'JULEP31', lat: 27.0, lng: 45.0, altitude: 10668,
velocity: 245, heading: 0, verticalRate: 0, onGround: false,
category: 'tanker', typecode: 'KC135R', lastSeen: now,
activeStart: T0 - 6 * HOUR, activeEnd: T0 + 4 * HOUR,
},
// A330 MRTT "UAE50" — UAE Air Force tanker
{
icao24: 'ae6009', callsign: 'UAE50', lat: 25.0, lng: 53.0, altitude: 10000,
velocity: 240, heading: 315, verticalRate: 0, onGround: false,
category: 'tanker', typecode: 'A332', lastSeen: now,
activeStart: T0 - 4 * HOUR, activeEnd: T0 + 6 * HOUR,
},
// C-130J "RCH771" — Tactical airlift Kuwait
{
icao24: 'ae6010', callsign: 'RCH771', lat: 29.2, lng: 47.5, altitude: 6096,
velocity: 150, heading: 180, verticalRate: 0, onGround: false,
category: 'cargo', typecode: 'C130J', lastSeen: now,
activeStart: T0 - 2 * HOUR, activeEnd: T0 + 5 * HOUR,
},
// USAF B-1B Lancer "BONE21" — From Diego Garcia, standoff strikes
{
icao24: 'ae6011', callsign: 'BONE21', lat: 25.0, lng: 59.0, altitude: 10668,
velocity: 280, heading: 350, verticalRate: 0, onGround: false,
category: 'fighter', typecode: 'B1B', lastSeen: now,
activeStart: T0 - 3 * HOUR, activeEnd: T0 + 3 * HOUR,
},
// Saudi F-15SA "RSAF01" — Air defense patrol
{
icao24: 'ae6012', callsign: 'RSAF01', lat: 26.5, lng: 43.0, altitude: 9144,
velocity: 300, heading: 90, verticalRate: 0, onGround: false,
category: 'fighter', typecode: 'F15SA', lastSeen: now,
activeStart: T0 - 6 * HOUR, activeEnd: T0 + 10 * HOUR,
},
// Saudi F-15SA "RSAF02"
{
icao24: 'ae6013', callsign: 'RSAF02', lat: 26.3, lng: 43.5, altitude: 9144,
velocity: 298, heading: 95, verticalRate: 0, onGround: false,
category: 'fighter', typecode: 'F15SA', lastSeen: now,
activeStart: T0 - 6 * HOUR, activeEnd: T0 + 10 * HOUR,
},
// UAE F-16E "UAEAF1" — Al Dhafra CAP
{
icao24: 'ae6014', callsign: 'UAEAF1', lat: 24.5, lng: 55.0, altitude: 8534,
velocity: 290, heading: 60, verticalRate: 0, onGround: false,
category: 'fighter', typecode: 'F16E', lastSeen: now,
activeStart: T0 - 4 * HOUR, activeEnd: T0 + 8 * HOUR,
},
// Israeli G550 "ORON01" — Oron SIGINT/AEW platform
{
icao24: 'ae6015', callsign: 'ORON01', lat: 31.0, lng: 34.5, altitude: 12192,
velocity: 200, heading: 45, verticalRate: 0, onGround: false,
category: 'surveillance', typecode: 'G550', lastSeen: now,
activeStart: T0 - 3 * HOUR, activeEnd: T0 + 8 * HOUR,
},
// MQ-9 "REAPER43" — Over Yemen
{
icao24: 'ae6016', callsign: 'REAPER43', lat: 15.0, lng: 44.0, altitude: 6096,
velocity: 80, heading: 180, verticalRate: 0, onGround: false,
category: 'surveillance', typecode: 'MQ9A', lastSeen: now,
activeStart: T0 - 6 * HOUR, activeEnd: T0 + 10 * HOUR,
},
// ═══════════════════════════════════════════
// CIVILIAN — 영공 폐쇄 전/후 항공편 (중동 주요 노선)
// ═══════════════════════════════════════════
// ── 공습 전 출발 (T0-12h ~ T0-4h) ──
// 이란/이라크 영공 폐쇄 전 정상 운항
{ icao24: 'c10001', callsign: 'QTR777', lat: 25.3, lng: 51.6, altitude: 10668, velocity: 250, heading: 310, verticalRate: 3, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 - 12 * HOUR, activeEnd: T0 - 6 * HOUR },
{ icao24: 'c10002', callsign: 'QTR003', lat: 26.0, lng: 50.0, altitude: 11000, velocity: 245, heading: 290, verticalRate: 0, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 - 11 * HOUR, activeEnd: T0 - 5 * HOUR },
{ icao24: 'c10003', callsign: 'UAE203', lat: 25.2, lng: 55.3, altitude: 10668, velocity: 260, heading: 320, verticalRate: 2, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 - 11 * HOUR, activeEnd: T0 - 5 * HOUR },
{ icao24: 'c10004', callsign: 'UAE501', lat: 25.1, lng: 55.2, altitude: 11000, velocity: 255, heading: 275, verticalRate: 0, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 - 10 * HOUR, activeEnd: T0 - 4 * HOUR },
{ icao24: 'c10005', callsign: 'ETD401', lat: 24.4, lng: 54.7, altitude: 10668, velocity: 248, heading: 310, verticalRate: 1, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 - 10 * HOUR, activeEnd: T0 - 4 * HOUR },
{ icao24: 'c10006', callsign: 'GFA271', lat: 26.2, lng: 50.6, altitude: 10000, velocity: 240, heading: 300, verticalRate: 0, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 - 11 * HOUR, activeEnd: T0 - 6 * HOUR },
{ icao24: 'c10007', callsign: 'SVA103', lat: 24.7, lng: 46.7, altitude: 10668, velocity: 250, heading: 350, verticalRate: 2, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 - 12 * HOUR, activeEnd: T0 - 6 * HOUR },
{ icao24: 'c10008', callsign: 'SVA321', lat: 25.0, lng: 46.0, altitude: 11000, velocity: 255, heading: 45, verticalRate: 0, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 - 11 * HOUR, activeEnd: T0 - 5 * HOUR },
{ icao24: 'c10009', callsign: 'KAC501', lat: 29.2, lng: 47.9, altitude: 10668, velocity: 240, heading: 300, verticalRate: 0, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 - 11 * HOUR, activeEnd: T0 - 5 * HOUR },
{ icao24: 'c10010', callsign: 'OMA143', lat: 23.6, lng: 58.3, altitude: 10668, velocity: 248, heading: 315, verticalRate: 0, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 - 10 * HOUR, activeEnd: T0 - 4 * HOUR },
{ icao24: 'c10011', callsign: 'THY772', lat: 37.0, lng: 40.0, altitude: 11000, velocity: 240, heading: 270, verticalRate: 0, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 - 12 * HOUR, activeEnd: T0 - 6 * HOUR },
{ icao24: 'c10012', callsign: 'THY784', lat: 38.0, lng: 38.0, altitude: 10668, velocity: 245, heading: 180, verticalRate: -1, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 - 11 * HOUR, activeEnd: T0 - 5 * HOUR },
{ icao24: 'c10013', callsign: 'IRA712', lat: 35.7, lng: 51.4, altitude: 3048, velocity: 120, heading: 180, verticalRate: -5, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 - 12 * HOUR, activeEnd: T0 - 11 * HOUR },
{ icao24: 'c10014', callsign: 'IRA332', lat: 32.0, lng: 52.0, altitude: 10000, velocity: 230, heading: 90, verticalRate: 0, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 - 12 * HOUR, activeEnd: T0 - 11 * HOUR },
{ icao24: 'c10015', callsign: 'BAW115', lat: 30.0, lng: 45.0, altitude: 11000, velocity: 250, heading: 130, verticalRate: 0, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 - 12 * HOUR, activeEnd: T0 - 6 * HOUR },
{ icao24: 'c10016', callsign: 'DLH600', lat: 33.0, lng: 42.0, altitude: 11000, velocity: 248, heading: 120, verticalRate: 0, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 - 12 * HOUR, activeEnd: T0 - 6 * HOUR },
{ icao24: 'c10017', callsign: 'AFR562', lat: 34.0, lng: 38.0, altitude: 11000, velocity: 245, heading: 110, verticalRate: 0, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 - 11 * HOUR, activeEnd: T0 - 5 * HOUR },
{ icao24: 'c10018', callsign: 'SIA472', lat: 28.0, lng: 55.0, altitude: 11000, velocity: 260, heading: 100, verticalRate: 0, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 - 10 * HOUR, activeEnd: T0 - 4 * HOUR },
{ icao24: 'c10019', callsign: 'CPA761', lat: 27.0, lng: 56.0, altitude: 10668, velocity: 255, heading: 80, verticalRate: 0, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 - 10 * HOUR, activeEnd: T0 - 4 * HOUR },
{ icao24: 'c10020', callsign: 'KAL505', lat: 29.0, lng: 50.0, altitude: 11000, velocity: 250, heading: 70, verticalRate: 0, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 - 12 * HOUR, activeEnd: T0 - 6 * HOUR },
// ── 영공 폐쇄 직전 긴급 이탈 (T0-6h ~ T0-2h) ──
{ icao24: 'c10021', callsign: 'QTR008', lat: 26.5, lng: 49.0, altitude: 10668, velocity: 260, heading: 250, verticalRate: 0, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 - 6 * HOUR, activeEnd: T0 - 1 * HOUR },
{ icao24: 'c10022', callsign: 'UAE022', lat: 25.5, lng: 54.0, altitude: 11000, velocity: 255, heading: 200, verticalRate: 0, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 - 6 * HOUR, activeEnd: T0 - 1 * HOUR },
{ icao24: 'c10023', callsign: 'ETD203', lat: 24.8, lng: 54.5, altitude: 10000, velocity: 245, heading: 240, verticalRate: 0, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 - 5 * HOUR, activeEnd: T0 - 1 * HOUR },
{ icao24: 'c10024', callsign: 'FDB523', lat: 25.3, lng: 55.4, altitude: 9000, velocity: 230, heading: 190, verticalRate: -2, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 - 5 * HOUR, activeEnd: T0 - 1 * HOUR },
{ icao24: 'c10025', callsign: 'SVA661', lat: 26.0, lng: 44.0, altitude: 10668, velocity: 250, heading: 270, verticalRate: 0, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 - 6 * HOUR, activeEnd: T0 - 2 * HOUR },
{ icao24: 'c10026', callsign: 'GFA511', lat: 26.5, lng: 50.3, altitude: 8000, velocity: 220, heading: 210, verticalRate: -3, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 - 5 * HOUR, activeEnd: T0 - 1 * HOUR },
{ icao24: 'c10027', callsign: 'OMA155', lat: 24.0, lng: 57.0, altitude: 10668, velocity: 245, heading: 160, verticalRate: 0, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 - 6 * HOUR, activeEnd: T0 - 2 * HOUR },
{ icao24: 'c10028', callsign: 'IAW117', lat: 33.3, lng: 44.4, altitude: 5000, velocity: 150, heading: 300, verticalRate: -4, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 - 6 * HOUR, activeEnd: T0 - 4 * HOUR },
{ icao24: 'c10029', callsign: 'THY790', lat: 37.5, lng: 36.0, altitude: 10668, velocity: 250, heading: 160, verticalRate: 0, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 - 6 * HOUR, activeEnd: T0 - 2 * HOUR },
{ icao24: 'c10030', callsign: 'KAC303', lat: 29.0, lng: 48.2, altitude: 8000, velocity: 230, heading: 250, verticalRate: -2, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 - 5 * HOUR, activeEnd: T0 - 1 * HOUR },
// ── 영공 폐쇄 구간 (T0-2h ~ T0+3h) — 거의 민간기 없음 ──
// 우회 항공편만 소수
{ icao24: 'c10031', callsign: 'QTR922', lat: 28.0, lng: 42.0, altitude: 11000, velocity: 260, heading: 300, verticalRate: 0, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 - 1 * HOUR, activeEnd: T0 + 3 * HOUR },
{ icao24: 'c10032', callsign: 'UAE780', lat: 20.0, lng: 58.0, altitude: 11000, velocity: 255, heading: 250, verticalRate: 0, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 - 1 * HOUR, activeEnd: T0 + 4 * HOUR },
// ── 영공 부분 개방 후 (T0+3h ~) ── 우회 노선으로 운항 재개
{ icao24: 'c10033', callsign: 'QTR102', lat: 25.5, lng: 51.4, altitude: 10668, velocity: 248, heading: 280, verticalRate: 2, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 + 3 * HOUR, activeEnd: T0 + 10 * HOUR },
{ icao24: 'c10034', callsign: 'QTR844', lat: 25.2, lng: 51.5, altitude: 11000, velocity: 252, heading: 60, verticalRate: 3, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 + 4 * HOUR, activeEnd: T0 + 11 * HOUR },
{ icao24: 'c10035', callsign: 'UAE412', lat: 25.3, lng: 55.2, altitude: 10668, velocity: 260, heading: 310, verticalRate: 2, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 + 3 * HOUR, activeEnd: T0 + 10 * HOUR },
{ icao24: 'c10036', callsign: 'UAE506', lat: 25.0, lng: 55.0, altitude: 11000, velocity: 255, heading: 80, verticalRate: 0, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 + 4 * HOUR, activeEnd: T0 + 11 * HOUR },
{ icao24: 'c10037', callsign: 'ETD231', lat: 24.5, lng: 54.6, altitude: 10000, velocity: 250, heading: 290, verticalRate: 2, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 + 3 * HOUR, activeEnd: T0 + 9 * HOUR },
{ icao24: 'c10038', callsign: 'ETD889', lat: 24.3, lng: 54.8, altitude: 11000, velocity: 248, heading: 100, verticalRate: 0, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 + 5 * HOUR, activeEnd: T0 + 12 * HOUR },
{ icao24: 'c10039', callsign: 'SVA115', lat: 24.8, lng: 46.5, altitude: 10668, velocity: 245, heading: 340, verticalRate: 2, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 + 3 * HOUR, activeEnd: T0 + 9 * HOUR },
{ icao24: 'c10040', callsign: 'SVA717', lat: 24.5, lng: 46.8, altitude: 10668, velocity: 250, heading: 50, verticalRate: 0, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 + 4 * HOUR, activeEnd: T0 + 10 * HOUR },
{ icao24: 'c10041', callsign: 'FDB881', lat: 25.1, lng: 55.5, altitude: 9500, velocity: 235, heading: 200, verticalRate: 0, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 + 5 * HOUR, activeEnd: T0 + 10 * HOUR },
{ icao24: 'c10042', callsign: 'AXB221', lat: 25.0, lng: 55.1, altitude: 10668, velocity: 240, heading: 130, verticalRate: 0, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 + 4 * HOUR, activeEnd: T0 + 10 * HOUR },
{ icao24: 'c10043', callsign: 'GFA891', lat: 26.3, lng: 50.5, altitude: 10000, velocity: 235, heading: 280, verticalRate: 2, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 + 5 * HOUR, activeEnd: T0 + 11 * HOUR },
{ icao24: 'c10044', callsign: 'KAC117', lat: 29.5, lng: 47.8, altitude: 10668, velocity: 248, heading: 300, verticalRate: 0, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 + 4 * HOUR, activeEnd: T0 + 10 * HOUR },
{ icao24: 'c10045', callsign: 'OMA303', lat: 23.8, lng: 57.5, altitude: 10668, velocity: 245, heading: 250, verticalRate: 0, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 + 3 * HOUR, activeEnd: T0 + 9 * HOUR },
{ icao24: 'c10046', callsign: 'THY801', lat: 37.2, lng: 37.0, altitude: 11000, velocity: 240, heading: 140, verticalRate: 0, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 + 4 * HOUR, activeEnd: T0 + 10 * HOUR },
{ icao24: 'c10047', callsign: 'SIA478', lat: 22.0, lng: 58.0, altitude: 11000, velocity: 260, heading: 100, verticalRate: 0, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 + 5 * HOUR, activeEnd: T0 + 12 * HOUR },
{ icao24: 'c10048', callsign: 'CPA763', lat: 21.0, lng: 59.0, altitude: 11000, velocity: 258, heading: 85, verticalRate: 0, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 + 4 * HOUR, activeEnd: T0 + 11 * HOUR },
{ icao24: 'c10049', callsign: 'KAL507', lat: 25.0, lng: 52.0, altitude: 11000, velocity: 250, heading: 65, verticalRate: 0, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 + 5 * HOUR, activeEnd: T0 + 12 * HOUR },
{ icao24: 'c10050', callsign: 'BAW117', lat: 30.0, lng: 38.0, altitude: 11000, velocity: 255, heading: 130, verticalRate: 0, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 + 5 * HOUR, activeEnd: T0 + 12 * HOUR },
{ icao24: 'c10051', callsign: 'DLH602', lat: 33.0, lng: 35.0, altitude: 11000, velocity: 245, heading: 120, verticalRate: 0, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 + 4 * HOUR, activeEnd: T0 + 11 * HOUR },
{ icao24: 'c10052', callsign: 'AFR564', lat: 34.0, lng: 33.0, altitude: 11000, velocity: 248, heading: 110, verticalRate: 0, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 + 5 * HOUR, activeEnd: T0 + 12 * HOUR },
{ icao24: 'c10053', callsign: 'UAE870', lat: 25.2, lng: 55.3, altitude: 10668, velocity: 258, heading: 340, verticalRate: 3, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 + 6 * HOUR, activeEnd: T0 + 12 * HOUR },
{ icao24: 'c10054', callsign: 'QTR360', lat: 25.4, lng: 51.3, altitude: 10668, velocity: 252, heading: 320, verticalRate: 2, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 + 6 * HOUR, activeEnd: T0 + 12 * HOUR },
{ icao24: 'c10055', callsign: 'SVA401', lat: 24.9, lng: 46.6, altitude: 10668, velocity: 250, heading: 80, verticalRate: 0, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 + 6 * HOUR, activeEnd: T0 + 12 * HOUR },
{ icao24: 'c10056', callsign: 'FDB301', lat: 25.0, lng: 55.2, altitude: 9000, velocity: 230, heading: 250, verticalRate: 0, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 + 7 * HOUR, activeEnd: T0 + 12 * HOUR },
{ icao24: 'c10057', callsign: 'AIC115', lat: 25.3, lng: 55.0, altitude: 10668, velocity: 245, heading: 120, verticalRate: 0, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 + 5 * HOUR, activeEnd: T0 + 12 * HOUR },
{ icao24: 'c10058', callsign: 'PAK302', lat: 25.5, lng: 55.3, altitude: 10000, velocity: 238, heading: 90, verticalRate: 0, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 + 6 * HOUR, activeEnd: T0 + 12 * HOUR },
{ icao24: 'c10059', callsign: 'RJA401', lat: 31.7, lng: 36.0, altitude: 10668, velocity: 240, heading: 180, verticalRate: 0, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 + 5 * HOUR, activeEnd: T0 + 11 * HOUR },
{ icao24: 'c10060', callsign: 'MEA341', lat: 33.8, lng: 35.5, altitude: 10000, velocity: 235, heading: 250, verticalRate: 0, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 + 6 * HOUR, activeEnd: T0 + 12 * HOUR },
];
}