React 19 + TypeScript + Vite + MapLibre 기반 해양 모니터링 대시보드. 선박 AIS, 항공기, CCTV, 위성, 해양 인프라 등 다중 레이어 지원. ESLint React Compiler 규칙 조정 및 lint 에러 수정 포함.
147 lines
4.5 KiB
TypeScript
147 lines
4.5 KiB
TypeScript
export interface GeoEvent {
|
|
id: string;
|
|
timestamp: number; // unix ms
|
|
lat: number;
|
|
lng: number;
|
|
type: 'airstrike' | 'explosion' | 'missile_launch' | 'intercept' | 'alert' | 'impact' | 'osint';
|
|
source?: 'US' | 'IL' | 'IR' | 'proxy'; // 공격 주체: 미국, 이스라엘, 이란, 대리세력
|
|
label: string;
|
|
description?: string;
|
|
intensity?: number; // 0-100
|
|
imageUrl?: string; // 뉴스/위성 사진 URL
|
|
imageCaption?: string; // 사진 설명
|
|
}
|
|
|
|
export interface SensorLog {
|
|
timestamp: number;
|
|
seismic: number; // seismic activity level 0-100
|
|
airPressure: number; // hPa
|
|
noiseLevel: number; // dB
|
|
radiationLevel: number; // uSv/h
|
|
}
|
|
|
|
export interface ReplayState {
|
|
isPlaying: boolean;
|
|
currentTime: number; // unix ms
|
|
startTime: number; // unix ms
|
|
endTime: number; // unix ms
|
|
speed: number; // 1x, 2x, 4x, 8x
|
|
}
|
|
|
|
export interface ApiConfig {
|
|
eventsEndpoint: string;
|
|
sensorEndpoint: string;
|
|
pollIntervalMs: number;
|
|
}
|
|
|
|
// Aircraft tracking
|
|
export type AircraftCategory = 'military' | 'tanker' | 'surveillance' | 'fighter' | 'cargo' | 'civilian' | 'unknown';
|
|
|
|
export interface Aircraft {
|
|
icao24: string; // ICAO 24-bit hex address
|
|
callsign: string;
|
|
lat: number;
|
|
lng: number;
|
|
altitude: number; // meters
|
|
velocity: number; // m/s
|
|
heading: number; // degrees
|
|
verticalRate: number; // m/s
|
|
onGround: boolean;
|
|
category: AircraftCategory;
|
|
typecode?: string; // e.g. "KC135", "RC135", "RQ4"
|
|
typeDesc?: string; // e.g. "AIRBUS A-350-1000"
|
|
registration?: string; // e.g. "A6-XWC"
|
|
operator?: string; // e.g. "United Arab Emirates"
|
|
squawk?: string; // transponder code
|
|
trail?: [number, number][]; // recent positions [lat, lng]
|
|
lastSeen: number; // unix ms
|
|
activeStart?: number; // unix ms - when aircraft enters area
|
|
activeEnd?: number; // unix ms - when aircraft leaves area
|
|
}
|
|
|
|
// Satellite tracking
|
|
export interface Satellite {
|
|
noradId: number;
|
|
name: string;
|
|
tle1: string;
|
|
tle2: string;
|
|
category: 'reconnaissance' | 'communications' | 'navigation' | 'weather' | 'other';
|
|
}
|
|
|
|
export interface SatellitePosition {
|
|
noradId: number;
|
|
name: string;
|
|
lat: number;
|
|
lng: number;
|
|
altitude: number; // km
|
|
category: Satellite['category'];
|
|
groundTrack?: [number, number][]; // predicted ground track
|
|
}
|
|
|
|
// Ship tracking (AIS)
|
|
export type ShipCategory = 'warship' | 'carrier' | 'destroyer' | 'submarine' | 'cargo' | 'tanker' | 'patrol' | 'civilian' | 'unknown';
|
|
|
|
export interface Ship {
|
|
mmsi: string; // Maritime Mobile Service Identity
|
|
name: string;
|
|
lat: number;
|
|
lng: number;
|
|
heading: number; // degrees
|
|
speed: number; // knots
|
|
course: number; // course over ground
|
|
category: ShipCategory;
|
|
flag?: string; // country code
|
|
typecode?: string;
|
|
typeDesc?: string; // e.g. "Cargo ship"
|
|
imo?: string; // IMO number
|
|
callSign?: string;
|
|
status?: string; // "Under way using engine", "Anchored", etc.
|
|
destination?: string;
|
|
eta?: string; // ISO date
|
|
draught?: number; // meters
|
|
length?: number; // meters
|
|
width?: number; // meters
|
|
trail?: [number, number][];
|
|
lastSeen: number; // unix ms
|
|
activeStart?: number; // unix ms - when ship enters area
|
|
activeEnd?: number; // unix ms - when ship leaves area
|
|
}
|
|
|
|
// Iran oil/gas facility
|
|
export type OilFacilityType = 'refinery' | 'oilfield' | 'gasfield' | 'terminal' | 'petrochemical' | 'desalination';
|
|
|
|
export interface OilFacility {
|
|
id: string;
|
|
name: string;
|
|
nameKo: string;
|
|
lat: number;
|
|
lng: number;
|
|
type: OilFacilityType;
|
|
capacityBpd?: number; // barrels per day (oil)
|
|
capacityMcfd?: number; // million cubic feet per day (gas)
|
|
capacityMgd?: number; // million gallons per day (desalination)
|
|
reservesBbl?: number; // billion barrels (oil reserves)
|
|
reservesTcf?: number; // trillion cubic feet (gas reserves)
|
|
operator?: string;
|
|
description?: string;
|
|
damaged?: boolean; // hit during strikes
|
|
damagedAt?: number; // unix ms — time when facility was struck
|
|
planned?: boolean; // planned US strike target
|
|
plannedLabel?: string; // planned strike description
|
|
}
|
|
|
|
// Layer visibility
|
|
export interface LayerVisibility {
|
|
events: boolean;
|
|
aircraft: boolean;
|
|
satellites: boolean;
|
|
ships: boolean;
|
|
koreanShips: boolean;
|
|
airports: boolean;
|
|
sensorCharts: boolean;
|
|
oilFacilities: boolean;
|
|
militaryOnly: boolean;
|
|
}
|
|
|
|
export type AppMode = 'replay' | 'live';
|