flight-planner
Version:
Plan and route VFR flights
274 lines (273 loc) • 12.7 kB
TypeScript
import { AerodromeService, WeatherService } from './index.js';
import { Aerodrome, VisualReportingPoint, Waypoint } from './waypoint.js';
import { Wind } from './metar.js';
import { Aircraft } from './aircraft.js';
/**
* Represents a course vector with distance and track.
*
* @interface CourseVector
* @property {number} distance - The distance of the course vector in nautical miles.
* @property {number} track - The track heading in degrees.
* @property {number | undefined} altitude - The altitude in feet, if available.
*/
export interface CourseVector {
distance: number;
track: number;
altitude?: number;
}
/**
* Interface representing the performance characteristics of an aircraft.
*
* @interface AircraftPerformance
* @property {number} headWind - The component of wind directly opposing the aircraft's motion, measured in knots.
* @property {number} crossWind - The component of wind perpendicular to the aircraft's motion, measured in knots.
* @property {number} trueAirSpeed - The speed of the aircraft relative to the air mass it's flying through, measured in knots.
* @property {number} windCorrectionAngle - The angle between the aircraft's heading and its track, measured in degrees.
* @property {number} heading - The direction the aircraft is pointed, measured in degrees from true north.
* @property {number} groundSpeed - The actual speed of the aircraft over the ground, measured in knots.
* @property {number} duration - The time duration for a segment of flight, typically measured in minutes.
* @property {number} [fuelConsumption] - Optional property representing the fuel consumption rate, typically measured in gallons or liters per hour.
*/
export interface AircraftPerformance {
headWind: number;
crossWind: number;
trueAirSpeed: number;
windCorrectionAngle: number;
heading: number;
groundSpeed: number;
duration: number;
fuelConsumption?: number;
}
/**
* Represents a segment of a flight route between two waypoints.
*
* @interface RouteLeg
* @property {RouteSegment} start - The starting waypoint of the leg
* @property {RouteSegment} end - The ending waypoint of the leg
* @property {number} distance - The distance of the leg in nautical miles
* @property {number} trueTrack - The true track heading in degrees
* @property {number | undefined} windDirection - The wind direction in degrees, if available
* @property {number | undefined} windSpeed - The wind speed in knots, if available
* @property {Date | undefined} arrivalDate - The estimated arrival date and time at the end waypoint
* @property {AircraftPerformance} [performance] - Optional performance calculations for this leg
*/
export interface RouteLeg {
start: RouteSegment;
end: RouteSegment;
course: CourseVector;
wind?: Wind;
arrivalDate?: Date;
performance?: AircraftPerformance;
}
/**
* Represents a complete route trip with multiple legs.
* Contains information about the route's path, distances, duration, and optionally fuel consumption and timing.
*
* @interface RouteTrip
* @property {RouteLeg[]} route - Array of route legs that make up the complete trip
* @property {number} totalDistance - Total distance of the trip in nautical miles
* @property {number} totalDuration - Total duration of the trip in minutes
* @property {number} [totalFuelConsumption] - Optional total fuel consumption for the trip in gallons/liters
* @property {number} [totalFuelRequired] - Optional total fuel required for the trip in gallons/liters
* @property {Date} [departureDate] - Optional planned departure date and time
* @property {Date} [arrivalDate] - Optional estimated arrival date and time
* @property {string} [remarks] - Optional remarks or notes about the trip
*/
export interface RouteTrip {
route: RouteLeg[];
aircraft?: Aircraft;
totalDistance: number;
totalDuration: number;
totalFuelConsumption?: number;
totalFuelRequired?: number;
departureDate?: Date;
arrivalDate?: Date;
remarks?: string;
}
/**
* Options for configuring a flight route.
*
* @interface RouteOptions
* @property {number} [defaultAltitude] - The default altitude for the route in feet.
* @property {Date} [departureDate] - The scheduled departure date and time.
* @property {Aircraft} [aircraft] - The aircraft to be used for the flight.
* @property {Aerodrome} [alternate] - An alternate aerodrome for the flight plan.
* @property {number} [reserveFuel] - The amount of reserve fuel to carry in liters.
* @property {number} [reserveFuelDuration] - The duration for which reserve fuel is calculated in minutes.
* @property {number} [taxiFuel] - The amount of fuel required for taxiing liters.
* @property {number} [takeoffFuel] - The amount of fuel required for takeoff in liters.
* @property {number} [landingFuel] - The amount of fuel required for landing in liters.
*/
export interface RouteOptions {
defaultAltitude?: number;
departureDate?: Date;
aircraft?: Aircraft;
alternate?: Aerodrome;
reserveFuel?: number;
reserveFuelDuration?: number;
taxiFuel?: number;
takeoffFuel?: number;
landingFuel?: number;
}
type WaypointType = Aerodrome | VisualReportingPoint | Waypoint;
interface RouteSegment {
waypoint: WaypointType;
altitude?: number;
}
/**
* Checks if a given track is eastbound (0-179 degrees).
*
* @param {number} track - The track in degrees.
* @returns {boolean} True if the track is eastbound, false otherwise.
*/
export declare const isEastbound: (track: number) => boolean;
/**
* Checks if a given track is westbound (180-359 degrees).
*
* @param {number} track - The track in degrees.
* @returns {boolean} True if the track is westbound, false otherwise.
*/
export declare const isWestbound: (track: number) => boolean;
/**
* Calculates the appropriate VFR cruising altitude based on the track and desired minimum altitude.
* Eastbound flights (0-179 degrees) use odd thousands + 500 feet (e.g., 3500, 5500).
* Westbound flights (180-359 degrees) use even thousands + 500 feet (e.g., 4500, 6500).
* The function returns the lowest VFR cruising altitude that is at or above the given minimum altitude.
*
* @param {number} track - The true track in degrees.
* @param {number} altitude - The minimum desired altitude in feet.
* @returns {number} The calculated VFR cruising altitude in feet.
*/
export declare const calculateVFRCruisingAltitude: (track: number, altitude: number) => number;
/**
* Converts an altitude in feet to the corresponding flight level.
* Flight levels are typically expressed in hundreds of feet, so the function divides the altitude by 1000.
*
* @param {number} altitude - The altitude in feet.
* @returns {number} The flight level (FL) corresponding to the given altitude.
*/
export declare const flightLevel: (altitude: number) => number;
/**
* FlightPlanner class to handle flight route planning operations
*/
declare class FlightPlanner {
private weatherService;
private aerodromeService;
/**
* Creates a new FlightPlanner instance
*
* @param weatherService - Weather service for retrieving weather data along the flight route
* Used to get wind information and other meteorological conditions
* @param aerodromeService - Aerodrome service for fetching airport and airfield data
* Used to look up airports by ICAO code and retrieve their information
*/
constructor(weatherService: WeatherService, aerodromeService: AerodromeService);
/**
* Helper method to calculate fuel consumption based on aircraft and duration
*
* @param aircraft - The aircraft for which to calculate fuel consumption
* @param duration - Flight duration in minutes
* @returns The fuel consumption in gallons/liters or undefined if not available
*/
private calculateFuelConsumption;
/**
* Attaches relevant weather data to waypoints by fetching METAR information
* First tries to get data for aerodromes by ICAO code, then finds nearest stations for other waypoints
*
* @param waypoints - The waypoints to attach weather data to
* @throws Will not throw but logs errors encountered during the process
*/
private attachWeatherData;
/**
* Creates a flight plan from a route string, which can include ICAO codes, reporting points, and waypoints.
*
* @param routeString - A string representing the route, e.g., "EDDF;RP(ALPHA);WP(50.05,8.57)"
* @param options - Optional configuration options for the flight route
* @returns A route trip object with legs, distances, durations, and fuel calculations
* @throws Error if no valid waypoints could be parsed from the route string
*/
createFlightPlanFromString(routeString: string, options?: RouteOptions): Promise<RouteTrip>;
/**
* Creates a flight plan based on an array of waypoints and optional route options.
*
* @param segments - An array of route segments, each containing a waypoint and optional altitude
* @param options - Optional configuration options for the flight route
* @returns A route trip object with legs, distances, durations, and fuel calculations
* @throws Error if fewer than 2 waypoints are provided
*/
createFlightPlan(segments: RouteSegment[], options?: RouteOptions): Promise<RouteTrip>;
/**
* Calculates the performance of the aircraft based on wind and course vector.
*
* @param aircraft - The aircraft for which to calculate performance
* @param course - The course vector containing distance and track
* @param wind - The wind conditions affecting the flight
* @returns An object containing performance metrics or undefined if not applicable
*/
private calculatePerformance;
/**
* Maps a route trip to an array of unique waypoints.
*
* This function extracts all waypoints from a route trip by taking the start and end
* waypoints of each leg and removing duplicates.
*
* @param routeTrip - The route trip containing legs with start and end waypoints
* @returns An array of unique waypoints representing all points in the route trip
*/
static getRouteWaypoints(routeTrip: RouteTrip): WaypointType[];
/**
* Gets the departure waypoint from a route trip.
*
* @param routeTrip - The route trip from which to extract the departure waypoint
* @returns The departure waypoint, which is the first waypoint in the route
*/
static getDepartureWaypoint(routeTrip: RouteTrip): WaypointType;
/**
* Gets the arrival waypoint from a route trip.
*
* @param routeTrip - The route trip from which to extract the arrival waypoint
* @returns The arrival waypoint, which is the last waypoint in the route
*/
static getArrivalWaypoint(routeTrip: RouteTrip): WaypointType;
/**
* Tests if a given waypoint is an Aerodrome.
*
* @param waypoint - The waypoint to test
* @returns True if the waypoint is an Aerodrome, false otherwise
*/
static isAerodrome(waypoint: WaypointType): waypoint is Aerodrome;
/**
* Tests if a given waypoint is a ReportingPoint.
*
* @param waypoint - The waypoint to test
* @returns True if the waypoint is a ReportingPoint, false otherwise
*/
static isReportingPoint(waypoint: WaypointType): waypoint is VisualReportingPoint;
/**
* Tests if a given waypoint is a basic Waypoint.
*
* @param waypoint - The waypoint to test
* @returns True if the waypoint is a basic Waypoint, false otherwise
*/
static isWaypoint(waypoint: WaypointType): waypoint is Waypoint;
/**
* Parses a route string and returns an array of Aerodrome or Waypoint objects.
*
* @param routeString - The route string to parse
* Supported formats:
* - ICAO codes (e.g., "EDDF")
* - RP(name) for reporting points (e.g., "RP(ALPHA)")
* - WP(lat,lng) for waypoints (e.g., "WP(50.05,8.57)")
* @returns A promise that resolves to an array of Aerodrome, ReportingPoint, or Waypoint objects
* @throws Error if the route string contains invalid waypoint formats
*/
parseRouteString(routeString: string): Promise<WaypointType[]>;
/**
* Converts a route trip to a string representation.
*
* @param routeTrip - The route trip to convert
* @returns A string representation of the route trip
*/
static toRouteString(routeTrip: RouteTrip): string;
}
export default FlightPlanner;