This commit is contained in:
Kilian Hofmann 2025-07-11 21:48:37 +02:00
commit bdc8bb1567
26 changed files with 4777 additions and 0 deletions

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
node_modules/

672
DFD Paths and what to do.md Normal file
View File

@ -0,0 +1,672 @@
# References
- https://www.faa.gov/sites/faa.gov/files/regulations_policies/handbooks_manuals/aviation/instrument_procedures_handbook/FAA-H-8083-16B_Chapter_6.pdf
- https://developers.navigraph.com/docs/navigation-data/dfd-data-format#procedure-leg-data-fields-minimum-requirements
# Terminators
## Arc to Fix (AF)
### Example
LGAV BIBE1K SID (Cycle 2507, ID 10653)
### Minimum Required Fields
- `WptID`: FixIdentifier
- `TurnDir`: TurnDirection
- `NavID`: RecommendedNavaid
- `NavBear`: Theta (fix radial)
- `NavDist`: RHO
- `Course`: MagCourse (boundary radial)
### Instructions
- From preceding fix, fly a smooth arc to the fix identified by (`WptID`, `WptLat`, `WptLon`) *or*
(`NavID`, `NavLat`, `NavLon`, `NavDist`, `NavBear`).
- Arc radius shall be `NavDist`.
- Arc center shall be navaid identified by `NavID`, `NavLat`, `NavLon`.
- `Course` shall be the boundary radial on which the arc begins (preceding fix lies hereupon).
- Arc and turn shall be flown in direction specified by `TurnDir`.
### Units
- `NavBear` and `Course` are in **degrees magnetic**.
- `NavDist` is in **nmi**. `NavDist` is geodesic (great-circle).
### Notes
While similar to an RF, the center point is coded differently.
## Course to Altitude (CA)
### Example
LGAV BIBE1L SID (Cycle 2507, ID 10654)
### Minimum Required Fields
- `Course`: MagCourse
- `Alt`: Alt1+ (at or above)
### Instructions
- From preceding fix, fly along `Course` until reaching `Alt`.
### Units
- `Course` is in **degrees magnetic**.
- `Alt` is in **ft**, but doubles as an FMS constraint.
### Notes
The leg terminates upon reaching `Alt`.
This intercept point then becomes the origin fix of the succeeding leg.
## Course to DME Distance (CD)
### Example
LGAV BIBE2F SID (Cycle 2507, ID 10657)
### Minimum Required Fields
- `NavID`: RecommendedNavaid
- `Course`: MagCourse
- `Distance`: RouteDISTANCEHoldingTime (DME distance)
### Instructions
- From preceding fix, fly along `Course` until reaching `Distance` from the navaid identified by
`NavID`.
### Units
- `Course` is in **degrees magnetic**.
- `Distance` is in **nmi**. `Distance` is slant **not** geodesic.
### Notes
The leg terminates upon reaching `Distance`.
This intercept point then becomes the origin fix of the succeeding leg.
## Course to Fix (CF)
### Example
LGAV BIBE2F SID (Cycle 2507, ID 10657)
### Minimum Required Fields
- `WptID`: FixIdentifier
- `NavID`: RecommendedNavaid
- `NavBear`: Theta
- `NavDist`: RHO
- `Course`: MagCourse
- `Distance`: RouteDISTANCEHoldingTime (Path length)
### Instructions
- From preceding fix, fly `Course` to the fix identified by (`WptID`, `WptLat`, `WptLon`) *or*
(`NavID`, `NavLat`, `NavLon`, `NavDist`, `NavBear`).
### Units
- `NavBear` and `Course` are in **degrees magnetic**.
- `NavDist` and `Distance` are in **nmi**. `NavDist` and `Distance` are geodesic.
### Notes
While this might feel like a TF, it isn't.
A TF does not specify an exact course to be flown, relying on the computers to figure out the
great-circle between the two fixes.
My guess is, that a CF results in the turn from the preceding fix to be *shifted* so as to
ensure the outbound course to the specified fix is equal to the coded course.
Additionally, if a TurnDir is specified, if a large turn is required to fly `Course`, the turn
shall be `TurnDir`.
**This is a major difference to TF, these *never* produce such turns.**
## Course to Intercept (CI)
### Example
LGAV BIBE1L SID (Cycle 2507, ID 10654)
### Minimum Required Fields
- `Course`: MagCourse
### Instructions
- From preceding fix, fly `Course` until interception of course of the succeeding leg.
### Units
- `Course` is in **degrees magnetic**.
### Notes
This needs to look into the succeeding leg in order to calculate the intercept point.
This intercept point then becomes the origin fix of the succeeding leg.
## Course to Radial Termination (CR)
### Example
LGAV KOR1D SID (Cycle 2507, ID 10679)
### Minimum Required Fields
- `NavID`: RecommendedNavaid
- `NavBear`: Theta
- `Course`: MagCourse
### Instructions
- From preceding fix, fly `Course` until interception of `NavBear` radial *from* the navaid
identified by `NavID`.
### Units
- `NavBear` and `Course` are in **degrees magnetic**.
### Notes
The leg terminates at the intercept point.
This intercept point then becomes the origin fix of the succeeding leg.
## Direct to Fix (DF)
### Example
LGAV KOR1D SID (Cycle 2507, ID 10679)
### Minimum Required Fields
- `WptID`: FixIdentifier
- `IsFlyOver`: Flyover
### Instructions
- From present position, fly direct to fix identified by `WptID`
### Units
- `IsFlyOver`: Boolean indicating if fix is a mandatory fly over.
## Fix to Altitude (FA)
### Example
LGAV BIBE2F SID (Cycle 2507, ID 10657)
### Minimum Required Fields
- `WptID`: FixIdentifier
- `NavID`: RecommendedNavaid
- `NavBear`: Theta
- `NavDist`: RHO
- `Course`: MagCourse
- `Alt`: Alt1+ (at or above)
### Instructions
- From the fix identified by (`WptID`, `WptLat`, `WptLon`) *or*
(`NavID`, `NavLat`, `NavLon`, `NavDist`, `NavBear`), fly `Course` until reaching `Alt`.
### Units
- `NavBear` and `Course` are in **degrees magnetic**.
- `NavDist` is in **nmi**. `NavDist` is geodesic.
- `Alt` is in **ft**, but doubles as an FMS constraint.
### Notes
The leg terminates upon reaching `Alt`.
This intercept point then becomes the origin fix of the succeeding leg.
## Track from Fix for Distance (FC)
### Example
LIED CAR6F SID (Cycle 2507, ID 11798)
### Minimum Required Fields
- `WptID`: FixIdentifier
- `IsFlyOver`: FlyOver
- `NavID`: RecommendedNavaid
- `NavBear`: Theta
- `NavDist`: RHO
- `Course`: MagCourse
- `Distance`: RouteDISTANCEHoldingTime (Path length)
### Instructions
- From the fix identified by (`WptID`, `WptLat`, `WptLon`) *or*
(`NavID`, `NavLat`, `NavLon`, `NavDist`, `NavBear`), fly for `Distance`.
### Units
- `NavBear` and `Course` are in **degrees magnetic**.
- `NavDist` and `Distance` are in **nmi**. `NavDist` and `Distance` are geodesic.
### Notes
The leg terminates upon reaching `Distance`.
This intercept point then becomes the origin fix of the succeeding leg.
## Track from Fix to DME Distance (FD)
### Example
LGAV BIBE2T SID (Cycle 2507, ID 10659)
### Minimum Required Fields
- `WptID`: FixIdentifier
- `IsFlyOver`: FlyOver
- `NavID`: RecommendedNavaid
- `NavBear`: Theta
- `NavDist`: RHO
- `Course`: MagCourse
- `Distance`: RouteDISTANCEHoldingTime (DME distance)
### Instructions
- From the fix identified by (`WptID`, `WptLat`, `WptLon`) *or*
(`NavID`, `NavLat`, `NavLon`, `NavDist`, `NavBear`), fly `Course` until
reaching `Distance` from navaid identified by `NavID`.
### Units
- `NavBear` and `Course` are in **degrees magnetic**.
- `NavDist` and `Distance` are in **nmi**. `NavDist` is geodesic, `Distance` is slant.
- `IsFlyOver`: Boolean indicating if fix is a mandatory fly over.
## From Fix to Manual termination (FM)
### Example
LFPV PB2V SID (Cycle 2507, ID 10395)
### Minimum Required Fields
- `WptID`: FixIdentifier
- `NavID`: RecommendedNavaid
- `NavBear`: Theta
- `NavDist`: RHO
- `Course`: MagCourse
### Instructions
- From the fix identified by (`WptID`, `WptLat`, `WptLon`) *or*
(`NavID`, `NavLat`, `NavLon`, `NavDist`, `NavBear`), fly `Course` indefinitely.
### Units
- `NavBear` and `Course` are in **degrees magnetic**.
- `NavDist` is in **nmi**. `NavDist` is geodesic.
## Holding mandatory (HA)
### Example
LOWG GRZ4X SID (Cycle 2507, ID 12765)
### Minimum Required Fields
- `WptID`: FixIdentifier
- `TurnDir`: TurnDirection
- `Course`: MagCourse
- `Distance`: RouteTIMEDistanceHoldingTime
- `Alt`: Alt1+ (at or above)
### Instructions
- At fix identified by (`WptID`, `WptLat`, `WptLon`), enter `TurnDir` direction holding pattern.
- `Course` shall be the inbound course of the holding.
- `Distance` shall be the holding leg distance *or* time
- `Alt` shall be the altitude at which the holding is exited
### Units
- `Course` is in **degrees magnetic**.
- `Distance` is in **nmi** *or* **min**. `Distance` is geodesic if in nmi.
- `Alt` is in **ft**, but doubles as an FMS constraint.
### Notes
As per the docs, there should be a field indicating whether `Distance` is distance or time.
I have not found the field or anything that alludes to such.
Conversely, as per the FAA, the altitude should be the exit point of the leg.
This goes against the textual description of the example.
My guess is that the holding is at all times executed at leat once, even if the entry to it is also
the exit altitude.
As for the missing time/distance decider field, assume it to be distance at all times.
## Holding in lieu of Procedure Turn (HF)
### Example
FAWB VDM29 APP (Cycle 2507, ID 67794)
### Minimum Required Fields
- `WptID`: FixIdentifier
- `TurnDir`: TurnDirection
- `Course`: MagCourse
- `Distance`: RouteTIMEDistanceHoldingTime
### Instructions
- At fix identified by (`WptID`, `WptLat`, `WptLon`), enter `TurnDir` direction holding pattern.
- `Course` shall be the inbound course of the holding.
- `Distance` shall be the holding leg distance *or* time
- Holding shall be exited after exactly one turn
### Units
- `Course` is in **degrees magnetic**.
- `Distance` is in **nmi** *or* **min**. `Distance` is geodesic if in nmi.
### Notes
As per the docs, there should be a field indicating whether `Distance` is distance or time.
I have not found the field or anything that alludes to such.
My guess is that `Distance` always is a distance. This would match with the example.
The Leg terminates after the hold is exited ath the hold entry fix.
## Holding mandatory (HM)
### Example
FAWB VDM29 APP (Cycle 2507, ID 67794), Missed approach procedure
### Minimum Required Fields
- `WptID`: FixIdentifier
- `TurnDir`: TurnDirection
- `Course`: MagCourse
- `Distance`: RouteTIMEDistanceHoldingTime
### Instructions
- At fix identified by (`WptID`, `WptLat`, `WptLon`), enter `TurnDir` direction holding pattern.
- `Course` shall be the inbound course of the holding.
- `Distance` shall be the holding leg distance *or* time
- Holding shall be indefinite
### Units
- `Course` is in **degrees magnetic**.
- `Distance` is in **nmi** *or* **min**. `Distance` is geodesic if in nmi.
### Notes
As per the docs, there should be a field indicating whether `Distance` is distance or time.
I have not found the field or anything that alludes to such.
My guess as for the missing time/distance decider field, assume it to be distance at all times.
## Initial Fix (IF)
### Example
FAWB VDM29 APP (Cycle 2507, ID 67794), Missed approach procedure
### Minimum Required Fields
- `WptID`: FixIdentifier
### Instructions
- Start of a STAR or APP
### Notes
Nothing to be done except parse restrictions.
Servers as the entry point of a STAR/APP procedure.
## Procedure Turn (PI)
### Example
FAUP VDM35 APP (Cycle 2507, ID 67790)
### Minimum Required Fields
- `WptID`: FixIdentifier
- `TurnDir`: TurnDirection
- `NavID`: RecommendedNavaid
- `NavBear`: Theta
- `NavDist`: RHO
- `Course`: MagCourse
- `Distance`: RouteTimeDISTANCEHoldingTime (excursion distance from fix)
- `Alt`: Alt1
### Instructions
- From the fix identified by (`WptID`, `WptLat`, `WptLon`) *or*
(`NavID`, `NavLat`, `NavLon`, `NavDist`, `NavBear`), fly `Course` for `Distance`.
- Turn `TurnDir` until aligned with succeeding leg course.
- `Alt` shall be the altitude during the procedure.
### Units
- `NavBear`and `Course` are in **degrees magnetic**.
- `NavDist` and `Distance` are in **nmi**. `NavDist` and `Distance` are geodesic.
- `Alt` is in **ft**, but doubles as an FMS constraint.
### Notes
This needs to look into the succeeding leg in order to calculate the intercept point.
This intercept point then becomes the origin fix of the succeeding leg.
## Radius to Fix (RF)
### Example
LFRN GODA5R SID (cycle 2507, ID 10485)
### Minimum Required Fields
- `WptID`: FixIdentifier
- `TurnDir`: TurnDirection
- `NavBear`: Theta (inbound tangential track)
- `Course`: MagCourse
- `Distance`: RouteTimeDISTANCEHoldingTime (along track distance)
- `CenterID`: ArcCenter
### Instructions
- From preceding fix, fly a smooth arc to the fix identified by (`WptID`, `WptLat`, `WptLon`).
- Arc radius shall be `NavDist`.
- Arc center shall be navaid identified by `CenterID`, `CenterLat`, `CenterLon`.
- Arc and turn shall be flown in direction specified by `TurnDir`.
- `Distance` shall be the track miles along the curved path
### Units
- `NavBear` and `Course` are in **degrees magnetic**.
- `Distance` is in **nmi**. `Distance` is geodesic (great-circle).
### Notes
While similar to an AF, the center point is coded differently.
No radius is specified, but can be inferred based on center point, both endpoints and arc length
Example has `NavBear` set to `null`, significance of the inbound tangential track is unknown.
Same for the `Course`, which is set, but lacks any documentation.
## Tract to Fix (TF)
### Example
LFRN GODA5R SID (cycle 2507, ID 10485)
### Minimum Required Fields
- `WptID`: FixIdentifier
- `IsFlyOver`: Overfly
### Instructions
- From the preceding waypoint, fly direct to the waypoint identified by
`WptID`, `WptLat`, `WptLon`.
### Units
- `IsFlyOver`: Boolean indicating if fix is a mandatory fly over.
## Heading to Altitude (VA)
### Example
LFRK LGL4X SID (Cycle 2507, ID 10475)
### Minimum Required Fields
- `Course`: MagCourse (Heading)
- `Alt`: Alt1+ (at or above)
### Instructions
- From preceding fix, fly heading specified in `Course` until reaching `Alt`
- **No wind corrections shall be applied**
### Units
- `Course` is in **degrees magnetic**.
- `Alt` is in **ft**, but doubles as an FMS constraint.
### Notes
The leg terminates upon reaching `Alt`.
This intercept point then becomes the origin fix of the succeeding leg.
## Heading to DME Distance (VD)
### Example
LFRK NEVI4Y SID (Cycle 2507, ID 10482)
### Minimum Required Fields
- `NavID`: RecommendedNavaid
- `Course`: MagCourse (Heading)
- `Distance`: RouteTimeDISTANCEHoldingTime (DME distance)
### Instructions
- From preceding fix, fly heading specified in `Course` until reaching `Distance` from the navaid
identified by `NavID`.
- **No wind corrections shall be applied**
### Units
- `Course` is in **degrees magnetic**.
- `Distance` is in **nmi**. `Distance` is slant **not** geodesic.
### Notes
The leg terminates upon reaching `Distance`.
This intercept point then becomes the origin fix of the succeeding leg.
## Heading to Intercept (VI)
### Example
LFRK LUSI4Y SID (Cycle 2507, ID 10480)
### Minimum Required Fields
- `Course`: MagCourse
### Instructions
- From preceding fix, fly heading specified in `Course` until interception of course of the
succeeding leg.
- **No wind corrections shall be applied**
### Units
- `Course` is in **degrees magnetic**.
### Notes
This needs to look into the succeeding leg in order to calculate the intercept point.
This intercept point then becomes the origin fix of the succeeding leg.
## Heading to Manual Termination (VM)
### Example
LFPV PB2P SID (Cycle 2507, ID 10394)
### Minimum Required Fields
- `Course`: MagCourse (Heading)
### Instructions
- From preceding fix, fly heading specified in `Course` indefinitely
- **No wind corrections shall be applied**
### Units
- `Course` is in **degrees magnetic**.
## Heading to Radial (VR)
### Example
LIMC MMP8G SID (Cycle 2507, ID 11909)
### Minimum Required Fields
- `NavID`: RecommendedNavaid
- `NavBear`: Theta
- `Course`: MagCourse
### Instructions
- From preceding fix, fly heading specified in `Course` until interception of
`NavBear` radial *from* the navaid identified by `NavID`.
### Units
- `NavBear` and `Course` are in **degrees magnetic**.
### Notes
The leg terminates at the intercept point.
This intercept point then becomes the origin fix of the succeeding leg.

