@squawk/flightplan 0.8.1 → 0.9.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +16 -13
- package/dist/resolver.d.ts +12 -4
- package/dist/resolver.d.ts.map +1 -1
- package/dist/resolver.js +1 -0
- package/dist/route-distance.d.ts +9 -2
- package/dist/route-distance.d.ts.map +1 -1
- package/dist/route-distance.js +4 -2
- package/dist/route-geometry.d.ts +5 -0
- package/dist/route-geometry.d.ts.map +1 -1
- package/dist/route-geometry.js +9 -2
- package/dist/route-timing.d.ts +2 -0
- package/dist/route-timing.d.ts.map +1 -1
- package/dist/route-timing.js +1 -0
- package/package.json +13 -13
package/README.md
CHANGED
|
@@ -117,23 +117,26 @@ the configured lookup providers.
|
|
|
117
117
|
|
|
118
118
|
Each element has a `type` discriminant and a `raw` field with the original token.
|
|
119
119
|
|
|
120
|
-
| Type | Description | Key fields
|
|
121
|
-
| --------------- | ----------------------------------------- |
|
|
122
|
-
| `airport` | Resolved airport (ICAO or FAA ID) | `airport`
|
|
123
|
-
| `sid` | Standard Instrument Departure | `procedure`, `legs`, `transition`
|
|
124
|
-
| `star` | Standard Terminal Arrival Route | `procedure`, `legs`, `transition`
|
|
125
|
-
| `airway` | Airway segment between entry and exit fix | `airway`, `entryFix`, `exitFix`, `waypoints`, `gaps`
|
|
126
|
-
| `direct` | DCT (direct) indicator | -
|
|
127
|
-
| `waypoint` | Resolved fix or navaid | `fix` and/or `navaid`, `lat`, `lon`
|
|
128
|
-
| `coordinate` | Lat/lon specified in the route string | `lat`, `lon`
|
|
129
|
-
| `speedAltitude` | Speed/altitude group (e.g. N0450F350) | `speedKt`/`speedKmPerHr`/`mach`, `flightLevel`/`altitudeFt`
|
|
130
|
-
| `unresolved` | Token that could not be resolved | -
|
|
120
|
+
| Type | Description | Key fields |
|
|
121
|
+
| --------------- | ----------------------------------------- | ---------------------------------------------------------------- |
|
|
122
|
+
| `airport` | Resolved airport (ICAO or FAA ID) | `airport` |
|
|
123
|
+
| `sid` | Standard Instrument Departure | `procedure`, `legs`, `transition` |
|
|
124
|
+
| `star` | Standard Terminal Arrival Route | `procedure`, `legs`, `transition` |
|
|
125
|
+
| `airway` | Airway segment between entry and exit fix | `airway`, `entryFix`, `exitFix`, `waypoints`, `gaps`, `unusable` |
|
|
126
|
+
| `direct` | DCT (direct) indicator | - |
|
|
127
|
+
| `waypoint` | Resolved fix or navaid | `fix` and/or `navaid`, `lat`, `lon` |
|
|
128
|
+
| `coordinate` | Lat/lon specified in the route string | `lat`, `lon` |
|
|
129
|
+
| `speedAltitude` | Speed/altitude group (e.g. N0450F350) | `speedKt`/`speedKmPerHr`/`mach`, `flightLevel`/`altitudeFt` |
|
|
130
|
+
| `unresolved` | Token that could not be resolved | - |
|
|
131
131
|
|
|
132
132
|
An airway element's `gaps` lists any published discontinuity its expansion
|
|
133
133
|
crosses (the FAA discontinues some airways partway, such as J60 between JOT and
|
|
134
134
|
DJB). The waypoints on both sides are still returned so the route can be drawn
|
|
135
135
|
and measured, but a non-empty `gaps` means the route files the airway where it
|
|
136
|
-
is not defined and is not valid as filed.
|
|
136
|
+
is not defined and is not valid as filed. Its `unusable` lists, in the same
|
|
137
|
+
shape, any segment the FAA marks unusable (J34 between DRYER and GAABE, for
|
|
138
|
+
example): the segment is still published with its distance but may not be
|
|
139
|
+
flown, so a route across it is not valid as filed either.
|
|
137
140
|
|
|
138
141
|
### Coordinate formats
|
|
139
142
|
|
|
@@ -213,7 +216,7 @@ console.log(result.totalDistanceNm, result.estimatedTimeEnrouteHrs);
|
|
|
213
216
|
|
|
214
217
|
**Returns:** `RouteDistanceResult` with:
|
|
215
218
|
|
|
216
|
-
- `legs` - ordered `RouteLeg` values, each with `from`/`to` point labels, their `fromLat`/`fromLon`/`toLat`/`toLon` coordinates in decimal degrees, `distanceNm`, `cumulativeDistanceNm`,
|
|
219
|
+
- `legs` - ordered `RouteLeg` values, each with `from`/`to` point labels, their `fromLat`/`fromLon`/`toLat`/`toLon` coordinates in decimal degrees, `distanceNm`, `cumulativeDistanceNm`, `crossesGap`, which is true when the leg spans a published gap in the airway it came from (the leg is a straight line that counts toward the total but is not a flyable airway segment), and `unusable`, which is true when the leg is an airway segment the FAA marks unusable (counted toward the total but not to be flown)
|
|
217
220
|
- `totalDistanceNm` - total great-circle distance in nautical miles
|
|
218
221
|
- `estimatedTimeEnrouteHrs` - ETE in hours, or `undefined` when no ground speed was given
|
|
219
222
|
- `unresolvedElements` - route elements that could not contribute coordinates
|
package/dist/resolver.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { Airport, Airway, AirwayGap, AirwayWaypoint, Fix, Navaid, Procedure, ProcedureLeg } from '@squawk/types';
|
|
1
|
+
import type { Airport, Airway, AirwayGap, AirwaySegmentReference, AirwayWaypoint, Fix, Navaid, Procedure, ProcedureLeg } from '@squawk/types';
|
|
2
2
|
/**
|
|
3
3
|
* Minimal airport lookup interface consumed by the flightplan resolver.
|
|
4
4
|
* Structurally compatible with the `AirportResolver` shape in `@squawk/airports`.
|
|
@@ -48,14 +48,15 @@ export interface FlightplanAirwayLookup {
|
|
|
48
48
|
byDesignation(designation: string): Airway[];
|
|
49
49
|
/**
|
|
50
50
|
* Expands an airway between entry and exit fixes, returning ordered
|
|
51
|
-
* waypoints. `gaps` lists any published discontinuity the expansion crosses
|
|
52
|
-
*
|
|
53
|
-
* none.
|
|
51
|
+
* waypoints. `gaps` lists any published discontinuity the expansion crosses
|
|
52
|
+
* and `unusable` any segment the FAA marks unusable; a lookup that cannot
|
|
53
|
+
* report either may omit it, and the route then reports none.
|
|
54
54
|
*/
|
|
55
55
|
expand(designation: string, entryFix: string, exitFix: string): {
|
|
56
56
|
airway: Airway;
|
|
57
57
|
waypoints: AirwayWaypoint[];
|
|
58
58
|
gaps?: AirwayGap[];
|
|
59
|
+
unusable?: AirwaySegmentReference[];
|
|
59
60
|
} | undefined;
|
|
60
61
|
}
|
|
61
62
|
/**
|
|
@@ -136,6 +137,13 @@ export interface AirwayRouteElement {
|
|
|
136
137
|
* the route can be drawn and measured.
|
|
137
138
|
*/
|
|
138
139
|
gaps: AirwayGap[];
|
|
140
|
+
/**
|
|
141
|
+
* Segments inside the expansion the FAA marks unusable, in traversal order.
|
|
142
|
+
* Empty when every segment may be flown. The waypoints are still returned so
|
|
143
|
+
* the route can be drawn and measured, but a route filing the airway across
|
|
144
|
+
* an unusable segment is not valid as filed.
|
|
145
|
+
*/
|
|
146
|
+
unusable: AirwaySegmentReference[];
|
|
139
147
|
}
|
|
140
148
|
/**
|
|
141
149
|
* A DCT (direct) indicator between two waypoints.
|
package/dist/resolver.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../src/resolver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,OAAO,EACP,MAAM,EACN,SAAS,EACT,cAAc,EACd,GAAG,EACH,MAAM,EACN,SAAS,EACT,YAAY,EACb,MAAM,eAAe,CAAC;AAMvB;;;GAGG;AACH,MAAM,WAAW,uBAAuB;IACtC,mEAAmE;IACnE,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;IAC5C,sDAAsD;IACtD,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;CAC3C;AAED;;;GAGG;AACH,MAAM,WAAW,sBAAsB;IACrC,4EAA4E;IAC5E,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACjC;;;;;OAKG;IACH,iBAAiB,CAAC,CAChB,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,MAAM,EACX,WAAW,CAAC,EAAE,MAAM,GACnB,MAAM,GAAG,SAAS,CAAC;CACvB;AAED;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC,0EAA0E;IAC1E,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,GAAG,EAAE,CAAC;IAC9B;;;;;OAKG;IACH,iBAAiB,CAAC,CAChB,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,MAAM,EACX,WAAW,CAAC,EAAE,MAAM,GACnB,GAAG,GAAG,SAAS,CAAC;CACpB;AAED;;;GAGG;AACH,MAAM,WAAW,sBAAsB;IACrC,iGAAiG;IACjG,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC7C;;;;;OAKG;IACH,MAAM,CACJ,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../src/resolver.ts"],"names":[],"mappings":"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"}
|
package/dist/resolver.js
CHANGED
|
@@ -300,6 +300,7 @@ export function createFlightplanResolver(options) {
|
|
|
300
300
|
exitFix,
|
|
301
301
|
waypoints: expansion.waypoints,
|
|
302
302
|
gaps: expansion.gaps ?? [],
|
|
303
|
+
unusable: expansion.unusable ?? [],
|
|
303
304
|
});
|
|
304
305
|
// The exit fix is consumed as part of the airway; update last waypoint
|
|
305
306
|
lastWaypointIdent = exitFix;
|
package/dist/route-distance.d.ts
CHANGED
|
@@ -31,6 +31,12 @@ export interface RouteLeg {
|
|
|
31
31
|
* segment, and the route is not valid as filed.
|
|
32
32
|
*/
|
|
33
33
|
crossesGap: boolean;
|
|
34
|
+
/**
|
|
35
|
+
* Whether this leg is an airway segment the FAA marks unusable. The leg is
|
|
36
|
+
* measured like any other and counts toward the total, but the segment may
|
|
37
|
+
* not be flown, so the route is not valid as filed.
|
|
38
|
+
*/
|
|
39
|
+
unusable: boolean;
|
|
34
40
|
}
|
|
35
41
|
/**
|
|
36
42
|
* Result of computing route distance and estimated time enroute from a
|
|
@@ -65,8 +71,9 @@ export interface RouteDistanceResult {
|
|
|
65
71
|
* Airway segments use the FAA-published `distanceToNextNm` value where the
|
|
66
72
|
* source publishes a positive one, falling back to great-circle computation
|
|
67
73
|
* otherwise. A leg that spans a published gap in its airway is still measured
|
|
68
|
-
* as a straight line and counted, but is flagged with `crossesGap
|
|
69
|
-
*
|
|
74
|
+
* as a straight line and counted, but is flagged with `crossesGap`, and a leg
|
|
75
|
+
* on an airway segment the FAA marks unusable is flagged with `unusable`, so
|
|
76
|
+
* the caller can see that the route is not valid as filed.
|
|
70
77
|
*
|
|
71
78
|
* ```typescript
|
|
72
79
|
* import { createFlightplanResolver, computeRouteDistance } from '@squawk/flightplan';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"route-distance.d.ts","sourceRoot":"","sources":["../src/route-distance.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAO/D;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,qDAAqD;IACrD,IAAI,EAAE,MAAM,CAAC;IACb,mDAAmD;IACnD,EAAE,EAAE,MAAM,CAAC;IACX,yEAAyE;IACzE,OAAO,EAAE,MAAM,CAAC;IAChB,yEAAyE;IACzE,OAAO,EAAE,MAAM,CAAC;IAChB,uEAAuE;IACvE,KAAK,EAAE,MAAM,CAAC;IACd,uEAAuE;IACvE,KAAK,EAAE,MAAM,CAAC;IACd,2DAA2D;IAC3D,UAAU,EAAE,MAAM,CAAC;IACnB,8FAA8F;IAC9F,oBAAoB,EAAE,MAAM,CAAC;IAC7B;;;;;OAKG;IACH,UAAU,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"route-distance.d.ts","sourceRoot":"","sources":["../src/route-distance.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAO/D;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,qDAAqD;IACrD,IAAI,EAAE,MAAM,CAAC;IACb,mDAAmD;IACnD,EAAE,EAAE,MAAM,CAAC;IACX,yEAAyE;IACzE,OAAO,EAAE,MAAM,CAAC;IAChB,yEAAyE;IACzE,OAAO,EAAE,MAAM,CAAC;IAChB,uEAAuE;IACvE,KAAK,EAAE,MAAM,CAAC;IACd,uEAAuE;IACvE,KAAK,EAAE,MAAM,CAAC;IACd,2DAA2D;IAC3D,UAAU,EAAE,MAAM,CAAC;IACnB,8FAA8F;IAC9F,oBAAoB,EAAE,MAAM,CAAC;IAC7B;;;;;OAKG;IACH,UAAU,EAAE,OAAO,CAAC;IACpB;;;;OAIG;IACH,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC,0DAA0D;IAC1D,IAAI,EAAE,QAAQ,EAAE,CAAC;IACjB,2DAA2D;IAC3D,eAAe,EAAE,MAAM,CAAC;IACxB,uFAAuF;IACvF,uBAAuB,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5C;;;;OAIG;IACH,kBAAkB,EAAE,YAAY,EAAE,CAAC;CACpC;AAMD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,WAAW,EAClB,aAAa,CAAC,EAAE,MAAM,GACrB,mBAAmB,CAwCrB"}
|
package/dist/route-distance.js
CHANGED
|
@@ -23,8 +23,9 @@ import { extractGeoPoints } from './route-geometry.js';
|
|
|
23
23
|
* Airway segments use the FAA-published `distanceToNextNm` value where the
|
|
24
24
|
* source publishes a positive one, falling back to great-circle computation
|
|
25
25
|
* otherwise. A leg that spans a published gap in its airway is still measured
|
|
26
|
-
* as a straight line and counted, but is flagged with `crossesGap
|
|
27
|
-
*
|
|
26
|
+
* as a straight line and counted, but is flagged with `crossesGap`, and a leg
|
|
27
|
+
* on an airway segment the FAA marks unusable is flagged with `unusable`, so
|
|
28
|
+
* the caller can see that the route is not valid as filed.
|
|
28
29
|
*
|
|
29
30
|
* ```typescript
|
|
30
31
|
* import { createFlightplanResolver, computeRouteDistance } from '@squawk/flightplan';
|
|
@@ -61,6 +62,7 @@ export function computeRouteDistance(route, groundSpeedKt) {
|
|
|
61
62
|
distanceNm: legDistanceNm,
|
|
62
63
|
cumulativeDistanceNm: totalDistanceNm,
|
|
63
64
|
crossesGap: from.gapToNext === true,
|
|
65
|
+
unusable: from.unusableToNext === true,
|
|
64
66
|
});
|
|
65
67
|
}
|
|
66
68
|
const estimatedTimeEnrouteHrs = groundSpeedKt !== undefined && groundSpeedKt > 0 ? totalDistanceNm / groundSpeedKt : undefined;
|
package/dist/route-geometry.d.ts
CHANGED
|
@@ -45,6 +45,11 @@ export interface GeoPoint {
|
|
|
45
45
|
* the airway it was expanded from.
|
|
46
46
|
*/
|
|
47
47
|
gapToNext?: true;
|
|
48
|
+
/**
|
|
49
|
+
* Set when the leg from this point to the next is an airway segment the FAA
|
|
50
|
+
* marks unusable.
|
|
51
|
+
*/
|
|
52
|
+
unusableToNext?: true;
|
|
48
53
|
}
|
|
49
54
|
/**
|
|
50
55
|
* Walks the route elements and extracts an ordered array of geographic
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"route-geometry.d.ts","sourceRoot":"","sources":["../src/route-geometry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAE1C,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAM/D;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,6DAA6D;IAC7D,KAAK,EAAE,MAAM,CAAC;IACd,mDAAmD;IACnD,GAAG,EAAE,MAAM,CAAC;IACZ,mDAAmD;IACnD,GAAG,EAAE,MAAM,CAAC;CACb;AAMD;;;;;;GAMG;AACH,MAAM,WAAW,QAAQ;IACvB,+CAA+C;IAC/C,KAAK,EAAE,MAAM,CAAC;IACd,mDAAmD;IACnD,GAAG,EAAE,MAAM,CAAC;IACZ,mDAAmD;IACnD,GAAG,EAAE,MAAM,CAAC;IACZ;;;OAGG;IACH,2BAA2B,CAAC,EAAE,MAAM,CAAC;IACrC;;;OAGG;IACH,SAAS,CAAC,EAAE,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"route-geometry.d.ts","sourceRoot":"","sources":["../src/route-geometry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAE1C,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAM/D;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,6DAA6D;IAC7D,KAAK,EAAE,MAAM,CAAC;IACd,mDAAmD;IACnD,GAAG,EAAE,MAAM,CAAC;IACZ,mDAAmD;IACnD,GAAG,EAAE,MAAM,CAAC;CACb;AAMD;;;;;;GAMG;AACH,MAAM,WAAW,QAAQ;IACvB,+CAA+C;IAC/C,KAAK,EAAE,MAAM,CAAC;IACd,mDAAmD;IACnD,GAAG,EAAE,MAAM,CAAC;IACZ,mDAAmD;IACnD,GAAG,EAAE,MAAM,CAAC;IACZ;;;OAGG;IACH,2BAA2B,CAAC,EAAE,MAAM,CAAC;IACrC;;;OAGG;IACH,SAAS,CAAC,EAAE,IAAI,CAAC;IACjB;;;OAGG;IACH,cAAc,CAAC,EAAE,IAAI,CAAC;CACvB;AAuBD;;;;;;;;;;;;GAYG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,YAAY,EAAE,GAAG;IAC1D,MAAM,EAAE,QAAQ,EAAE,CAAC;IACnB,kBAAkB,EAAE,YAAY,EAAE,CAAC;CACpC,CA+FA;AAMD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,WAAW,GAAG,UAAU,EAAE,CAGnE;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,WAAW,GAAG,UAAU,GAAG,SAAS,CAS5E"}
|
package/dist/route-geometry.js
CHANGED
|
@@ -53,11 +53,14 @@ export function extractGeoPoints(elements) {
|
|
|
53
53
|
last.precomputedDistanceToNextNm === undefined) {
|
|
54
54
|
last.precomputedDistanceToNextNm = point.precomputedDistanceToNextNm;
|
|
55
55
|
}
|
|
56
|
-
// Likewise carry a gap marker, so the leg out of the merged
|
|
57
|
-
// still reported as crossing the gap.
|
|
56
|
+
// Likewise carry a gap or unusable marker, so the leg out of the merged
|
|
57
|
+
// point is still reported as crossing the gap or as unusable.
|
|
58
58
|
if (point.gapToNext) {
|
|
59
59
|
last.gapToNext = true;
|
|
60
60
|
}
|
|
61
|
+
if (point.unusableToNext) {
|
|
62
|
+
last.unusableToNext = true;
|
|
63
|
+
}
|
|
61
64
|
return;
|
|
62
65
|
}
|
|
63
66
|
points.push(point);
|
|
@@ -75,6 +78,7 @@ export function extractGeoPoints(elements) {
|
|
|
75
78
|
break;
|
|
76
79
|
case 'airway': {
|
|
77
80
|
const gapIndexes = new Set(el.gaps.map((gap) => gap.index));
|
|
81
|
+
const unusableIndexes = new Set(el.unusable.map((segment) => segment.index));
|
|
78
82
|
for (let i = 0; i < el.waypoints.length; i++) {
|
|
79
83
|
const wp = el.waypoints[i];
|
|
80
84
|
const isLast = i === el.waypoints.length - 1;
|
|
@@ -92,6 +96,9 @@ export function extractGeoPoints(elements) {
|
|
|
92
96
|
if (!isLast && gapIndexes.has(i)) {
|
|
93
97
|
point.gapToNext = true;
|
|
94
98
|
}
|
|
99
|
+
if (!isLast && unusableIndexes.has(i)) {
|
|
100
|
+
point.unusableToNext = true;
|
|
101
|
+
}
|
|
95
102
|
emit(point);
|
|
96
103
|
}
|
|
97
104
|
break;
|
package/dist/route-timing.d.ts
CHANGED
|
@@ -70,6 +70,8 @@ export interface RouteTimingLeg {
|
|
|
70
70
|
cumulativeDistanceNm: number;
|
|
71
71
|
/** Whether this leg spans a published gap in the airway it was expanded from, as on `RouteLeg`. */
|
|
72
72
|
crossesGap: boolean;
|
|
73
|
+
/** Whether this leg is an airway segment the FAA marks unusable, as on `RouteLeg`. */
|
|
74
|
+
unusable: boolean;
|
|
73
75
|
/** Initial great-circle true course for the leg in degrees (0-360). */
|
|
74
76
|
trueCourseDeg: number;
|
|
75
77
|
/** True heading to fly to hold the course given the wind, in degrees (0-360). */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"route-timing.d.ts","sourceRoot":"","sources":["../src/route-timing.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAGtD,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAO/D;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,YAAY,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,UAAU,GAAG,SAAS,CAAC;AAEhF;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,iDAAiD;IACjD,cAAc,EAAE,MAAM,CAAC;IACvB;;;OAGG;IACH,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,qDAAqD;IACrD,IAAI,EAAE,MAAM,CAAC;IACb,mDAAmD;IACnD,EAAE,EAAE,MAAM,CAAC;IACX,yEAAyE;IACzE,OAAO,EAAE,MAAM,CAAC;IAChB,yEAAyE;IACzE,OAAO,EAAE,MAAM,CAAC;IAChB,uEAAuE;IACvE,KAAK,EAAE,MAAM,CAAC;IACd,uEAAuE;IACvE,KAAK,EAAE,MAAM,CAAC;IACd,2DAA2D;IAC3D,UAAU,EAAE,MAAM,CAAC;IACnB,8FAA8F;IAC9F,oBAAoB,EAAE,MAAM,CAAC;IAC7B,mGAAmG;IACnG,UAAU,EAAE,OAAO,CAAC;IACpB,uEAAuE;IACvE,aAAa,EAAE,MAAM,CAAC;IACtB,iFAAiF;IACjF,cAAc,EAAE,MAAM,CAAC;IACvB,6FAA6F;IAC7F,sBAAsB,EAAE,MAAM,CAAC;IAC/B,mDAAmD;IACnD,aAAa,EAAE,MAAM,CAAC;IACtB,8EAA8E;IAC9E,IAAI,EAAE,UAAU,GAAG,SAAS,CAAC;IAC7B,mGAAmG;IACnG,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B;;;OAGG;IACH,gBAAgB,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC;;;OAGG;IACH,YAAY,EAAE,MAAM,GAAG,SAAS,CAAC;CAClC;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,qDAAqD;IACrD,IAAI,EAAE,cAAc,EAAE,CAAC;IACvB,2DAA2D;IAC3D,eAAe,EAAE,MAAM,CAAC;IACxB;;;OAGG;IACH,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC;;;OAGG;IACH,iBAAiB,EAAE,MAAM,GAAG,SAAS,CAAC;IACtC;;;OAGG;IACH,YAAY,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC;;;OAGG;IACH,cAAc,EAAE,OAAO,GAAG,SAAS,CAAC;IACpC;;;OAGG;IACH,kBAAkB,EAAE,YAAY,EAAE,CAAC;CACpC;AAMD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,WAAW,EAClB,OAAO,EAAE,kBAAkB,GAC1B,iBAAiB,
|
|
1
|
+
{"version":3,"file":"route-timing.d.ts","sourceRoot":"","sources":["../src/route-timing.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAGtD,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAO/D;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,YAAY,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,UAAU,GAAG,SAAS,CAAC;AAEhF;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,iDAAiD;IACjD,cAAc,EAAE,MAAM,CAAC;IACvB;;;OAGG;IACH,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,qDAAqD;IACrD,IAAI,EAAE,MAAM,CAAC;IACb,mDAAmD;IACnD,EAAE,EAAE,MAAM,CAAC;IACX,yEAAyE;IACzE,OAAO,EAAE,MAAM,CAAC;IAChB,yEAAyE;IACzE,OAAO,EAAE,MAAM,CAAC;IAChB,uEAAuE;IACvE,KAAK,EAAE,MAAM,CAAC;IACd,uEAAuE;IACvE,KAAK,EAAE,MAAM,CAAC;IACd,2DAA2D;IAC3D,UAAU,EAAE,MAAM,CAAC;IACnB,8FAA8F;IAC9F,oBAAoB,EAAE,MAAM,CAAC;IAC7B,mGAAmG;IACnG,UAAU,EAAE,OAAO,CAAC;IACpB,sFAAsF;IACtF,QAAQ,EAAE,OAAO,CAAC;IAClB,uEAAuE;IACvE,aAAa,EAAE,MAAM,CAAC;IACtB,iFAAiF;IACjF,cAAc,EAAE,MAAM,CAAC;IACvB,6FAA6F;IAC7F,sBAAsB,EAAE,MAAM,CAAC;IAC/B,mDAAmD;IACnD,aAAa,EAAE,MAAM,CAAC;IACtB,8EAA8E;IAC9E,IAAI,EAAE,UAAU,GAAG,SAAS,CAAC;IAC7B,mGAAmG;IACnG,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B;;;OAGG;IACH,gBAAgB,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC;;;OAGG;IACH,YAAY,EAAE,MAAM,GAAG,SAAS,CAAC;CAClC;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,qDAAqD;IACrD,IAAI,EAAE,cAAc,EAAE,CAAC;IACvB,2DAA2D;IAC3D,eAAe,EAAE,MAAM,CAAC;IACxB;;;OAGG;IACH,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC;;;OAGG;IACH,iBAAiB,EAAE,MAAM,GAAG,SAAS,CAAC;IACtC;;;OAGG;IACH,YAAY,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC;;;OAGG;IACH,cAAc,EAAE,OAAO,GAAG,SAAS,CAAC;IACpC;;;OAGG;IACH,kBAAkB,EAAE,YAAY,EAAE,CAAC;CACpC;AAMD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,WAAW,EAClB,OAAO,EAAE,kBAAkB,GAC1B,iBAAiB,CA0FnB"}
|
package/dist/route-timing.js
CHANGED
|
@@ -101,6 +101,7 @@ export function computeRouteTiming(route, options) {
|
|
|
101
101
|
distanceNm: leg.distanceNm,
|
|
102
102
|
cumulativeDistanceNm: leg.cumulativeDistanceNm,
|
|
103
103
|
crossesGap: leg.crossesGap,
|
|
104
|
+
unusable: leg.unusable,
|
|
104
105
|
trueCourseDeg,
|
|
105
106
|
trueHeadingDeg: triangle.trueHeadingDeg,
|
|
106
107
|
windCorrectionAngleDeg: triangle.windCorrectionAngleDeg,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@squawk/flightplan",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.9.1",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Flight plan route string parsing and resolution using composed navigation resolvers",
|
|
6
6
|
"author": "Neil Cochran",
|
|
@@ -43,21 +43,21 @@
|
|
|
43
43
|
},
|
|
44
44
|
"dependencies": {
|
|
45
45
|
"@squawk/flight-math": "^0.5.9",
|
|
46
|
-
"@squawk/geo": "^0.5.
|
|
47
|
-
"@squawk/types": "^0.
|
|
46
|
+
"@squawk/geo": "^0.5.5",
|
|
47
|
+
"@squawk/types": "^0.15.0",
|
|
48
48
|
"@types/geojson": "^7946.0.16"
|
|
49
49
|
},
|
|
50
50
|
"devDependencies": {
|
|
51
|
-
"@squawk/airport-data": "^0.
|
|
52
|
-
"@squawk/airports": "^0.7.
|
|
53
|
-
"@squawk/airway-data": "^0.
|
|
54
|
-
"@squawk/airways": "^0.
|
|
55
|
-
"@squawk/fix-data": "^0.7.
|
|
56
|
-
"@squawk/fixes": "^0.5.
|
|
57
|
-
"@squawk/navaid-data": "^0.7.
|
|
58
|
-
"@squawk/navaids": "^0.6.
|
|
59
|
-
"@squawk/procedure-data": "^0.9.
|
|
60
|
-
"@squawk/procedures": "^0.8.
|
|
51
|
+
"@squawk/airport-data": "^0.9.0",
|
|
52
|
+
"@squawk/airports": "^0.7.8",
|
|
53
|
+
"@squawk/airway-data": "^0.7.1",
|
|
54
|
+
"@squawk/airways": "^0.7.1",
|
|
55
|
+
"@squawk/fix-data": "^0.7.7",
|
|
56
|
+
"@squawk/fixes": "^0.5.8",
|
|
57
|
+
"@squawk/navaid-data": "^0.7.7",
|
|
58
|
+
"@squawk/navaids": "^0.6.8",
|
|
59
|
+
"@squawk/procedure-data": "^0.9.3",
|
|
60
|
+
"@squawk/procedures": "^0.8.3",
|
|
61
61
|
"@types/node": "^26.6.4"
|
|
62
62
|
},
|
|
63
63
|
"keywords": [
|