UNPKG

ootk-core

Version:

Orbital Object Toolkit. A modern typed replacement for satellite.js including SGP4 propagation, TLE parsing, Sun and Moon calculations, and more.

143 lines 5.67 kB
/** * @author Theodore Kruczek. * @license MIT * @copyright (c) 2022-2025 Theodore Kruczek Permission is * hereby granted, free of charge, to any person obtaining a copy of this * software and associated documentation files (the "Software"), to deal in the * Software without restriction, including without limitation the rights to use, * copy, modify, merge, publish, distribute, sublicense, and/or sell copies of * the Software, and to permit persons to whom the Software is furnished to do * so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ import { calcGmst, lla2eci, llaRad2ecf, DEG2RAD, Geodetic, SpaceObjectType, } from '../main.js'; import { BaseObject } from './BaseObject.js'; export class GroundObject extends BaseObject { name = 'Unknown Ground Object'; lat; lon; alt; constructor(info) { super(info); this.validateGroundObjectInputData_(info); this.name = info.name ?? this.name; this.lat = info.lat; this.lon = info.lon; this.alt = info.alt; } /** * Calculates the relative azimuth, elevation, and range between this GroundObject and a Satellite. * @param satellite The Satellite object. * @param date The date for which to calculate the RAE values. Defaults to the current date. * @returns The relative azimuth, elevation, and range values in kilometers and degrees. */ rae(satellite, date = new Date()) { return satellite.rae(this, date); } /** * Calculates ECF position at a given time. * @variation optimized version of this.toGeodetic().toITRF().position; * @returns The ECF position vector of the ground object. */ ecf() { return llaRad2ecf(this.toGeodetic()); } /** * Calculates the Earth-Centered Inertial (ECI) position vector of the ground object at a given date. * @variation optimzed version of this.toGeodetic().toITRF().toJ2000().position; * @param date The date for which to calculate the ECI position vector. Defaults to the current date. * @returns The ECI position vector of the ground object. */ eci(date = new Date()) { const { gmst } = calcGmst(date); return lla2eci(this.toGeodetic(), gmst); } /** * Returns the latitude, longitude, and altitude of the GroundObject. * @returns The latitude, longitude, and altitude as an LlaVec3 object. */ lla() { return { lat: this.lat, lon: this.lon, alt: this.alt, }; } /** * Converts the latitude, longitude, and altitude of the GroundObject to radians and kilometers. * @variation optimized version of this.toGeodetic() without class instantiation for better performance and * serialization. * @returns An object containing the latitude, longitude, and altitude in * radians and kilometers. */ llaRad() { return { lat: (this.lat * DEG2RAD), lon: (this.lon * DEG2RAD), alt: this.alt, }; } get latRad() { return this.lat * DEG2RAD; } get lonRad() { return this.lon * DEG2RAD; } /** * Creates a GroundObject object from a Geodetic position. * @param geodetic The geodetic coordinates. * @returns A new GroundObject object. */ static fromGeodetic(geodetic) { return new GroundObject({ lat: geodetic.latDeg, lon: geodetic.lonDeg, alt: geodetic.alt, }); } /** * Converts the ground position to geodetic coordinates. * @returns The geodetic coordinates. */ toGeodetic() { return Geodetic.fromDegrees(this.lat, this.lon, this.alt); } /** * Validates the input data for the GroundObject. * @param info - The GroundPositionParams object containing the latitude, * longitude, and altitude. @returns void */ validateGroundObjectInputData_(info) { this.validateParameter(info.lat, -90, 90, 'Invalid latitude - must be between -90 and 90'); this.validateParameter(info.lon, -180, 180, 'Invalid longitude - must be between -180 and 180'); this.validateParameter(info.alt, 0, null, 'Invalid altitude - must be greater than 0'); } isGroundObject() { switch (this.type) { case SpaceObjectType.INTERGOVERNMENTAL_ORGANIZATION: case SpaceObjectType.SUBORBITAL_PAYLOAD_OPERATOR: case SpaceObjectType.PAYLOAD_OWNER: case SpaceObjectType.METEOROLOGICAL_ROCKET_LAUNCH_AGENCY_OR_MANUFACTURER: case SpaceObjectType.PAYLOAD_MANUFACTURER: case SpaceObjectType.LAUNCH_VEHICLE_MANUFACTURER: case SpaceObjectType.ENGINE_MANUFACTURER: case SpaceObjectType.LAUNCH_AGENCY: case SpaceObjectType.LAUNCH_SITE: case SpaceObjectType.LAUNCH_POSITION: return true; default: return false; } } } //# sourceMappingURL=GroundObject.js.map