351
FlightPlan.Resolution.cpp Normal file
View File

@ -0,0 +1,351 @@
#include "FMC.h"
#include <Helper.h>
#include <GeoFormulas/GeoFormulas.h>
#include <AerospaceFormulas.h>
using namespace std;
double slantRangeToGroundDist(double slantRangeNM, double verticalDistFt)
{
return FeetToNm(sqrt(pow(NmToFeet(slantRangeNM), 2) - pow(verticalDistFt, 2)));
}
void FMC::FlightPlan::CalculateLegs()
{
double dTol = 0.0;
double weight = fmc->gw != DataEntryType::None ? (double)fmc->gw : 280000.0;
for (size_t i = 0; i < legs.size(); i++)
{
shared_ptr<NavDataObj> leg = legs[i];
if (leg->usage == ObjectUsage::Origin)
{
double dist = 0;
if (arrApt.GetID() != -1)
dist = depApt.latlon.Dist(arrApt.latlon);
leg->vertSegments.emplace_back(VerticalSegment(0.0, fmc->GetPredictedSpeedTarget(depApt.elevation, weight, FLIGHT_PHASE::TAKEOFF, dist, &fmc->actFpln, true), depApt.elevation, SPD_INVALID, ObjectUsagePhase::Climb));
}
else if (leg->usage == ObjectUsage::Destination)
{
leg->vertSegments.emplace_back(VerticalSegment(0.0, fmc->GetPredictedSpeedTarget(arrApt.elevation, weight, FLIGHT_PHASE::APPROACH, 0, &fmc->actFpln, true), arrApt.elevation, SPD_INVALID, ObjectUsagePhase::Descent));
}
//NavLat/Lon -> destLatLon
//NavDist->distToDest
//WptLat/Lon -> refLatLon
//distance->distance
if (leg->GetType() == NavDataObjType::TerminalLeg)
{
shared_ptr<TerminalLeg> tl = dynamic_pointer_cast<TerminalLeg>(leg);
switch (tl->track_code)
{
case TrackCode::TrackFromFixToDistance:
tl->latlon = tl->refLatLon.Dest(tl->distance, modAngle(tl->course - tl->refLatLon.GetMagVar())); //this DEFINITELY works for CourseFromFixToDMEDistance
break;
case TrackCode::CourseFromFixToDMEDistance:
{
//check this, terminal ID 11546 on RW35L transition contains one
double alt = tl->GetPredictedAltitude();
if (alt == ALT_INVALID)
alt = tl->altRestrLower;
if (alt == ALT_INVALID)
alt = tl->altRestr;
double wptHeight = tl->nvd.GetID() != -1 ? tl->nvd.elevation : 0;
double vertDist = fabs(alt - wptHeight);
double groundDist = slantRangeToGroundDist(tl->distance, vertDist);
groundDist = CLAMP(groundDist, (tl->distance * 0.5), (tl->distance * 1.5));
tl->latlon = tl->refLatLon.Dest(groundDist, modAngle(tl->course - tl->refLatLon.GetMagVar())); //this DEFINITELY works for CourseFromFixToDMEDistance
tl->isFlyover = true;
break;
}
case TrackCode::ArcToFix:
//check this - segment generator must create the arc based on NavDist?
tl->latlon = tl->refLatLon;
break;
case TrackCode::RadiusToFix:
tl->latlon = tl->refLatLon;
break;
case TrackCode::CourseFromFixToAltitude:
case TrackCode::CourseToAltitude:
case TrackCode::HeadingToAltitude:
{
double lastAlt = 0;
LatitudeLongitude startLatLon;
double lastSpeed = 150;
for (int lastLeg = this->GetPreviousFlyableLeg((int)i, legs); lastLeg != -1; lastLeg = this->GetPreviousFlyableLeg((int)lastLeg, legs))
{
startLatLon = FMC::GetBestLatLonForLeg(this, legs[lastLeg], FMC::perf.get(), true); //this is because the segment will indefinitely extend otherwise
lastAlt = GetBestAltitudeForLeg(legs[lastLeg]);
lastSpeed = fmc->GetPredictedSpeedTarget(lastAlt, weight, legs[lastLeg]->GetUsagePhase() == ObjectUsagePhase::Climb || legs[lastLeg]->GetUsagePhase() == ObjectUsagePhase::MissedApproach ? FLIGHT_PHASE::CLIMB : FLIGHT_PHASE::CRUISE, 0, this, true);
break;
}
double angle = modAngle(tl->course + startLatLon.GetMagVar());
double minDist = 0;
if (tl->track_code == TrackCode::CourseFromFixToAltitude) //this breaks at airports
{
if (fabs(diffAngle(angle, tl->refLatLon.BearingTo(startLatLon))) < 10)
minDist = tl->refLatLon.Dist(startLatLon);
startLatLon = tl->refLatLon;
}
//the heading one should _technically_ account for wind drift here
double diffAlt = tl->altRestr - lastAlt;
if (tl->altRestrictionType == AltitudeRestrictionType::Above)
diffAlt = max(diffAlt, 1);
else if (tl->altRestrictionType == AltitudeRestrictionType::Below)
diffAlt = min(diffAlt, -1);
double fpm = FMC::perf->GetClimbRate(lastAlt, lastSpeed, weight);
{
double fpmMax = 0;
double groundHeight = 0;
if(tl->usage == ObjectUsage::Origin || tl->usage == ObjectUsage::DepartureLeg)
groundHeight = depApt.GetID() != -1 ? depApt.elevation : 0;
else if (tl->usage == ObjectUsage::Destination || tl->usage == ObjectUsage::ArrivalLeg || tl->usage == ObjectUsage::ApproachLeg)
groundHeight = arrApt.GetID() != -1 ? arrApt.elevation : 0;
double altAgl = tl->altRestr - groundHeight;
if (altAgl < 150)
fpmMax = 400;
else if (altAgl < 300)
fpmMax = 800;
else if (altAgl < 1000)
fpmMax = 1000;
else if (altAgl < 1500)
fpmMax = 1500;
if (fpmMax > 0)
fpm = min(fpm, fpmMax);
}
double minutes = fabs(diffAlt / fpm);
double dist = ((minutes / 60.0) * lastSpeed) + minDist;
tl->latlon = startLatLon.Dest(dist, angle);
tl->isFlyover = true; //is this right? aren't all of these automatically overfly?
break;
}
case TrackCode::HeadingToDMEDistance:
case TrackCode::CourseToDMEDistance:
{
if (i > 0) //needs to account for DISCOs, etc.
{
//DME distance is usually slant range - account for altitude in this?
LLPoint intcpt1;
LLPoint intcpt2;
std::shared_ptr<NavDataObj> ll = legs[i - 1];
LatitudeLongitude startPoint = ll->GetLatitudeLongitude();
double desCourse = tl->course;
double alt = tl->GetPredictedAltitude();
if (alt == ALT_INVALID)
alt = tl->altRestrLower;
if (alt == ALT_INVALID)
alt = tl->altRestr;
double wptHeight = tl->nvd.GetID() != -1 ? tl->nvd.elevation : 0;
double vertDist = alt != ALT_INVALID ? fabs(alt - wptHeight) : 0;
double groundDist = slantRangeToGroundDist(tl->distance, vertDist);
groundDist = CLAMP(groundDist, (tl->distance * 0.5), (tl->distance * 1.5));
//the heading one should _technically_ account for wind drift here
if (ll->GetLatitudeLongitude().Dist(tl->destLatlon) <= groundDist)
{
startPoint = ll->GetLatitudeLongitude().Dest(groundDist * 3.0, modAngle(tl->course + ll->GetLatitudeLongitude().GetMagVar()));
desCourse = modAngle(desCourse - 180.0);
}
if (GeodesicArcIntercept(startPoint, DEGTORAD(modAngle(desCourse + startPoint.GetMagVar())), tl->destLatlon, NmToMeters(groundDist), intcpt1, intcpt2, dTol) > 0)
{
bool intcpt1valid = fabs(diffAngle(startPoint.BearingTo(intcpt1), desCourse)) < 90.0;
bool intcpt2valid = fabs(diffAngle(startPoint.BearingTo(intcpt2), desCourse)) < 90.0;
if (intcpt1valid == true && intcpt2valid == false)
tl->latlon = intcpt1;
else if (intcpt1valid == false && intcpt2valid == true)
tl->latlon = intcpt2;
else
{
if (startPoint.Dist(intcpt1) < startPoint.Dist(intcpt2))
tl->latlon = intcpt1;
else
tl->latlon = intcpt2;
}
}
else
tl->latlon = tl->destLatlon;
}
else
tl->latlon = tl->destLatlon;
tl->isFlyover = true;
break;
}
case TrackCode::HoldAtFix:
case TrackCode::HoldUntilManualTermination:
case TrackCode::HoldToAltitude:
{
if (tl->hold.type == HoldType::Database)
{
tl->hold.holdDir = tl->turn_dir == ObjectTurnDirection::Left ? TurnDirection::Left : TurnDirection::Right;
tl->hold.holdDist = tl->distance != -1.0 ? tl->distance : tl->distToDest; //is this right?
tl->hold.holdDistManual = tl->hold.holdDist != -1;
tl->hold.holdInboundCourse = tl->course;
tl->hold.defaultCourse = tl->course;
tl->hold.wptIdent = i > 0 ? legs[i-1]->GetIdentifier() : L"";
}
break;
}
case TrackCode::HeadingUntilManualTermination:
{
LatitudeLongitude lastlatLon;
for (int lastLeg = this->GetPreviousFlyableLeg((int)i, legs); lastLeg != -1; lastLeg = this->GetPreviousFlyableLeg((int)lastLeg, legs))
{
lastlatLon = legs[lastLeg]->GetLatitudeLongitude();
break;
}
tl->latlon = lastlatLon.Dest(1000, modAngle(tl->course + lastlatLon.GetMagVar()));
break;
}
case TrackCode::CourseToNextIntercept: //is this right?
case TrackCode::HeadingToNextLegIntercept:
{
//TESTED WITH HEADING
bool set = false;
if (i + 1 < legs.size() && i > 0)
{
if (legs[i + 1]->GetType() == NavDataObjType::TerminalLeg)
{
std::shared_ptr<TerminalLeg> ntl = std::dynamic_pointer_cast<TerminalLeg>(legs[i + 1]);
double trueTlCourse = modAngle(tl->course + ntl->GetLatitudeLongitude().GetMagVar()); //using ntl MagVar as tl->latlon isn't set yet
LatitudeLongitude last = legs[i - 1]->GetLatitudeLongitude(); //maybe check this for special cases?
if (legs[i - 1]->isFlyover == true && legs[i - 1]->bearingFromTo != -1)
{
double diffCourse = diffAngleByDir(trueTlCourse, legs[i - 1]->bearingFromTo, (int)tl->turn_dir);
diffCourse = CLAMP(diffCourse, -180, 180);
double offset = fmc->GetTurnRadiusNM(legs[i]) * (fabs(diffCourse) / 90.0);
last = last.Dest(offset, modAngle(legs[i - 1]->bearingFromTo + CLAMP(diffCourse, -90, 90)));
}
if (ntl->track_code == TrackCode::ArcToFix)
{
LLPoint tan1, tan2;
if (PointToArcTangents(last, ntl->nvd.GetLatitudeLongitude(), NmToMeters(ntl->refLatLon.Dist(ntl->nvd.GetLatitudeLongitude())), tan1, tan2, dTol) != 0)
{
if(ntl->turn_dir == ObjectTurnDirection::Left) //this may not be the correct check
tl->latlon = tan2;
else
tl->latlon = tan1;
set = true;
}
}
else if(ntl->GetLocationType() != LocationType::Abstract && ntl->course != -1 && ntl->GetLatitudeLongitude() != LatitudeLongitude())
{
LLPoint intcpt;
double trueNtlCourse = modAngle(ntl->course + ntl->GetLatitudeLongitude().GetMagVar());
if (CrsIntersect(last, DEGTORAD(trueTlCourse), ntl->GetLatitudeLongitude(), DEGTORAD(modAngle(trueNtlCourse + 180.0)), dTol, intcpt))
tl->latlon = intcpt;
else
tl->latlon = last; //this will cause a bypass because it's the exact same location
set = true;
}
}
}
if (set == false) //sanity check to ensure it's never in the middle of the ocean
{
int lastFlyable = this->GetPreviousFlyableLeg((int)i, legs);
if (lastFlyable != -1)
tl->latlon = legs[lastFlyable]->GetLatitudeLongitude();
else
{
int nextFlyable = this->GetNextFlyableLeg((int)i, legs);
if (nextFlyable != -1)
tl->latlon = legs[nextFlyable]->GetLatitudeLongitude();
}
}
break;
}
case TrackCode::HeadingToRadialTermination:
case TrackCode::CourseToRadialTermination: //Tested and working on CourseToRadialTermination
{
//this leg does NOT do the outbound course from the previous leg, it's the outbound course from the point the plane is able to achieve tl->course
if (i + 1 < legs.size() && i > 1)
{
//needs to account for DISCOs, T/C, T/D, etc.
std::shared_ptr<NavDataObj> ll = legs[i - 1];
LatitudeLongitude startPoint = ll->GetLatitudeLongitude();
double tlCrs = modAngle(tl->course - tl->destLatlon.GetMagVar());
if (i > 2 && ll->isFlyover == true)
{
double lastBrg = legs[i - 2]->bearingFromTo;
TurnDirection dir = diffAngle(tlCrs, lastBrg) < 0 ? TurnDirection::Left : TurnDirection::Right;
double turnRad = fmc->GetTurnRadiusNM(ll);
double angleIn = modAngle(lastBrg + (dir == TurnDirection::Left ? -90 : 90));
double angleOut = modAngle(180.0 + (angleIn + diffAngle(tlCrs, lastBrg)));
LatitudeLongitude turnCenter = ll->GetLatitudeLongitude().Dest(turnRad, angleIn);
startPoint = turnCenter.Dest(turnRad, angleOut);
}
LLPoint intcpt;
if (CrsIntersect(startPoint, DEGTORAD(modAngle(tlCrs)), tl->destLatlon, DEGTORAD(tl->bearToDest), dTol, intcpt)
//&& fabs(diffAngle(last.BearingTo(intcpt), trueTlCourse)) < 90
//&& fabs(diffAngle(LatitudeLongitude(intcpt).BearingTo(ntl->GetLatitudeLongitude()), trueNtlCourse)) < 90
)
{
tl->latlon = intcpt;
}
}
break;
}
case TrackCode::ProcedureTurnToIntercept: //Test with KLBX ILS 07
if (i > 0 && i + 1 < legs.size() && legs[i -1]->GetLocationType() == LocationType::Absolute && legs[i + 1]->GetLocationType() == LocationType::Absolute)
{
double crsBetween = legs[i - 1]->GetLatitudeLongitude().BearingTo(legs[i + 1]->GetLatitudeLongitude());
tl->latlon = legs[i - 1]->GetLatitudeLongitude().Dest(tl->distance, crsBetween);
}
else
tl->latlon = tl->destLatlon; //just set to there is something
break;
case TrackCode::CourseFromFixToManualTermination:
tl->latlon = tl->wpt.GetLatitudeLongitude().Dest(1000, modAngle(tl->course + tl->wpt.GetLatitudeLongitude().GetMagVar()));
break;
case TrackCode::TrackToFix:
case TrackCode::CourseToFix:
case TrackCode::DirectToFix:
/*These are pretty standard, segment calculator processes them correctly already based on desired course*/
break;
}
}
}
}

1
Runways.json Normal file

File diff suppressed because one or more lines are too long

137
TermID_10394.json Normal file
View File

@ -0,0 +1,137 @@
[
{
"ID": 84218,
"TerminalID": 10394,
"Type": "2",
"Transition": "ALL",
"TrackCode": "CF",
"WptID": 165609,
"WptLat": 48.77185278,
"WptLon": 2.09752222,
"TurnDir": "",
"NavID": 3827,
"NavLat": 48.97466667,
"NavLon": 2.45516667,
"NavBear": 228.5,
"NavDist": 18.7,
"Course": 267,
"Distance": 4,
"Alt": "",
"Vnav": null,
"CenterID": null,
"CenterLat": null,
"CenterLon": null,
"IsFlyOver": -1,
"SpeedLimit": null,
"IsFAF": 0,
"IsMAP": 0
},
{
"ID": 84219,
"TerminalID": 10394,
"Type": "2",
"Transition": "ALL",
"TrackCode": "CF",
"WptID": 247786,
"WptLat": 48.73058333,
"WptLon": 1.8205,
"TurnDir": "",
"NavID": 3827,
"NavLat": 48.97466667,
"NavLon": 2.45516667,
"NavBear": 239,
"NavDist": 29.1,
"Course": 256,
"Distance": 11,
"Alt": "",
"Vnav": null,
"CenterID": null,
"CenterLat": null,
"CenterLon": null,
"IsFlyOver": -1,
"SpeedLimit": null,
"IsFAF": 0,
"IsMAP": 0
},
{
"ID": 84220,
"TerminalID": 10394,
"Type": "2",
"Transition": "ALL",
"TrackCode": "CF",
"WptID": 253072,
"WptLat": 48.75372222,
"WptLon": 2.10236111,
"TurnDir": "R",
"NavID": 3827,
"NavLat": 48.97466667,
"NavLon": 2.45516667,
"NavBear": 225.6,
"NavDist": 19.3,
"Course": 107,
"Distance": 11,
"Alt": "",
"Vnav": null,
"CenterID": null,
"CenterLat": null,
"CenterLon": null,
"IsFlyOver": 0,
"SpeedLimit": null,
"IsFAF": 0,
"IsMAP": 0
},
{
"ID": 84221,
"TerminalID": 10394,
"Type": "2",
"Transition": "ALL",
"TrackCode": "CR",
"WptID": null,
"WptLat": null,
"WptLon": null,
"TurnDir": "",
"NavID": 3827,
"NavLat": 48.97466667,
"NavLon": 2.45516667,
"NavBear": 137,
"NavDist": null,
"Course": 73,
"Distance": null,
"Alt": "",
"Vnav": null,
"CenterID": null,
"CenterLat": null,
"CenterLon": null,
"IsFlyOver": 0,
"SpeedLimit": null,
"IsFAF": 0,
"IsMAP": 0
},
{
"ID": 84222,
"TerminalID": 10394,
"Type": "2",
"Transition": "ALL",
"TrackCode": "VM",
"WptID": null,
"WptLat": null,
"WptLon": null,
"TurnDir": "",
"NavID": null,
"NavLat": null,
"NavLon": null,
"NavBear": null,
"NavDist": null,
"Course": 73,
"Distance": null,
"Alt": "",
"Vnav": null,
"CenterID": null,
"CenterLat": null,
"CenterLon": null,
"IsFlyOver": 0,
"SpeedLimit": null,
"IsFAF": 0,
"IsMAP": 0
}
]

110
TermID_10395.json Normal file
View File

@ -0,0 +1,110 @@
[
{
"ID": 84223,
"TerminalID": 10395,
"Type": "2",
"Transition": "ALL",
"TrackCode": "CF",
"WptID": 165609,
"WptLat": 48.77185278,
"WptLon": 2.09752222,
"TurnDir": "",
"NavID": 3827,
"NavLat": 48.97466667,
"NavLon": 2.45516667,
"NavBear": 228.5,
"NavDist": 18.7,
"Course": 267,
"Distance": 4,
"Alt": "",
"Vnav": null,
"CenterID": null,
"CenterLat": null,
"CenterLon": null,
"IsFlyOver": -1,
"SpeedLimit": null,
"IsFAF": 0,
"IsMAP": 0
},
{
"ID": 84224,
"TerminalID": 10395,
"Type": "2",
"Transition": "ALL",
"TrackCode": "CF",
"WptID": 165604,
"WptLat": 48.80511389,
"WptLon": 2.01279722,
"TurnDir": "",
"NavID": 3827,
"NavLat": 48.97466667,
"NavLon": 2.45516667,
"NavBear": 239,
"NavDist": 20.3,
"Course": 310,
"Distance": 3,
"Alt": "",
"Vnav": null,
"CenterID": null,
"CenterLat": null,
"CenterLon": null,
"IsFlyOver": -1,
"SpeedLimit": null,
"IsFAF": 0,
"IsMAP": 0
},
{
"ID": 84225,
"TerminalID": 10395,
"Type": "2",
"Transition": "ALL",
"TrackCode": "CI",
"WptID": null,
"WptLat": null,
"WptLon": null,
"TurnDir": "",
"NavID": null,
"NavLat": null,
"NavLon": null,
"NavBear": null,
"NavDist": null,
"Course": 22,
"Distance": null,
"Alt": "",
"Vnav": null,
"CenterID": null,
"CenterLat": null,
"CenterLon": null,
"IsFlyOver": 0,
"SpeedLimit": null,
"IsFAF": 0,
"IsMAP": 0
},
{
"ID": 84226,
"TerminalID": 10395,
"Type": "2",
"Transition": "ALL",
"TrackCode": "FM",
"WptID": 165605,
"WptLat": 48.83954444,
"WptLon": 1.95262222,
"TurnDir": "",
"NavID": 3827,
"NavLat": 48.97466667,
"NavLon": 2.45516667,
"NavBear": 247,
"NavDist": 21.5,
"Course": 67,
"Distance": null,
"Alt": "",
"Vnav": null,
"CenterID": null,
"CenterLat": null,
"CenterLon": null,
"IsFlyOver": 0,
"SpeedLimit": null,
"IsFAF": 0,
"IsMAP": 0
}
]

83
TermID_10475.json Normal file
View File

@ -0,0 +1,83 @@
[
{
"ID": 84536,
"TerminalID": 10475,
"Type": "2",
"Transition": "ALL",
"TrackCode": "VA",
"WptID": null,
"WptLat": null,
"WptLon": null,
"TurnDir": "",
"NavID": null,
"NavLat": null,
"NavLon": null,
"NavBear": null,
"NavDist": null,
"Course": 125,
"Distance": null,
"Alt": "00660A",
"Vnav": null,
"CenterID": null,
"CenterLat": null,
"CenterLon": null,
"IsFlyOver": 0,
"SpeedLimit": null,
"IsFAF": 0,
"IsMAP": 0
},
{
"ID": 84537,
"TerminalID": 10475,
"Type": "2",
"Transition": "ALL",
"TrackCode": "CF",
"WptID": 247774,
"WptLat": 49.11566667,
"WptLon": -0.32125,
"TurnDir": "",
"NavID": 3836,
"NavLat": 49.17319444,
"NavLon": -0.45527778,
"NavBear": 123.1,
"NavDist": 6.3,
"Course": 125,
"Distance": 6,
"Alt": "",
"Vnav": null,
"CenterID": null,
"CenterLat": null,
"CenterLon": null,
"IsFlyOver": 0,
"SpeedLimit": null,
"IsFAF": 0,
"IsMAP": 0
},
{
"ID": 84538,
"TerminalID": 10475,
"Type": "2",
"Transition": "ALL",
"TrackCode": "TF",
"WptID": 252987,
"WptLat": 48.79061111,
"WptLon": 0.53027778,
"TurnDir": "",
"NavID": null,
"NavLat": null,
"NavLon": null,
"NavBear": null,
"NavDist": null,
"Course": null,
"Distance": null,
"Alt": "",
"Vnav": null,
"CenterID": null,
"CenterLat": null,
"CenterLon": null,
"IsFlyOver": 0,
"SpeedLimit": null,
"IsFAF": 0,
"IsMAP": 0
}
]

83
TermID_10480.json Normal file
View File

@ -0,0 +1,83 @@
[
{
"ID": 84551,
"TerminalID": 10480,
"Type": "2",
"Transition": "ALL",
"TrackCode": "VD",
"WptID": null,
"WptLat": null,
"WptLon": null,
"TurnDir": "",
"NavID": 3851,
"NavLat": 49.17333333,
"NavLon": -0.44711111,
"NavBear": null,
"NavDist": null,
"Course": 305,
"Distance": 5,
"Alt": "",
"Vnav": null,
"CenterID": null,
"CenterLat": null,
"CenterLon": null,
"IsFlyOver": 0,
"SpeedLimit": null,
"IsFAF": 0,
"IsMAP": 0
},
{
"ID": 84552,
"TerminalID": 10480,
"Type": "2",
"Transition": "ALL",
"TrackCode": "VI",
"WptID": null,
"WptLat": null,
"WptLon": null,
"TurnDir": "",
"NavID": null,
"NavLat": null,
"NavLon": null,
"NavBear": null,
"NavDist": null,
"Course": 243,
"Distance": null,
"Alt": "",
"Vnav": null,
"CenterID": null,
"CenterLat": null,
"CenterLon": null,
"IsFlyOver": 0,
"SpeedLimit": null,
"IsFAF": 0,
"IsMAP": 0
},
{
"ID": 84553,
"TerminalID": 10480,
"Type": "2",
"Transition": "ALL",
"TrackCode": "CF",
"WptID": 40633,
"WptLat": 49.21472222,
"WptLon": -1.79555556,
"TurnDir": "",
"NavID": 3836,
"NavLat": 49.17319444,
"NavLon": -0.45527778,
"NavBear": 273.2,
"NavDist": 52.8,
"Course": 273,
"Distance": 44,
"Alt": "",
"Vnav": null,
"CenterID": null,
"CenterLat": null,
"CenterLon": null,
"IsFlyOver": 0,
"SpeedLimit": null,
"IsFAF": 0,
"IsMAP": 0
}
]

83
TermID_10482.json Normal file
View File

@ -0,0 +1,83 @@
[
{
"ID": 84557,
"TerminalID": 10482,
"Type": "2",
"Transition": "ALL",
"TrackCode": "VD",
"WptID": null,
"WptLat": null,
"WptLon": null,
"TurnDir": "",
"NavID": 3851,
"NavLat": 49.17333333,
"NavLon": -0.44711111,
"NavBear": null,
"NavDist": null,
"Course": 305,
"Distance": 5,
"Alt": "",
"Vnav": null,
"CenterID": null,
"CenterLat": null,
"CenterLon": null,
"IsFlyOver": 0,
"SpeedLimit": null,
"IsFAF": 0,
"IsMAP": 0
},
{
"ID": 84558,
"TerminalID": 10482,
"Type": "2",
"Transition": "ALL",
"TrackCode": "CI",
"WptID": null,
"WptLat": null,
"WptLon": null,
"TurnDir": "R",
"NavID": null,
"NavLat": null,
"NavLon": null,
"NavBear": null,
"NavDist": null,
"Course": 50,
"Distance": null,
"Alt": "",
"Vnav": null,
"CenterID": null,
"CenterLat": null,
"CenterLon": null,
"IsFlyOver": 0,
"SpeedLimit": null,
"IsFAF": 0,
"IsMAP": 0
},
{
"ID": 84559,
"TerminalID": 10482,
"Type": "2",
"Transition": "ALL",
"TrackCode": "CF",
"WptID": 8516,
"WptLat": 50,
"WptLon": -0.36823333,
"TurnDir": "",
"NavID": 3836,
"NavLat": 49.17319444,
"NavLon": -0.45527778,
"NavBear": 3.9,
"NavDist": 49.8,
"Course": 4,
"Distance": 42,
"Alt": "",
"Vnav": null,
"CenterID": null,
"CenterLat": null,
"CenterLon": null,
"IsFlyOver": 0,
"SpeedLimit": null,
"IsFAF": 0,
"IsMAP": 0
}
]

110
TermID_10485.json Normal file
View File

@ -0,0 +1,110 @@
[
{
"ID": 84567,
"TerminalID": 10485,
"Type": "5",
"Transition": "ALL",
"TrackCode": "CF",
"WptID": 166062,
"WptLat": 48.06525,
"WptLon": -1.67930556,
"TurnDir": "",
"NavID": 3946,
"NavLat": 48.06925,
"NavLon": -1.74166667,
"NavBear": 95.4,
"NavDist": 2.5,
"Course": 101,
"Distance": 2,
"Alt": "00530A",
"Vnav": null,
"CenterID": null,
"CenterLat": null,
"CenterLon": null,
"IsFlyOver": 0,
"SpeedLimit": 195,
"IsFAF": 0,
"IsMAP": 0
},
{
"ID": 84568,
"TerminalID": 10485,
"Type": "5",
"Transition": "ALL",
"TrackCode": "RF",
"WptID": 166064,
"WptLat": 48.03483333,
"WptLon": -1.63894444,
"TurnDir": "R",
"NavID": null,
"NavLat": null,
"NavLon": null,
"NavBear": null,
"NavDist": null,
"Course": 175.3,
"Distance": 2.6,
"Alt": "",
"Vnav": null,
"CenterID": 166063,
"CenterLat": 48.03252778,
"CenterLon": -1.6885,
"IsFlyOver": 0,
"SpeedLimit": 195,
"IsFAF": 0,
"IsMAP": 0
},
{
"ID": 84569,
"TerminalID": 10485,
"Type": "5",
"Transition": "ALL",
"TrackCode": "TF",
"WptID": 166061,
"WptLat": 47.91030556,
"WptLon": -1.62611111,
"TurnDir": "",
"NavID": null,
"NavLat": null,
"NavLon": null,
"NavBear": null,
"NavDist": null,
"Course": null,
"Distance": null,
"Alt": "",
"Vnav": null,
"CenterID": null,
"CenterLat": null,
"CenterLon": null,
"IsFlyOver": 0,
"SpeedLimit": null,
"IsFAF": 0,
"IsMAP": 0
},
{
"ID": 84570,
"TerminalID": 10485,
"Type": "5",
"Transition": "ALL",
"TrackCode": "TF",
"WptID": 40368,
"WptLat": 47.64194444,
"WptLon": -1.96,
"TurnDir": "",
"NavID": null,
"NavLat": null,
"NavLon": null,
"NavBear": null,
"NavDist": null,
"Course": null,
"Distance": null,
"Alt": "",
"Vnav": null,
"CenterID": null,
"CenterLat": null,
"CenterLon": null,
"IsFlyOver": 0,
"SpeedLimit": null,
"IsFAF": 0,
"IsMAP": 0
}
]

110
TermID_10653.json Normal file
View File

@ -0,0 +1,110 @@
[
{
"ID": 85228,
"TerminalID": 10653,
"Type": "2",
"Transition": "ALL",
"TrackCode": "CF",
"WptID": 166553,
"WptLat": 38.04930556,
"WptLon": 24.04694722,
"TurnDir": "",
"NavID": 3985,
"NavLat": 37.88867778,
"NavLon": 23.80449722,
"NavBear": 45,
"NavDist": 15,
"Course": 32,
"Distance": 9,
"Alt": "",
"Vnav": null,
"CenterID": null,
"CenterLat": null,
"CenterLon": null,
"IsFlyOver": 0,
"SpeedLimit": null,
"IsFAF": 0,
"IsMAP": 0
},
{
"ID": 85229,
"TerminalID": 10653,
"Type": "2",
"Transition": "ALL",
"TrackCode": "AF",
"WptID": 166645,
"WptLat": 37.75945833,
"WptLon": 24.07472778,
"TurnDir": "R",
"NavID": 3985,
"NavLat": 37.88867778,
"NavLon": 23.80449722,
"NavBear": 116,
"NavDist": 15,
"Course": 45,
"Distance": null,
"Alt": "",
"Vnav": null,
"CenterID": null,
"CenterLat": null,
"CenterLon": null,
"IsFlyOver": -1,
"SpeedLimit": null,
"IsFAF": 0,
"IsMAP": 0
},
{
"ID": 85230,
"TerminalID": 10653,
"Type": "2",
"Transition": "ALL",
"TrackCode": "AF",
"WptID": 166646,
"WptLat": 37.73090833,
"WptLon": 24.04940556,
"TurnDir": "R",
"NavID": 3985,
"NavLat": 37.88867778,
"NavLon": 23.80449722,
"NavBear": 124,
"NavDist": 15,
"Course": 116,
"Distance": null,
"Alt": "",
"Vnav": null,
"CenterID": null,
"CenterLat": null,
"CenterLon": null,
"IsFlyOver": 0,
"SpeedLimit": 220,
"IsFAF": 0,
"IsMAP": 0
},
{
"ID": 85231,
"TerminalID": 10653,
"Type": "2",
"Transition": "ALL",
"TrackCode": "TF",
"WptID": 166620,
"WptLat": 37.20805556,
"WptLon": 24.83444444,
"TurnDir": "",
"NavID": null,
"NavLat": null,
"NavLon": null,
"NavBear": null,
"NavDist": null,
"Course": null,
"Distance": null,
"Alt": "",
"Vnav": null,
"CenterID": null,
"CenterLat": null,
"CenterLon": null,
"IsFlyOver": 0,
"SpeedLimit": null,
"IsFAF": 0,
"IsMAP": 0
}
]

164
TermID_10654.json Normal file
View File

@ -0,0 +1,164 @@
[
{
"ID": 85232,
"TerminalID": 10654,
"Type": "2",
"Transition": "ALL",
"TrackCode": "CA",
"WptID": null,
"WptLat": null,
"WptLon": null,
"TurnDir": "",
"NavID": null,
"NavLat": null,
"NavLon": null,
"NavBear": null,
"NavDist": null,
"Course": 32,
"Distance": null,
"Alt": "00710A",
"Vnav": null,
"CenterID": null,
"CenterLat": null,
"CenterLon": null,
"IsFlyOver": 0,
"SpeedLimit": null,
"IsFAF": 0,
"IsMAP": 0
},
{
"ID": 85233,
"TerminalID": 10654,
"Type": "2",
"Transition": "ALL",
"TrackCode": "CF",
"WptID": 166631,
"WptLat": 38.07855556,
"WptLon": 24.06305,
"TurnDir": "",
"NavID": 4032,
"NavLat": 37.91683889,
"NavLon": 23.91443889,
"NavBear": 31,
"NavDist": 12,
"Course": 31,
"Distance": 10,
"Alt": "",
"Vnav": null,
"CenterID": null,
"CenterLat": null,
"CenterLon": null,
"IsFlyOver": 0,
"SpeedLimit": null,
"IsFAF": 0,
"IsMAP": 0
},
{
"ID": 85234,
"TerminalID": 10654,
"Type": "2",
"Transition": "ALL",
"TrackCode": "CI",
"WptID": null,
"WptLat": null,
"WptLon": null,
"TurnDir": "",
"NavID": null,
"NavLat": null,
"NavLon": null,
"NavBear": null,
"NavDist": null,
"Course": 31,
"Distance": null,
"Alt": "04000A",
"Vnav": null,
"CenterID": null,
"CenterLat": null,
"CenterLon": null,
"IsFlyOver": 0,
"SpeedLimit": 210,
"IsFAF": 0,
"IsMAP": 0
},
{
"ID": 85235,
"TerminalID": 10654,
"Type": "2",
"Transition": "ALL",
"TrackCode": "CF",
"WptID": 166663,
"WptLat": 38.04289167,
"WptLon": 24.31536944,
"TurnDir": "",
"NavID": 4015,
"NavLat": 37.99413889,
"NavLon": 24.49490833,
"NavBear": 284,
"NavDist": 9,
"Course": 104,
"Distance": 11,
"Alt": "07000A",
"Vnav": null,
"CenterID": null,
"CenterLat": null,
"CenterLon": null,
"IsFlyOver": -1,
"SpeedLimit": null,
"IsFAF": 0,
"IsMAP": 0
},
{
"ID": 85236,
"TerminalID": 10654,
"Type": "2",
"Transition": "ALL",
"TrackCode": "DF",
"WptID": 253105,
"WptLat": 37.55716389,
"WptLon": 24.2987,
"TurnDir": "",
"NavID": null,
"NavLat": null,
"NavLon": null,
"NavBear": null,
"NavDist": null,
"Course": null,
"Distance": null,
"Alt": "24000B",
"Vnav": null,
"CenterID": null,
"CenterLat": null,
"CenterLon": null,
"IsFlyOver": 0,
"SpeedLimit": null,
"IsFAF": 0,
"IsMAP": 0
},
{
"ID": 85237,
"TerminalID": 10654,
"Type": "2",
"Transition": "ALL",
"TrackCode": "TF",
"WptID": 166620,
"WptLat": 37.20805556,
"WptLon": 24.83444444,
"TurnDir": "",
"NavID": null,
"NavLat": null,
"NavLon": null,
"NavBear": null,
"NavDist": null,
"Course": null,
"Distance": null,
"Alt": "",
"Vnav": null,
"CenterID": null,
"CenterLat": null,
"CenterLon": null,
"IsFlyOver": 0,
"SpeedLimit": null,
"IsFAF": 0,
"IsMAP": 0
}
]

137
TermID_10657.json Normal file
View File

@ -0,0 +1,137 @@
[
{
"ID": 85247,
"TerminalID": 10657,
"Type": "2",
"Transition": "ALL",
"TrackCode": "CF",
"WptID": 253138,
"WptLat": 37.91801944,
"WptLon": 23.93798333,
"TurnDir": "",
"NavID": 4040,
"NavLat": 37.91801944,
"NavLon": 23.93798333,
"NavBear": 0,
"NavDist": 0,
"Course": 212,
"Distance": 2,
"Alt": "00700A",
"Vnav": null,
"CenterID": null,
"CenterLat": null,
"CenterLon": null,
"IsFlyOver": 0,
"SpeedLimit": null,
"IsFAF": 0,
"IsMAP": 0
},
{
"ID": 85248,
"TerminalID": 10657,
"Type": "2",
"Transition": "ALL",
"TrackCode": "FA",
"WptID": 253138,
"WptLat": 37.91801944,
"WptLon": 23.93798333,
"TurnDir": "",
"NavID": 4040,
"NavLat": 37.91801944,
"NavLon": 23.93798333,
"NavBear": 0,
"NavDist": 0,
"Course": 203,
"Distance": null,
"Alt": "04000A",
"Vnav": null,
"CenterID": null,
"CenterLat": null,
"CenterLon": null,
"IsFlyOver": 0,
"SpeedLimit": null,
"IsFAF": 0,
"IsMAP": 0
},
{
"ID": 85249,
"TerminalID": 10657,
"Type": "2",
"Transition": "ALL",
"TrackCode": "CD",
"WptID": null,
"WptLat": null,
"WptLon": null,
"TurnDir": "",
"NavID": 4007,
"NavLat": 37.55716389,
"NavLon": 24.2987,
"NavBear": null,
"NavDist": null,
"Course": 123,
"Distance": 17,
"Alt": "06000A",
"Vnav": null,
"CenterID": null,
"CenterLat": null,
"CenterLon": null,
"IsFlyOver": 0,
"SpeedLimit": 210,
"IsFAF": 0,
"IsMAP": 0
},
{
"ID": 85250,
"TerminalID": 10657,
"Type": "2",
"Transition": "ALL",
"TrackCode": "DF",
"WptID": 253105,
"WptLat": 37.55716389,
"WptLon": 24.2987,
"TurnDir": "",
"NavID": null,
"NavLat": null,
"NavLon": null,
"NavBear": null,
"NavDist": null,
"Course": null,
"Distance": null,
"Alt": "24000B",
"Vnav": null,
"CenterID": null,
"CenterLat": null,
"CenterLon": null,
"IsFlyOver": 0,
"SpeedLimit": null,
"IsFAF": 0,
"IsMAP": 0
},
{
"ID": 85251,
"TerminalID": 10657,
"Type": "2",
"Transition": "ALL",
"TrackCode": "TF",
"WptID": 166620,
"WptLat": 37.20805556,
"WptLon": 24.83444444,
"TurnDir": "",
"NavID": null,
"NavLat": null,
"NavLon": null,
"NavBear": null,
"NavDist": null,
"Course": null,
"Distance": null,
"Alt": "",
"Vnav": null,
"CenterID": null,
"CenterLat": null,
"CenterLon": null,
"IsFlyOver": 0,
"SpeedLimit": null,
"IsFAF": 0,
"IsMAP": 0
}
]

110
TermID_10659.json Normal file
View File

@ -0,0 +1,110 @@
[
{
"ID": 85257,
"TerminalID": 10659,
"Type": "2",
"Transition": "ALL",
"TrackCode": "CA",
"WptID": null,
"WptLat": null,
"WptLon": null,
"TurnDir": "",
"NavID": null,
"NavLat": null,
"NavLon": null,
"NavBear": null,
"NavDist": null,
"Course": 32,
"Distance": null,
"Alt": "00710A",
"Vnav": null,
"CenterID": null,
"CenterLat": null,
"CenterLon": null,
"IsFlyOver": 0,
"SpeedLimit": null,
"IsFAF": 0,
"IsMAP": 0
},
{
"ID": 85258,
"TerminalID": 10659,
"Type": "2",
"Transition": "ALL",
"TrackCode": "FD",
"WptID": 253138,
"WptLat": 37.91801944,
"WptLon": 23.93798333,
"TurnDir": "",
"NavID": 4040,
"NavLat": 37.91801944,
"NavLon": 23.93798333,
"NavBear": 0,
"NavDist": 0,
"Course": 32,
"Distance": 12,
"Alt": "",
"Vnav": null,
"CenterID": null,
"CenterLat": null,
"CenterLon": null,
"IsFlyOver": 0,
"SpeedLimit": null,
"IsFAF": 0,
"IsMAP": 0
},
{
"ID": 85259,
"TerminalID": 10659,
"Type": "2",
"Transition": "ALL",
"TrackCode": "DF",
"WptID": 253105,
"WptLat": 37.55716389,
"WptLon": 24.2987,
"TurnDir": "R",
"NavID": null,
"NavLat": null,
"NavLon": null,
"NavBear": null,
"NavDist": null,
"Course": null,
"Distance": null,
"Alt": "24000B06000A",
"Vnav": null,
"CenterID": null,
"CenterLat": null,
"CenterLon": null,
"IsFlyOver": 0,
"SpeedLimit": 210,
"IsFAF": 0,
"IsMAP": 0
},
{
"ID": 85260,
"TerminalID": 10659,
"Type": "2",
"Transition": "ALL",
"TrackCode": "TF",
"WptID": 166620,
"WptLat": 37.20805556,
"WptLon": 24.83444444,
"TurnDir": "",
"NavID": null,
"NavLat": null,
"NavLon": null,
"NavBear": null,
"NavDist": null,
"Course": null,
"Distance": null,
"Alt": "",
"Vnav": null,
"CenterID": null,
"CenterLat": null,
"CenterLon": null,
"IsFlyOver": 0,
"SpeedLimit": null,
"IsFAF": 0,
"IsMAP": 0
}
]

110
TermID_10679.json Normal file
View File

@ -0,0 +1,110 @@
[
{
"ID": 85331,
"TerminalID": 10679,
"Type": "2",
"Transition": "ALL",
"TrackCode": "CA",
"WptID": null,
"WptLat": null,
"WptLon": null,
"TurnDir": "",
"NavID": null,
"NavLat": null,
"NavLon": null,
"NavBear": null,
"NavDist": null,
"Course": 32,
"Distance": null,
"Alt": "00710A",
"Vnav": null,
"CenterID": null,
"CenterLat": null,
"CenterLon": null,
"IsFlyOver": 0,
"SpeedLimit": null,
"IsFAF": 0,
"IsMAP": 0
},
{
"ID": 85332,
"TerminalID": 10679,
"Type": "2",
"Transition": "ALL",
"TrackCode": "CF",
"WptID": 166630,
"WptLat": 38.06507222,
"WptLon": 24.05061944,
"TurnDir": "",
"NavID": 4032,
"NavLat": 37.91683889,
"NavLon": 23.91443889,
"NavBear": 31,
"NavDist": 11,
"Course": 31,
"Distance": 10,
"Alt": "",
"Vnav": null,
"CenterID": null,
"CenterLat": null,
"CenterLon": null,
"IsFlyOver": -1,
"SpeedLimit": null,
"IsFAF": 0,
"IsMAP": 0
},
{
"ID": 85333,
"TerminalID": 10679,
"Type": "2",
"Transition": "ALL",
"TrackCode": "CR",
"WptID": null,
"WptLat": null,
"WptLon": null,
"TurnDir": "L",
"NavID": 3985,
"NavLat": 37.88867778,
"NavLon": 23.80449722,
"NavBear": 25,
"NavDist": null,
"Course": 253,
"Distance": null,
"Alt": "06000A",
"Vnav": null,
"CenterID": null,
"CenterLat": null,
"CenterLon": null,
"IsFlyOver": 0,
"SpeedLimit": 240,
"IsFAF": 0,
"IsMAP": 0
},
{
"ID": 85334,
"TerminalID": 10679,
"Type": "2",
"Transition": "ALL",
"TrackCode": "DF",
"WptID": 247838,
"WptLat": 37.93041111,
"WptLon": 22.9359,
"TurnDir": "",
"NavID": null,
"NavLat": null,
"NavLon": null,
"NavBear": null,
"NavDist": null,
"Course": null,
"Distance": null,
"Alt": "",
"Vnav": null,
"CenterID": null,
"CenterLat": null,
"CenterLon": null,
"IsFlyOver": 0,
"SpeedLimit": null,
"IsFAF": 0,
"IsMAP": 0
}
]

218
TermID_11798.json Normal file
View File

@ -0,0 +1,218 @@
[
{
"ID": 90645,
"TerminalID": 11798,
"Type": "1",
"Transition": "RW34L",
"TrackCode": "DF",
"WptID": 169637,
"WptLat": 39.36545,
"WptLon": 8.96781667,
"TurnDir": "",
"NavID": null,
"NavLat": null,
"NavLon": null,
"NavBear": null,
"NavDist": null,
"Course": null,
"Distance": null,
"Alt": "",
"Vnav": null,
"CenterID": null,
"CenterLat": null,
"CenterLon": null,
"IsFlyOver": 0,
"SpeedLimit": null,
"IsFAF": 0,
"IsMAP": 0
},
{
"ID": 90646,
"TerminalID": 11798,
"Type": "1",
"Transition": "RW34L",
"TrackCode": "FC",
"WptID": 169637,
"WptLat": 39.36545,
"WptLon": 8.96781667,
"TurnDir": "",
"NavID": 4103,
"NavLat": 39.38108333,
"NavLon": 8.96566667,
"NavBear": 170.9,
"NavDist": 0.9,
"Course": 344,
"Distance": 12,
"Alt": "05000A",
"Vnav": null,
"CenterID": null,
"CenterLat": null,
"CenterLon": null,
"IsFlyOver": -1,
"SpeedLimit": null,
"IsFAF": 0,
"IsMAP": 0
},
{
"ID": 90647,
"TerminalID": 11798,
"Type": "1",
"Transition": "RW34L",
"TrackCode": "DF",
"WptID": 247859,
"WptLat": 39.36372222,
"WptLon": 8.97402778,
"TurnDir": "L",
"NavID": null,
"NavLat": null,
"NavLon": null,
"NavBear": null,
"NavDist": null,
"Course": null,
"Distance": null,
"Alt": "",
"Vnav": null,
"CenterID": null,
"CenterLat": null,
"CenterLon": null,
"IsFlyOver": 0,
"SpeedLimit": 270,
"IsFAF": 0,
"IsMAP": 0
},
{
"ID": 90648,
"TerminalID": 11798,
"Type": "1",
"Transition": "RW34R",
"TrackCode": "DF",
"WptID": 169638,
"WptLat": 39.36699722,
"WptLon": 8.96985833,
"TurnDir": "",
"NavID": null,
"NavLat": null,
"NavLon": null,
"NavBear": null,
"NavDist": null,
"Course": null,
"Distance": null,
"Alt": "",
"Vnav": null,
"CenterID": null,
"CenterLat": null,
"CenterLon": null,
"IsFlyOver": 0,
"SpeedLimit": null,
"IsFAF": 0,
"IsMAP": 0
},
{
"ID": 90649,
"TerminalID": 11798,
"Type": "1",
"Transition": "RW34R",
"TrackCode": "FC",
"WptID": 169638,
"WptLat": 39.36699722,
"WptLon": 8.96985833,
"TurnDir": "",
"NavID": 4103,
"NavLat": 39.38108333,
"NavLon": 8.96566667,
"NavBear": 164,
"NavDist": 0.9,
"Course": 344,
"Distance": 12,
"Alt": "05000A",
"Vnav": null,
"CenterID": null,
"CenterLat": null,
"CenterLon": null,
"IsFlyOver": -1,
"SpeedLimit": null,
"IsFAF": 0,
"IsMAP": 0
},
{
"ID": 90650,
"TerminalID": 11798,
"Type": "1",
"Transition": "RW34R",
"TrackCode": "DF",
"WptID": 247859,
"WptLat": 39.36372222,
"WptLon": 8.97402778,
"TurnDir": "L",
"NavID": null,
"NavLat": null,
"NavLon": null,
"NavBear": null,
"NavDist": null,
"Course": null,
"Distance": null,
"Alt": "",
"Vnav": null,
"CenterID": null,
"CenterLat": null,
"CenterLon": null,
"IsFlyOver": 0,
"SpeedLimit": 270,
"IsFAF": 0,
"IsMAP": 0
},
{
"ID": 90651,
"TerminalID": 11798,
"Type": "2",
"Transition": "ALL",
"TrackCode": "IF",
"WptID": 247859,
"WptLat": 39.36372222,
"WptLon": 8.97402778,
"TurnDir": "",
"NavID": null,
"NavLat": null,
"NavLon": null,
"NavBear": null,
"NavDist": null,
"Course": null,
"Distance": null,
"Alt": "",
"Vnav": null,
"CenterID": null,
"CenterLat": null,
"CenterLon": null,
"IsFlyOver": 0,
"SpeedLimit": null,
"IsFAF": 0,
"IsMAP": 0
},
{
"ID": 90652,
"TerminalID": 11798,
"Type": "2",
"Transition": "ALL",
"TrackCode": "TF",
"WptID": 253189,
"WptLat": 39.11136111,
"WptLon": 9.50802778,
"TurnDir": "",
"NavID": null,
"NavLat": null,
"NavLon": null,
"NavBear": null,
"NavDist": null,
"Course": null,
"Distance": null,
"Alt": "",
"Vnav": null,
"CenterID": null,
"CenterLat": null,
"CenterLon": null,
"IsFlyOver": 0,
"SpeedLimit": null,
"IsFAF": 0,
"IsMAP": 0
}
]

623
TermID_11909.json Normal file
View File

@ -0,0 +1,623 @@
[
{
"ID": 91603,
"TerminalID": 11909,
"Type": "2",
"Transition": "ALL",
"TrackCode": "CA",
"WptID": null,
"WptLat": null,
"WptLon": null,
"TurnDir": "",
"NavID": null,
"NavLat": null,
"NavLon": null,
"NavBear": null,
"NavDist": null,
"Course": 346,
"Distance": null,
"Alt": "01170A",
"Vnav": null,
"CenterID": null,
"CenterLat": null,
"CenterLon": null,
"IsFlyOver": 0,
"SpeedLimit": null,
"IsFAF": 0,
"IsMAP": 0
},
{
"ID": 91604,
"TerminalID": 11909,
"Type": "2",
"Transition": "ALL",
"TrackCode": "CD",
"WptID": null,
"WptLat": null,
"WptLon": null,
"TurnDir": "",
"NavID": 4169,
"NavLat": 45.64077778,
"NavLon": 8.73483333,
"NavBear": null,
"NavDist": null,
"Course": 356,
"Distance": 4.1,
"Alt": "02200A",
"Vnav": null,
"CenterID": null,
"CenterLat": null,
"CenterLon": null,
"IsFlyOver": 0,
"SpeedLimit": null,
"IsFAF": 0,
"IsMAP": 0
},
{
"ID": 91605,
"TerminalID": 11909,
"Type": "2",
"Transition": "ALL",
"TrackCode": "VR",
"WptID": null,
"WptLat": null,
"WptLon": null,
"TurnDir": "",
"NavID": 4169,
"NavLat": 45.64077778,
"NavLon": 8.73483333,
"NavBear": 9,
"NavDist": null,
"Course": 41,
"Distance": null,
"Alt": "03000A",
"Vnav": null,
"CenterID": null,
"CenterLat": null,
"CenterLon": null,
"IsFlyOver": 0,
"SpeedLimit": 220,
"IsFAF": 0,
"IsMAP": 0
},
{
"ID": 91606,
"TerminalID": 11909,
"Type": "2",
"Transition": "ALL",
"TrackCode": "CF",
"WptID": 169914,
"WptLat": 45.72388889,
"WptLon": 8.86777778,
"TurnDir": "R",
"NavID": 4204,
"NavLat": 45.64597222,
"NavLon": 9.02158333,
"NavBear": 302.9,
"NavDist": 8,
"Course": 123,
"Distance": 2,
"Alt": "",
"Vnav": null,
"CenterID": null,
"CenterLat": null,
"CenterLon": null,
"IsFlyOver": -1,
"SpeedLimit": null,
"IsFAF": 0,
"IsMAP": 0
},
{
"ID": 91607,
"TerminalID": 11909,
"Type": "2",
"Transition": "ALL",
"TrackCode": "CA",
"WptID": null,
"WptLat": null,
"WptLon": null,
"TurnDir": "",
"NavID": null,
"NavLat": null,
"NavLon": null,
"NavBear": null,
"NavDist": null,
"Course": 173,
"Distance": null,
"Alt": "04000A",
"Vnav": null,
"CenterID": null,
"CenterLat": null,
"CenterLon": null,
"IsFlyOver": 0,
"SpeedLimit": 230,
"IsFAF": 0,
"IsMAP": 0
},
{
"ID": 91608,
"TerminalID": 11909,
"Type": "2",
"Transition": "ALL",
"TrackCode": "CF",
"WptID": 253267,
"WptLat": 45.64077778,
"WptLon": 8.73483333,
"TurnDir": "R",
"NavID": 4204,
"NavLat": 45.64597222,
"NavLon": 9.02158333,
"NavBear": 265.6,
"NavDist": 12.1,
"Course": 266,
"Distance": 5,
"Alt": "",
"Vnav": null,
"CenterID": null,
"CenterLat": null,
"CenterLon": null,
"IsFlyOver": 0,
"SpeedLimit": 230,
"IsFAF": 0,
"IsMAP": 0
},
{
"ID": 91609,
"TerminalID": 11909,
"Type": "3",
"Transition": "AOS5X",
"TrackCode": "IF",
"WptID": 253267,
"WptLat": 45.64077778,
"WptLon": 8.73483333,
"TurnDir": "",
"NavID": null,
"NavLat": null,
"NavLon": null,
"NavBear": null,
"NavDist": null,
"Course": null,
"Distance": null,
"Alt": "",
"Vnav": null,
"CenterID": null,
"CenterLat": null,
"CenterLon": null,
"IsFlyOver": 0,
"SpeedLimit": null,
"IsFAF": 0,
"IsMAP": 0
},
{
"ID": 91610,
"TerminalID": 11909,
"Type": "3",
"Transition": "AOS5X",
"TrackCode": "TF",
"WptID": 169921,
"WptLat": 45.57482778,
"WptLon": 8.31563056,
"TurnDir": "",
"NavID": null,
"NavLat": null,
"NavLon": null,
"NavBear": null,
"NavDist": null,
"Course": null,
"Distance": null,
"Alt": "",
"Vnav": null,
"CenterID": null,
"CenterLat": null,
"CenterLon": null,
"IsFlyOver": 0,
"SpeedLimit": null,
"IsFAF": 0,
"IsMAP": 0
},
{
"ID": 91611,
"TerminalID": 11909,
"Type": "3",
"Transition": "AOS5X",
"TrackCode": "TF",
"WptID": 169922,
"WptLat": 45.59140556,
"WptLon": 8.24456111,
"TurnDir": "",
"NavID": null,
"NavLat": null,
"NavLon": null,
"NavBear": null,
"NavDist": null,
"Course": null,
"Distance": null,
"Alt": "13500A",
"Vnav": null,
"CenterID": null,
"CenterLat": null,
"CenterLon": null,
"IsFlyOver": 0,
"SpeedLimit": null,
"IsFAF": 0,
"IsMAP": 0
},
{
"ID": 91612,
"TerminalID": 11909,
"Type": "3",
"Transition": "AOS5X",
"TrackCode": "TF",
"WptID": 169932,
"WptLat": 45.66769722,
"WptLon": 7.91445,
"TurnDir": "",
"NavID": null,
"NavLat": null,
"NavLon": null,
"NavBear": null,
"NavDist": null,
"Course": null,
"Distance": null,
"Alt": "16000A",
"Vnav": null,
"CenterID": null,
"CenterLat": null,
"CenterLon": null,
"IsFlyOver": 0,
"SpeedLimit": null,
"IsFAF": 0,
"IsMAP": 0
},
{
"ID": 91613,
"TerminalID": 11909,
"Type": "3",
"Transition": "AOS5X",
"TrackCode": "TF",
"WptID": 42141,
"WptLat": 45.79638889,
"WptLon": 7.34583333,
"TurnDir": "",
"NavID": null,
"NavLat": null,
"NavLon": null,
"NavBear": null,
"NavDist": null,
"Course": null,
"Distance": null,
"Alt": "19000A",
"Vnav": null,
"CenterID": null,
"CenterLat": null,
"CenterLon": null,
"IsFlyOver": 0,
"SpeedLimit": null,
"IsFAF": 0,
"IsMAP": 0
},
{
"ID": 91614,
"TerminalID": 11909,
"Type": "3",
"Transition": "LAG9X",
"TrackCode": "IF",
"WptID": 253267,
"WptLat": 45.64077778,
"WptLon": 8.73483333,
"TurnDir": "",
"NavID": null,
"NavLat": null,
"NavLon": null,
"NavBear": null,
"NavDist": null,
"Course": null,
"Distance": null,
"Alt": "",
"Vnav": null,
"CenterID": null,
"CenterLat": null,
"CenterLon": null,
"IsFlyOver": 0,
"SpeedLimit": null,
"IsFAF": 0,
"IsMAP": 0
},
{
"ID": 91615,
"TerminalID": 11909,
"Type": "3",
"Transition": "LAG9X",
"TrackCode": "TF",
"WptID": 42354,
"WptLat": 45.55416667,
"WptLon": 8.44916667,
"TurnDir": "",
"NavID": null,
"NavLat": null,
"NavLon": null,
"NavBear": null,
"NavDist": null,
"Course": null,
"Distance": null,
"Alt": "",
"Vnav": null,
"CenterID": null,
"CenterLat": null,
"CenterLon": null,
"IsFlyOver": 0,
"SpeedLimit": null,
"IsFAF": 0,
"IsMAP": 0
},
{
"ID": 91616,
"TerminalID": 11909,
"Type": "3",
"Transition": "LAG9X",
"TrackCode": "TF",
"WptID": 42823,
"WptLat": 45.10916667,
"WptLon": 8.22972222,
"TurnDir": "",
"NavID": null,
"NavLat": null,
"NavLon": null,
"NavBear": null,
"NavDist": null,
"Course": null,
"Distance": null,
"Alt": "",
"Vnav": null,
"CenterID": null,
"CenterLat": null,
"CenterLon": null,
"IsFlyOver": 0,
"SpeedLimit": null,
"IsFAF": 0,
"IsMAP": 0
},
{
"ID": 91617,
"TerminalID": 11909,
"Type": "3",
"Transition": "LAG9X",
"TrackCode": "TF",
"WptID": 42487,
"WptLat": 44.39416667,
"WptLon": 8.49805556,
"TurnDir": "",
"NavID": null,
"NavLat": null,
"NavLon": null,
"NavBear": null,
"NavDist": null,
"Course": null,
"Distance": null,
"Alt": "11000A",
"Vnav": null,
"CenterID": null,
"CenterLat": null,
"CenterLon": null,
"IsFlyOver": 0,
"SpeedLimit": null,
"IsFAF": 0,
"IsMAP": 0
},
{
"ID": 91618,
"TerminalID": 11909,
"Type": "3",
"Transition": "NED9X",
"TrackCode": "IF",
"WptID": 253267,
"WptLat": 45.64077778,
"WptLon": 8.73483333,
"TurnDir": "",
"NavID": null,
"NavLat": null,
"NavLon": null,
"NavBear": null,
"NavDist": null,
"Course": null,
"Distance": null,
"Alt": "",
"Vnav": null,
"CenterID": null,
"CenterLat": null,
"CenterLon": null,
"IsFlyOver": 0,
"SpeedLimit": null,
"IsFAF": 0,
"IsMAP": 0
},
{
"ID": 91619,
"TerminalID": 11909,
"Type": "3",
"Transition": "NED9X",
"TrackCode": "TF",
"WptID": 42354,
"WptLat": 45.55416667,
"WptLon": 8.44916667,
"TurnDir": "",
"NavID": null,
"NavLat": null,
"NavLon": null,
"NavBear": null,
"NavDist": null,
"Course": null,
"Distance": null,
"Alt": "",
"Vnav": null,
"CenterID": null,
"CenterLat": null,
"CenterLon": null,
"IsFlyOver": 0,
"SpeedLimit": null,
"IsFAF": 0,
"IsMAP": 0
},
{
"ID": 91620,
"TerminalID": 11909,
"Type": "3",
"Transition": "NED9X",
"TrackCode": "TF",
"WptID": 42823,
"WptLat": 45.10916667,
"WptLon": 8.22972222,
"TurnDir": "",
"NavID": null,
"NavLat": null,
"NavLon": null,
"NavBear": null,
"NavDist": null,
"Course": null,
"Distance": null,
"Alt": "",
"Vnav": null,
"CenterID": null,
"CenterLat": null,
"CenterLon": null,
"IsFlyOver": 0,
"SpeedLimit": null,
"IsFAF": 0,
"IsMAP": 0
},
{
"ID": 91621,
"TerminalID": 11909,
"Type": "3",
"Transition": "NED9X",
"TrackCode": "TF",
"WptID": 42584,
"WptLat": 44.69388889,
"WptLon": 8.14055556,
"TurnDir": "",
"NavID": null,
"NavLat": null,
"NavLon": null,
"NavBear": null,
"NavDist": null,
"Course": null,
"Distance": null,
"Alt": "20000A",
"Vnav": null,
"CenterID": null,
"CenterLat": null,
"CenterLon": null,
"IsFlyOver": 0,
"SpeedLimit": null,
"IsFAF": 0,
"IsMAP": 0
},
{
"ID": 91622,
"TerminalID": 11909,
"Type": "3",
"Transition": "TOP9X",
"TrackCode": "IF",
"WptID": 253267,
"WptLat": 45.64077778,
"WptLon": 8.73483333,
"TurnDir": "",
"NavID": null,
"NavLat": null,
"NavLon": null,
"NavBear": null,
"NavDist": null,
"Course": null,
"Distance": null,
"Alt": "",
"Vnav": null,
"CenterID": null,
"CenterLat": null,
"CenterLon": null,
"IsFlyOver": 0,
"SpeedLimit": null,
"IsFAF": 0,
"IsMAP": 0
},
{
"ID": 91623,
"TerminalID": 11909,
"Type": "3",
"Transition": "TOP9X",
"TrackCode": "TF",
"WptID": 42354,
"WptLat": 45.55416667,
"WptLon": 8.44916667,
"TurnDir": "",
"NavID": null,
"NavLat": null,
"NavLon": null,
"NavBear": null,
"NavDist": null,
"Course": null,
"Distance": null,
"Alt": "",
"Vnav": null,
"CenterID": null,
"CenterLat": null,
"CenterLon": null,
"IsFlyOver": 0,
"SpeedLimit": null,
"IsFAF": 0,
"IsMAP": 0
},
{
"ID": 91624,
"TerminalID": 11909,
"Type": "3",
"Transition": "TOP9X",
"TrackCode": "TF",
"WptID": 42823,
"WptLat": 45.10916667,
"WptLon": 8.22972222,
"TurnDir": "",
"NavID": null,
"NavLat": null,
"NavLon": null,
"NavBear": null,
"NavDist": null,
"Course": null,
"Distance": null,
"Alt": "",
"Vnav": null,
"CenterID": null,
"CenterLat": null,
"CenterLon": null,
"IsFlyOver": 0,
"SpeedLimit": null,
"IsFAF": 0,
"IsMAP": 0
},
{
"ID": 91625,
"TerminalID": 11909,
"Type": "3",
"Transition": "TOP9X",
"TrackCode": "TF",
"WptID": 253309,
"WptLat": 44.92541667,
"WptLon": 7.86166667,
"TurnDir": "",
"NavID": null,
"NavLat": null,
"NavLon": null,
"NavBear": null,
"NavDist": null,
"Course": null,
"Distance": null,
"Alt": "",
"Vnav": null,
"CenterID": null,
"CenterLat": null,
"CenterLon": null,
"IsFlyOver": 0,
"SpeedLimit": null,
"IsFAF": 0,
"IsMAP": 0
}
]

83
TermID_12765.json Normal file
View File

@ -0,0 +1,83 @@
[
{
"ID": 97919,
"TerminalID": 12765,
"Type": "2",
"Transition": "ALL",
"TrackCode": "CF",
"WptID": 253373,
"WptLat": 46.95531111,
"WptLon": 15.44944444,
"TurnDir": "",
"NavID": 4275,
"NavLat": 46.95531111,
"NavLon": 15.44944444,
"NavBear": 0,
"NavDist": 0,
"Course": 164,
"Distance": 2,
"Alt": "02200A",
"Vnav": null,
"CenterID": null,
"CenterLat": null,
"CenterLon": null,
"IsFlyOver": -1,
"SpeedLimit": null,
"IsFAF": 0,
"IsMAP": 0
},
{
"ID": 97920,
"TerminalID": 12765,
"Type": "2",
"Transition": "ALL",
"TrackCode": "DF",
"WptID": 253373,
"WptLat": 46.95531111,
"WptLon": 15.44944444,
"TurnDir": "L",
"NavID": null,
"NavLat": null,
"NavLon": null,
"NavBear": null,
"NavDist": null,
"Course": null,
"Distance": null,
"Alt": "04000A",
"Vnav": null,
"CenterID": null,
"CenterLat": null,
"CenterLon": null,
"IsFlyOver": 0,
"SpeedLimit": null,
"IsFAF": 0,
"IsMAP": 0
},
{
"ID": 97921,
"TerminalID": 12765,
"Type": "2",
"Transition": "ALL",
"TrackCode": "HA",
"WptID": 253373,
"WptLat": 46.95531111,
"WptLon": 15.44944444,
"TurnDir": "R",
"NavID": null,
"NavLat": null,
"NavLon": null,
"NavBear": null,
"NavDist": null,
"Course": 344,
"Distance": 4,
"Alt": "04000A",
"Vnav": null,
"CenterID": null,
"CenterLat": null,
"CenterLon": null,
"IsFlyOver": 0,
"SpeedLimit": null,
"IsFAF": 0,
"IsMAP": 0
}
]

272
TermID_67790.json Normal file
View File

@ -0,0 +1,272 @@
[
{
"ID": 458535,
"TerminalID": 67790,
"Type": "A",
"Transition": "UPV1",
"TrackCode": "IF",
"WptID": 250431,
"WptLat": -28.40175278,
"WptLon": 21.26041111,
"TurnDir": "",
"NavID": null,
"NavLat": null,
"NavLon": null,
"NavBear": null,
"NavDist": null,
"Course": null,
"Distance": null,
"Alt": "05800A",
"Vnav": null,
"CenterID": null,
"CenterLat": null,
"CenterLon": null,
"IsFlyOver": 0,
"SpeedLimit": null,
"IsFAF": 0,
"IsMAP": 0
},
{
"ID": 458536,
"TerminalID": 67790,
"Type": "A",
"Transition": "UPV1",
"TrackCode": "PI",
"WptID": 250431,
"WptLat": -28.40175278,
"WptLon": 21.26041111,
"TurnDir": "L",
"NavID": 1333,
"NavLat": -28.40175278,
"NavLon": 21.26041111,
"NavBear": 0,
"NavDist": 0,
"Course": 213,
"Distance": 10,
"Alt": "04500A",
"Vnav": null,
"CenterID": null,
"CenterLat": null,
"CenterLon": null,
"IsFlyOver": 0,
"SpeedLimit": null,
"IsFAF": 0,
"IsMAP": 0
},
{
"ID": 458537,
"TerminalID": 67790,
"Type": "A",
"Transition": "UPV1",
"TrackCode": "CF",
"WptID": 113102,
"WptLat": -28.51632222,
"WptLon": 21.33836389,
"TurnDir": "",
"NavID": 1333,
"NavLat": -28.40175278,
"NavLon": 21.26041111,
"NavBear": 168,
"NavDist": 8,
"Course": 348,
"Distance": 2,
"Alt": "04500A",
"Vnav": null,
"CenterID": null,
"CenterLat": null,
"CenterLon": null,
"IsFlyOver": 0,
"SpeedLimit": null,
"IsFAF": 0,
"IsMAP": 0
},
{
"ID": 458538,
"TerminalID": 67790,
"Type": "A",
"Transition": "UPV2",
"TrackCode": "IF",
"WptID": 250431,
"WptLat": -28.40175278,
"WptLon": 21.26041111,
"TurnDir": "",
"NavID": null,
"NavLat": null,
"NavLon": null,
"NavBear": null,
"NavDist": null,
"Course": null,
"Distance": null,
"Alt": "05800A",
"Vnav": null,
"CenterID": null,
"CenterLat": null,
"CenterLon": null,
"IsFlyOver": 0,
"SpeedLimit": null,
"IsFAF": 0,
"IsMAP": 0
},
{
"ID": 458539,
"TerminalID": 67790,
"Type": "A",
"Transition": "UPV2",
"TrackCode": "HF",
"WptID": 250431,
"WptLat": -28.40175278,
"WptLon": 21.26041111,
"TurnDir": "L",
"NavID": null,
"NavLat": null,
"NavLon": null,
"NavBear": null,
"NavDist": null,
"Course": 348,
"Distance": 8,
"Alt": "04500A",
"Vnav": null,
"CenterID": null,
"CenterLat": null,
"CenterLon": null,
"IsFlyOver": 0,
"SpeedLimit": null,
"IsFAF": 0,
"IsMAP": 0
},
{
"ID": 458540,
"TerminalID": 67790,
"Type": "D",
"Transition": "",
"TrackCode": "IF",
"WptID": 113102,
"WptLat": -28.51632222,
"WptLon": 21.33836389,
"TurnDir": "",
"NavID": 1333,
"NavLat": -28.40175278,
"NavLon": 21.26041111,
"NavBear": 168,
"NavDist": 8,
"Course": null,
"Distance": null,
"Alt": "04500A",
"Vnav": null,
"CenterID": null,
"CenterLat": null,
"CenterLon": null,
"IsFlyOver": 0,
"SpeedLimit": null,
"IsFAF": -1,
"IsMAP": 0
},
{
"ID": 458541,
"TerminalID": 67790,
"Type": "D",
"Transition": "",
"TrackCode": "CF",
"WptID": null,
"WptLat": -28.41938889,
"WptLon": 21.27444444,
"TurnDir": "",
"NavID": 1333,
"NavLat": -28.40175278,
"NavLon": 21.26041111,
"NavBear": 163.9,
"NavDist": 1.3,
"Course": 348,
"Distance": 6.7,
"Alt": "MAP",
"Vnav": 2.45,
"CenterID": null,
"CenterLat": null,
"CenterLon": null,
"IsFlyOver": 0,
"SpeedLimit": null,
"IsFAF": 0,
"IsMAP": -1
},
{
"ID": 458542,
"TerminalID": 67790,
"Type": "D",
"Transition": "",
"TrackCode": "CF",
"WptID": 250431,
"WptLat": -28.40175278,
"WptLon": 21.26041111,
"TurnDir": "",
"NavID": 1333,
"NavLat": -28.40175278,
"NavLon": 21.26041111,
"NavBear": 0,
"NavDist": 0,
"Course": 348,
"Distance": 1.3,
"Alt": "",
"Vnav": null,
"CenterID": null,
"CenterLat": null,
"CenterLon": null,
"IsFlyOver": -1,
"SpeedLimit": null,
"IsFAF": 0,
"IsMAP": 0
},
{
"ID": 458543,
"TerminalID": 67790,
"Type": "D",
"Transition": "",
"TrackCode": "CA",
"WptID": null,
"WptLat": null,
"WptLon": null,
"TurnDir": "",
"NavID": null,
"NavLat": null,
"NavLon": null,
"NavBear": null,
"NavDist": null,
"Course": 348,
"Distance": null,
"Alt": "05500A",
"Vnav": null,
"CenterID": null,
"CenterLat": null,
"CenterLon": null,
"IsFlyOver": 0,
"SpeedLimit": null,
"IsFAF": 0,
"IsMAP": 0
},
{
"ID": 458544,
"TerminalID": 67790,
"Type": "D",
"Transition": "",
"TrackCode": "DF",
"WptID": 250431,
"WptLat": -28.40175278,
"WptLon": 21.26041111,
"TurnDir": "L",
"NavID": null,
"NavLat": null,
"NavLon": null,
"NavBear": null,
"NavDist": null,
"Course": null,
"Distance": null,
"Alt": "05800",
"Vnav": null,
"CenterID": null,
"CenterLat": null,
"CenterLon": null,
"IsFlyOver": 0,
"SpeedLimit": null,
"IsFAF": 0,
"IsMAP": 0
}
]

353
TermID_67794.json Normal file
View File

@ -0,0 +1,353 @@
[
{
"ID": 458580,
"TerminalID": 67794,
"Type": "A",
"Transition": "FD291",
"TrackCode": "IF",
"WptID": 113125,
"WptLat": -25.65088056,
"WptLon": 28.29919167,
"TurnDir": "",
"NavID": null,
"NavLat": null,
"NavLon": null,
"NavBear": null,
"NavDist": null,
"Course": null,
"Distance": null,
"Alt": "08000A",
"Vnav": null,
"CenterID": null,
"CenterLat": null,
"CenterLon": null,
"IsFlyOver": 0,
"SpeedLimit": null,
"IsFAF": 0,
"IsMAP": 0
},
{
"ID": 458581,
"TerminalID": 67794,
"Type": "A",
"Transition": "FD291",
"TrackCode": "HF",
"WptID": 113125,
"WptLat": -25.65088056,
"WptLon": 28.29919167,
"TurnDir": "R",
"NavID": null,
"NavLat": null,
"NavLon": null,
"NavBear": null,
"NavDist": null,
"Course": 284,
"Distance": 5.5,
"Alt": "07000A",
"Vnav": null,
"CenterID": null,
"CenterLat": null,
"CenterLon": null,
"IsFlyOver": 0,
"SpeedLimit": 140,
"IsFAF": 0,
"IsMAP": 0
},
{
"ID": 458582,
"TerminalID": 67794,
"Type": "A",
"Transition": "FD292",
"TrackCode": "IF",
"WptID": 113125,
"WptLat": -25.65088056,
"WptLon": 28.29919167,
"TurnDir": "",
"NavID": null,
"NavLat": null,
"NavLon": null,
"NavBear": null,
"NavDist": null,
"Course": null,
"Distance": null,
"Alt": "07000A",
"Vnav": null,
"CenterID": null,
"CenterLat": null,
"CenterLon": null,
"IsFlyOver": 0,
"SpeedLimit": null,
"IsFAF": 0,
"IsMAP": 0
},
{
"ID": 458583,
"TerminalID": 67794,
"Type": "A",
"Transition": "FD292",
"TrackCode": "TF",
"WptID": 113123,
"WptLat": -25.64774167,
"WptLon": 28.34813056,
"TurnDir": "",
"NavID": null,
"NavLat": null,
"NavLon": null,
"NavBear": null,
"NavDist": null,
"Course": null,
"Distance": null,
"Alt": "07000A",
"Vnav": null,
"CenterID": null,
"CenterLat": null,
"CenterLon": null,
"IsFlyOver": 0,
"SpeedLimit": null,
"IsFAF": 0,
"IsMAP": 0
},
{
"ID": 458584,
"TerminalID": 67794,
"Type": "A",
"Transition": "FD292",
"TrackCode": "FC",
"WptID": 113123,
"WptLat": -25.64774167,
"WptLon": 28.34813056,
"TurnDir": "",
"NavID": 1283,
"NavLat": -25.65591667,
"NavLon": 28.220075,
"NavBear": 104,
"NavDist": 7,
"Course": 59,
"Distance": 2.7,
"Alt": "07000A",
"Vnav": null,
"CenterID": null,
"CenterLat": null,
"CenterLon": null,
"IsFlyOver": -1,
"SpeedLimit": null,
"IsFAF": 0,
"IsMAP": 0
},
{
"ID": 458585,
"TerminalID": 67794,
"Type": "A",
"Transition": "FD292",
"TrackCode": "CF",
"WptID": 113123,
"WptLat": -25.64774167,
"WptLon": 28.34813056,
"TurnDir": "R",
"NavID": 1283,
"NavLat": -25.65591667,
"NavLon": 28.220075,
"NavBear": 104,
"NavDist": 7,
"Course": 284,
"Distance": 3,
"Alt": "07000A",
"Vnav": null,
"CenterID": null,
"CenterLat": null,
"CenterLon": null,
"IsFlyOver": 0,
"SpeedLimit": null,
"IsFAF": 0,
"IsMAP": 0
},
{
"ID": 458586,
"TerminalID": 67794,
"Type": "A",
"Transition": "FD292",
"TrackCode": "CF",
"WptID": 113125,
"WptLat": -25.65088056,
"WptLon": 28.29919167,
"TurnDir": "",
"NavID": 1283,
"NavLat": -25.65591667,
"NavLon": 28.220075,
"NavBear": 104,
"NavDist": 4.3,
"Course": 284,
"Distance": 2.7,
"Alt": "05300A",
"Vnav": null,
"CenterID": null,
"CenterLat": null,
"CenterLon": null,
"IsFlyOver": 0,
"SpeedLimit": null,
"IsFAF": 0,
"IsMAP": 0
},
{
"ID": 458587,
"TerminalID": 67794,
"Type": "D",
"Transition": "",
"TrackCode": "IF",
"WptID": 113125,
"WptLat": -25.65088056,
"WptLon": 28.29919167,
"TurnDir": "",
"NavID": 1283,
"NavLat": -25.65591667,
"NavLon": 28.220075,
"NavBear": 104,
"NavDist": 4.3,
"Course": null,
"Distance": null,
"Alt": "05300A",
"Vnav": null,
"CenterID": null,
"CenterLat": null,
"CenterLon": null,
"IsFlyOver": 0,
"SpeedLimit": null,
"IsFAF": -1,
"IsMAP": 0
},
{
"ID": 458588,
"TerminalID": 67794,
"Type": "D",
"Transition": "",
"TrackCode": "CF",
"WptID": 113127,
"WptLat": -25.65404722,
"WptLon": 28.24951389,
"TurnDir": "",
"NavID": 1283,
"NavLat": -25.65591667,
"NavLon": 28.220075,
"NavBear": 104,
"NavDist": 1.6,
"Course": 284,
"Distance": 2.7,
"Alt": "MAP",
"Vnav": 3,
"CenterID": null,
"CenterLat": null,
"CenterLon": null,
"IsFlyOver": 0,
"SpeedLimit": null,
"IsFAF": 0,
"IsMAP": -1
},
{
"ID": 458589,
"TerminalID": 67794,
"Type": "D",
"Transition": "",
"TrackCode": "FD",
"WptID": 113127,
"WptLat": -25.65404722,
"WptLon": 28.24951389,
"TurnDir": "",
"NavID": 1283,
"NavLat": -25.65591667,
"NavLon": 28.220075,
"NavBear": 104,
"NavDist": 1.6,
"Course": 284,
"Distance": 2.2,
"Alt": "",
"Vnav": null,
"CenterID": null,
"CenterLat": null,
"CenterLon": null,
"IsFlyOver": 0,
"SpeedLimit": null,
"IsFAF": 0,
"IsMAP": 0
},
{
"ID": 458590,
"TerminalID": 67794,
"Type": "D",
"Transition": "",
"TrackCode": "DF",
"WptID": 250381,
"WptLat": -25.65591667,
"WptLon": 28.220075,
"TurnDir": "R",
"NavID": null,
"NavLat": null,
"NavLon": null,
"NavBear": null,
"NavDist": null,
"Course": null,
"Distance": null,
"Alt": "",
"Vnav": null,
"CenterID": null,
"CenterLat": null,
"CenterLon": null,
"IsFlyOver": 0,
"SpeedLimit": null,
"IsFAF": 0,
"IsMAP": 0
},
{
"ID": 458591,
"TerminalID": 67794,
"Type": "D",
"Transition": "",
"TrackCode": "TF",
"WptID": 113125,
"WptLat": -25.65088056,
"WptLon": 28.29919167,
"TurnDir": "",
"NavID": null,
"NavLat": null,
"NavLon": null,
"NavBear": null,
"NavDist": null,
"Course": null,
"Distance": null,
"Alt": "07000",
"Vnav": null,
"CenterID": null,
"CenterLat": null,
"CenterLon": null,
"IsFlyOver": 0,
"SpeedLimit": null,
"IsFAF": 0,
"IsMAP": 0
},
{
"ID": 458592,
"TerminalID": 67794,
"Type": "D",
"Transition": "",
"TrackCode": "HM",
"WptID": 113125,
"WptLat": -25.65088056,
"WptLon": 28.29919167,
"TurnDir": "R",
"NavID": null,
"NavLat": null,
"NavLon": null,
"NavBear": null,
"NavDist": null,
"Course": 284,
"Distance": 4,
"Alt": "",
"Vnav": null,
"CenterID": null,
"CenterLat": null,
"CenterLon": null,
"IsFlyOver": 0,
"SpeedLimit": 140,
"IsFAF": 0,
"IsMAP": 0
}
]

1
Terminals.json Normal file

File diff suppressed because one or more lines are too long

1
Waypoints.json Normal file

File diff suppressed because one or more lines are too long

280
geojson.js Normal file
View File

@ -0,0 +1,280 @@
import fs from "fs";
import geo from "geojson";
import geolib from "geolib";
const π = Math.PI;
Number.prototype.toRadians = function () {
return (this * Math.PI) / 180;
};
Number.prototype.toDegrees = function () {
return (this * 180) / Math.PI;
};
const nmiToMetre = (nmi) => nmi * 1852.0;
const intersection = (p1, brng1, p2, brng2) => {
if (isNaN(brng1)) throw new TypeError(`invalid brng1 ${brng1}`);
if (isNaN(brng2)) throw new TypeError(`invalid brng2 ${brng2}`);
// see www.edwilliams.org/avform.htm#Intersection
const φ1 = p1.lat.toRadians(),
λ1 = p1.lon.toRadians();
const φ2 = p2.lat.toRadians(),
λ2 = p2.lon.toRadians();
const θ13 = Number(brng1).toRadians(),
θ23 = Number(brng2).toRadians();
const Δφ = φ2 - φ1,
Δλ = λ2 - λ1;
// angular distance p1-p2
const δ12 =
2 *
Math.asin(
Math.sqrt(
Math.sin(Δφ / 2) * Math.sin(Δφ / 2) +
Math.cos(φ1) * Math.cos(φ2) * Math.sin(Δλ / 2) * Math.sin(Δλ / 2)
)
);
if (Math.abs(δ12) < Number.EPSILON) return p1; // coincident points
// initial/final bearings between points
const cosθa =
(Math.sin(φ2) - Math.sin(φ1) * Math.cos(δ12)) /
(Math.sin(δ12) * Math.cos(φ1));
const cosθb =
(Math.sin(φ1) - Math.sin(φ2) * Math.cos(δ12)) /
(Math.sin(δ12) * Math.cos(φ2));
const θa = Math.acos(Math.min(Math.max(cosθa, -1), 1)); // protect against rounding errors
const θb = Math.acos(Math.min(Math.max(cosθb, -1), 1)); // protect against rounding errors
const θ12 = Math.sin(λ2 - λ1) > 0 ? θa : 2 * π - θa;
const θ21 = Math.sin(λ2 - λ1) > 0 ? 2 * π - θb : θb;
const α1 = θ13 - θ12; // angle 2-1-3
const α2 = θ21 - θ23; // angle 1-2-3
if (Math.sin(α1) == 0 && Math.sin(α2) == 0) return null; // infinite intersections
if (Math.sin(α1) * Math.sin(α2) < 0) return null; // ambiguous intersection (antipodal/360°)
const cosα3 =
-Math.cos(α1) * Math.cos(α2) + Math.sin(α1) * Math.sin(α2) * Math.cos(δ12);
const δ13 = Math.atan2(
Math.sin(δ12) * Math.sin(α1) * Math.sin(α2),
Math.cos(α2) + Math.cos(α1) * cosα3
);
const φ3 = Math.asin(
Math.min(
Math.max(
Math.sin(φ1) * Math.cos(δ13) +
Math.cos(φ1) * Math.sin(δ13) * Math.cos(θ13),
-1
),
1
)
);
const Δλ13 = Math.atan2(
Math.sin(θ13) * Math.sin(δ13) * Math.cos(φ1),
Math.cos(δ13) - Math.sin(φ1) * Math.sin(φ3)
);
const λ3 = λ1 + Δλ13;
const lat = φ3.toDegrees();
const lon = λ3.toDegrees();
return { lat, lon, name: "INTC" };
};
const SPEED = 4 / 60; //nmi/s
const TURN = 3; //deg/s
const VS = 1; //fps
// ADJ to location, (NG), E is neg.
const MAGVAR = -1;
const PROCEDURE_ID = 10394;
const waypoints = JSON.parse(fs.readFileSync("Waypoints.json"));
const terminal = JSON.parse(fs.readFileSync("Terminals.json")).filter(
({ ID }) => ID === PROCEDURE_ID
)[0];
const runway = JSON.parse(fs.readFileSync("Runways.json")).filter(
({ ID }) => ID === terminal.RwyID
)[0];
const procedure = JSON.parse(fs.readFileSync(`TermID_${PROCEDURE_ID}.json`));
const points = [{ lat: runway.Latitude, lon: runway.Longitude }];
const lines = [];
procedure.forEach((leg) => {
const waypoint = waypoints.filter(({ ID }) => ID === leg.WptID)[0];
switch (leg.TrackCode) {
case "AF":
case "CA":
case "CD":
break;
case "CF": {
points.push({
lat: leg.WptLat,
lon: leg.WptLon,
name: waypoint?.Ident ?? undefined,
});
if (leg.TurnDir) {
const line = [
[points[points.length - 2].lon, points[points.length - 2].lat],
];
let inbdCrs = Math.round(
geolib.getGreatCircleBearing(
{
latitude: points[points.length - 3].lat,
longitude: points[points.length - 3].lon,
},
{
latitude: points[points.length - 2].lat,
longitude: points[points.length - 2].lon,
}
)
);
let outbCrs = Math.round(leg.Course - MAGVAR);
outbCrs =
outbCrs >= 360
? outbCrs - 360
: outbCrs < 0
? outbCrs + 360
: outbCrs;
const delta = Math.abs(inbdCrs - 180 - outbCrs);
let perpCrs;
if (leg.TurnDir === "R") {
perpCrs = inbdCrs + 90 + delta / 2;
perpCrs = perpCrs >= 360 ? perpCrs - 360 : perpCrs;
} else {
perpCrs = inbdCrs - 90 - delta / 2;
perpCrs = perpCrs < 0 ? perpCrs + 360 : perpCrs;
}
const perpFix = intersection(
points[points.length - 2],
Math.round(perpCrs - MAGVAR),
points[points.length - 1],
Math.round(leg.Course + 180 - MAGVAR)
);
const midFix = geolib.getCenter([
{
latitude: points[points.length - 2].lat,
longitude: points[points.length - 2].lon,
},
{
latitude: perpFix.lat,
longitude: perpFix.lon,
},
]);
const dist = geolib.getDistance(
{
latitude: points[points.length - 2].lat,
longitude: points[points.length - 2].lon,
},
{
latitude: perpFix.lat,
longitude: perpFix.lon,
}
);
const mid1 = geolib.computeDestinationPoint(midFix, dist / 2, inbdCrs);
let invCrs = outbCrs + 180;
invCrs = invCrs >= 360 ? invCrs - 360 : invCrs;
const mid2 = geolib.computeDestinationPoint(midFix, dist / 2, invCrs);
line.push([mid1.longitude, mid1.latitude]);
line.push([mid2.longitude, mid2.latitude]);
line.push([perpFix.lon, perpFix.lat]);
line.push([
points[points.length - 1].lon,
points[points.length - 1].lat,
]);
lines.push({ line });
} else {
lines.push({
line: [
[points[points.length - 2].lon, points[points.length - 2].lat],
[points[points.length - 1].lon, points[points.length - 1].lat],
],
});
}
break;
}
case "CI":
break;
case "CR": {
const intc = intersection(
points[points.length - 1],
Math.round(leg.Course - MAGVAR),
{ lat: leg.NavLat, lon: leg.NavLon },
Math.round(leg.NavBear - MAGVAR)
);
points.push(intc);
lines.push({
line: [
[points[points.length - 2].lon, points[points.length - 2].lat],
[points[points.length - 1].lon, points[points.length - 1].lat],
],
});
}
case "DF":
case "FA":
case "FC":
case "FD":
case "FM":
case "HA":
case "HF":
case "HM":
case "IF":
case "PI":
case "RF":
case "TF":
case "VA":
case "VD":
case "VI":
break;
case "VM": {
const end = geolib.computeDestinationPoint(
{
latitude: points[points.length - 1].lat,
longitude: points[points.length - 1].lon,
},
nmiToMetre(10),
leg.Course - MAGVAR
);
lines.push({
line: [
[points[points.length - 1].lon, points[points.length - 1].lat],
[end.longitude, end.latitude],
],
});
}
case "VR":
case "AF":
default:
break;
}
});
const output = geo.parse([...points, ...lines], {
Point: ["lat", "lon"],
LineString: "line",
});
console.log(JSON.stringify(output, null, 2));

637
navigationdata.h Normal file
View File

@ -0,0 +1,637 @@
#pragma once
#include <boost/shared_ptr.hpp>
#include <vector>
#include <algorithm>
#ifndef _USE_MATH_DEFINES
#define _USE_MATH_DEFINES
#endif
#include <math.h>
#include "latitudelongitude.fs.h"
//#include <cereal/types/polymorphic.hpp>
//#include <cereal/types/base_class.hpp>
#define ALT_INVALID -9999
#define SPD_INVALID -1
#define HDG_INVALID -1
#define DIST_INVALID -1
#define TEMP_INVALID -999
#define KMTONM(km) (km * 0.539957)
#define NMTOKM(nm) (nm * 1.852)
class Winds
{
public:
double alt = ALT_INVALID;
double speed = SPD_INVALID;
double direction = HDG_INVALID;
bool isManual = false;
static Winds Interpolate(std::vector<Winds> winds, double altitude);
bool IsValid() const;
template <class B> void store(B& buf) const;
template <class B> void parse(B& buf);
};
enum class TrackCode
{
ArcToFix, //AF
CourseToAltitude, //CA
CourseToDMEDistance, //CD
CourseToFix, //CF
CourseToNextIntercept, //CI
CourseToRadialTermination, //CR
DirectToFix, //DF
CourseFromFixToAltitude, //FA
CourseFromFixToDMEDistance, //FD
CourseFromFixToManualTermination, //FM
TrackFromFixToDistance, //FC
HoldToAltitude, //HA
HoldAtFix, //HF
HoldUntilManualTermination, //HM
InitialFix, //IF
ProcedureTurnToIntercept, //PI
RadiusToFix, //RF
TrackToFix, //TF
HeadingToAltitude, //VA
HeadingToDMEDistance, //VD
HeadingToNextLegIntercept, //VI
HeadingUntilManualTermination, //VM
HeadingToRadialTermination, //VR
};
enum class NavDataObjType
{
Indeterminate,
TerminalLeg,
Waypoint,
Navaid,
AirwayLeg,
Airport,
Discontinuity,
Runway,
LatitudeLongitude,
PilotDefinedWaypoint,
Hold
};
enum class AirwayStatus
{
Incomplete,
OK
};
enum class TurnDirection
{
Left,
Right
};
enum class ObjectTurnDirection
{
Left = -1,
Unspecified = 0,
Right = 1
};
enum class ObjectUsagePhase
{
Unknown,
Climb,
Descent,
MissedApproach
};
enum class ObjectUsage
{
Leg,
InitialPosition,
Origin,
DepartureLeg,
ArrivalLeg,
ApproachLeg,
Destination,
TurnPoint,
ToC,
ToD,
SC
};
enum class AltitudeRestrictionType
{
Above,
Below,
Between,
Exact,
Step,
Unspecified
};
struct LateralSegment
{
LatitudeLongitude startPoint;
LatitudeLongitude endPoint;
double turnRadius = 0;
double turnStartRadial = 0;
double turnEndRadial = 0;
LatitudeLongitude turnCenterPoint;
TurnDirection turnDir = TurnDirection::Left;
bool afsComplete = false;
LateralSegment() {}
LateralSegment(LatitudeLongitude start, LatitudeLongitude end);
LateralSegment(LatitudeLongitude center, LatitudeLongitude start, LatitudeLongitude end, TurnDirection direction);
double GetLength();
//may need ground distance, vertical rate, delta altitude, etc.
//use performance recording/monitoring software to sample data points from testers to build perf DB
template <class B> void store(B& buf) const;
template <class B> void parse(B& buf);
};
struct VerticalSegment
{
double endsAt = 1.0;
double speed = SPD_INVALID;
double altitude = ALT_INVALID;
double speedRestriction = SPD_INVALID;
ObjectUsagePhase phase = ObjectUsagePhase::Unknown;
//DEBUG
double fpm = 0;
double distToArr = 0;
double gs = 0;
//
double fuelBurned = 0;
VerticalSegment() {}
VerticalSegment(double endsAt, double speed, double altitude, double speedRestriction, ObjectUsagePhase usagePhase, double FPM = 0, double DTA = 0, double GS = 0) : endsAt(endsAt), speed(speed), altitude(altitude), speedRestriction(speedRestriction), phase(usagePhase), fpm(FPM), distToArr(DTA), gs(GS) {}
template <class B> void store(B& buf) const;
template <class B> void parse(B& buf);
};
enum class LocationType
{
Absolute,
Hold,
Relative,
PerfBased,
Abstract
};
struct NavDataObj
{
protected:
int ID = -1;
public:
std::wstring identifier;
LatitudeLongitude latlon;
int Flag = 0;
Winds winds[4];
double tempAlt = ALT_INVALID;
double temp = TEMP_INVALID;
double altRestr = ALT_INVALID;
double altRestrLower = ALT_INVALID;
AltitudeRestrictionType altRestrictionType = AltitudeRestrictionType::Unspecified;
double speed_restr = SPD_INVALID;
bool isFlyover = false;
//ObjectUsagePhase usagePhase = ObjectUsagePhase::Unknown;
ObjectUsage usage = ObjectUsage::Leg;
double progress = 0.0;
double distToNext = DIST_INVALID;
double distToArrival = DIST_INVALID;
double bearingFromTo = 0;
double bearingToFrom = 0;
double fuelBurnToNext = 0;
bool efobSet = false;
double efob = -1;
double ete = -1;
double eto = -1;
double ato = -1;
//Values for use in internal calculations only
struct Calculation
{
double secToNextLeg = -1;
double progToNextLeg = 0.0;
double distToNextLeg = DIST_INVALID;
template <class B> void store(B& buf) const;
template <class B> void parse(B& buf);
} calc;
//
size_t currLatSegment = 0;
std::vector<LateralSegment> latSegments;
size_t currVertSegment = 0;
std::vector< VerticalSegment> vertSegments;
static std::shared_ptr<NavDataObj> Copy(std::shared_ptr<NavDataObj> obj);
double GetPredictedAltitude() const;
double GetPredictedSpeed() const;
ObjectUsagePhase GetUsagePhase() const;
int GetID() const;
void SetID(int id);
virtual bool IsConditional() const;
virtual LocationType GetLocationType() const;
virtual const NavDataObjType GetType() const = 0;
virtual LatitudeLongitude GetLatitudeLongitude() const;
virtual std::wstring GetIdentifier() const;
virtual ~NavDataObj();
template <class B> void store(B& buf) const;
template <class B> void parse(B& buf);
};
struct Runway : public NavDataObj {
double true_heading;
short length;
short width;
std::wstring surface;
short elevation;
virtual const NavDataObjType GetType() const;
Runway();
template <class B> void store(B& buf) const;
template <class B> void parse(B& buf);
};
enum class HoldType
{
Standard,
Manual,
Database,
DatabaseEdited
};
struct HoldParameters
{
std::wstring wptIdent;
HoldType type = HoldType::Standard;
bool holdDistManual = false;
double holdDist = -1;
bool holdTimeManual = true;
double holdTime = -1;
TurnDirection holdDir = TurnDirection::Right;
double holdInboundCourse = -1;
double holdLimitTime = -1;
double holdLimitFuel = -1;
bool holdExit = false;
double defaultCourse = -1;
double defaultTime = -1;
template <class B> void parse(B& buf);
template <class B> void store(B& buf) const;
};
struct Hold : public NavDataObj, HoldParameters {
virtual const NavDataObjType GetType() const override;
virtual bool IsConditional() const override;
virtual LocationType GetLocationType() const override;
double GetSpeedRestriction(double altitude) const;
void Update(HoldParameters params);
Hold();
template <class B> void store(B& buf) const;
template <class B> void parse(B& buf);
};
enum class NavaidType
{
VOR = 1,
VORTAC = 2,
TACAN = 3,
VORDME = 4,
NDB = 5,
NDBDME = 7,
ILSDME = 8,
DME = 9
};
struct Navaid : public NavDataObj {
NavaidType type;
std::wstring name;
std::wstring country;
int frequency;
std::wstring channel;
std::wstring usage;
int elevation;
double slaved_var;
virtual const NavDataObjType GetType() const;
Navaid();
template <class B> void parse(B& buf);
template <class B> void store(B& buf) const;
};
struct Waypoint : public NavDataObj {
bool collocated;
std::wstring name;
std::wstring country;
int navaidID;
virtual const NavDataObjType GetType() const;
Waypoint();
template <class B> void store(B& buf) const;
template <class B> void parse(B& buf);
};
struct AirwayLeg : public NavDataObj {
int airway_id;
std::wstring airway_ident;
std::wstring level;
std::wstring wpt1Ident;
int wpt1ID;
int wpt2ID;
bool is_start;
bool is_end;
virtual const NavDataObjType GetType() const;
AirwayLeg();
template <class B> void store(B& buf) const;
template <class B> void parse(B& buf);
};
struct Airway {
int ID;
std::wstring identifier;
AirwayStatus status;
std::vector<AirwayLeg> legs;
Airway();
template <class B> void store(B& buf) const;
template <class B> void parse(B& buf);
};
struct Discontinuity : public NavDataObj {
virtual bool IsConditional() const override;
virtual const NavDataObjType GetType() const override;
virtual std::wstring GetIdentifier() const override;
virtual LocationType GetLocationType() const override;
template <class B> void store(B& buf) const;
template <class B> void parse(B& buf);
};
struct LatitudeLongitudeWaypoint : public NavDataObj {
virtual LocationType GetLocationType() const override;
virtual const NavDataObjType GetType() const;
LatitudeLongitudeWaypoint();
template <class B> void store(B& buf) const;
template <class B> void parse(B& buf);
};
struct PilotDefinedWaypoint : public NavDataObj {
std::wstring pbd_place;
int pbd_brg;
int pbd_dist;
int elev;
int crs;
int length;
bool is_defined = false;
bool IsRunway() const;
virtual const NavDataObjType GetType() const;
PilotDefinedWaypoint();
template <class B> void store(B& buf) const;
template <class B> void parse(B& buf);
};
struct TerminalLeg : public NavDataObj {
int terminal_id;
std::shared_ptr<NavDataObj> via;
char type;
TrackCode track_code;
std::wstring transition;
Waypoint wpt;
Navaid nvd;
HoldParameters hold;
ObjectTurnDirection turn_dir;
double course;
double distance;
LatitudeLongitude refLatLon;
LatitudeLongitude destLatlon;
double bearToDest;
double distToDest;
double vnav;
int center_id;
LatitudeLongitude center_latlon;
virtual const NavDataObjType GetType() const override;
virtual LatitudeLongitude GetLatitudeLongitude() const override;
double speed_limit;
bool is_missed_app_point;
bool is_final_app_fix;
virtual bool IsConditional() const override;
virtual LocationType GetLocationType() const override;
TerminalLeg();
template <class B> void store(B& buf) const;
template <class B> void parse(B& buf);
};
struct ILS {
int ID;
std::wstring identifier;
LatitudeLongitude latlon;
int runway_id;
int frequency;
double gs_angle;
short category;
double loc_course;
int crossing_height;
int elevation;
bool has_dme;
ILS();
template <class B> void store(B& buf) const;
template <class B> void parse(B& buf);
};
struct TerminalProcedure {
int ID;
std::wstring identifier;
//int airport_id;
//std::wstring icao;
char proc;
//std::wstring full_name;
//std::wstring runway;
std::wstring GetFormattedName();
std::vector<TerminalLeg> legs;
bool is_ils;
int runway_id;
TerminalProcedure();
template <class B> void store(B& buf) const;
template <class B> void parse(B& buf);
};
struct Airport : public NavDataObj {
std::wstring name;
int primaryid;
short elevation;
int transition_altitude;
Airport();
std::vector<Runway> runways;
std::vector<TerminalProcedure> sids;
std::vector<TerminalProcedure> stars;
std::vector<TerminalProcedure> approaches;
Airport& operator=(const Airport& otherapt);
bool operator==(Airport& otherapt);
bool operator!=(Airport& otherapt);
virtual const NavDataObjType GetType() const;
template <class B> void store(B& buf) const;
template <class B> void parse(B& buf);
};
struct Transition
{
std::wstring identifier;
template <class B> void store(B& buf) const;
template <class B> void parse(B& buf);
};
class WorldData
{
public:
static std::vector<LatitudeLongitude> LatLonSpread(LatitudeLongitude source, int numOfSteps);
static int LatToX(double lat);
static int LonToY(double lon);
std::vector<Airport> airports[181][361];
std::vector<Navaid> navaids[181][361];
std::vector<Waypoint> waypoints[181][361];
std::vector<Airway> airways;
std::vector<AirwayLeg> airwayLegs;
std::vector<ILS> ilses;
};
struct NavigationData {
private:
void name_terminal_leg(TerminalLeg& tl);
int which_terminal_leg_is_duplicate(TerminalLeg& tl1, TerminalLeg& tl2);
std::string dataDir;
public:
bool is_usable;
std::wstring cycle_name;
std::wstring cycle_start;
std::wstring cycle_end;
bool is_valid();
bool lookup_airport_by_id(int id, Airport & apt);
bool lookup_airport_by_icao(std::wstring icao, Airport & apt);
bool lookup_waypoint_by_id(int wptid, Waypoint& wpt);
bool lookup_navaid_by_id(int navid, Navaid& nd);
bool lookup_airway_by_ident(std::wstring ident, Airway& aw);
bool lookup_ils(int runway_id, ILS& ils);
std::vector<ILS> lookup_ils_by_frequency(int frequency);
std::vector<ILS> lookup_ils_by_ident(std::wstring ident);
bool intersect_airways(int airwayid1, int airwayid2, AirwayLeg& leg);
bool lookup_airway_legs(Airway awy, std::wstring waypoint1ident, std::wstring waypoint2ident, std::vector<AirwayLeg>& legs);
std::vector<Navaid> lookup_navaids_by_ident(std::wstring ident);
std::vector<Navaid> lookup_navaids_by_frequency(int frequency);
std::vector<Waypoint> lookup_waypoints_by_ident(std::wstring ident);
std::vector<Runway> lookup_runways(int airport_id, int terminal_id = -1);
double get_runway_slope(int airport_id, int runway_id);
WorldData worldData;
std::vector<Transition> lookup_sid_transitions(int sid_id);
std::vector<TerminalProcedure> lookup_sids(int airport_id, int runway_id = -1);
std::vector<TerminalLeg> lookup_sid_legs(int sid_id, std::wstring rwy, std::wstring transition);
std::vector<Transition> lookup_star_transitions(int star_id);
std::vector<TerminalProcedure> lookup_stars(int airport_id, int runway_id = -1);
std::vector<TerminalLeg> lookup_star_legs(int star_id, std::wstring rwy, std::wstring transition);
std::vector<Transition> lookup_approach_transitions(int approach_id);
std::vector<TerminalProcedure> lookup_approaches(int airport_id, int runway_id = -1, bool strict_runway_enforcement = false);
std::vector<TerminalLeg> lookup_approach_legs(int approach_id, std::wstring transition);
NavigationData(std::wstring dataDirectory);
~NavigationData();
};

8
package.json Normal file
View File

@ -0,0 +1,8 @@
{
"dependencies": {
"geojson": "^0.5.0",
"geolib": "^3.3.4",
"magvar": "^2.0.0"
},
"type": "module"
}

39
pnpm-lock.yaml generated Normal file
View File

@ -0,0 +1,39 @@
lockfileVersion: '9.0'
settings:
autoInstallPeers: true
excludeLinksFromLockfile: false
importers:
.:
dependencies:
geojson:
specifier: ^0.5.0
version: 0.5.0
geolib:
specifier: ^3.3.4
version: 3.3.4
magvar:
specifier: ^2.0.0
version: 2.0.0
packages:
geojson@0.5.0:
resolution: {integrity: sha512-/Bx5lEn+qRF4TfQ5aLu6NH+UKtvIv7Lhc487y/c8BdludrCTpiWf9wyI0RTyqg49MFefIAvFDuEi5Dfd/zgNxQ==}
engines: {node: '>= 0.10'}
geolib@3.3.4:
resolution: {integrity: sha512-EicrlLLL3S42gE9/wde+11uiaYAaeSVDwCUIv2uMIoRBfNJCn8EsSI+6nS3r4TCKDO6+RQNM9ayLq2at+oZQWQ==}
magvar@2.0.0:
resolution: {integrity: sha512-00LpSwEJZcnyX3VsdCM2CHSCvB+M6sVQTawLCB3J9oK7eEueNltNx9GFL4YR+/HIkLM+l8rFKiY77JTKnOf0jw==}
snapshots:
geojson@0.5.0: {}
geolib@3.3.4: {}
magvar@2.0.0: {}