1. Overview
A navidata file is a single binary file holding everything the EFIS knows about the aviation world outside your own user waypoints: airports with their runways and radio frequencies, navaids, fixes, airspace and obstacles. MGL EFIS systems load it from the SD card; MGL Central can create, import and edit it.
The file is built for a small embedded computer. Instead of a database, it is a set of sections of fixed-size records, plus small lookup tables that let the EFIS jump straight to the part it needs (for example, “waypoints near longitude 88° W”) without reading the whole file.
| Section | Holds | Looked up by |
|---|---|---|
| Header | Counts, section locations, date, AIRAC cycle | Always read first |
| Waypoints | Every point: airports, navaids, fixes (position, name, type, frequency or elevation) | Longitude, via the WAT |
| Waypoint Allocation Table (WAT) | Where each 1° longitude band of waypoints starts | Longitude |
| Airport index | Airport identifiers, sorted, with a pointer to each airport's details | Identifier (binary search) |
| Airport info | Frequencies and runways per airport | From the index or the airport's waypoint |
| Airspace | Airspace outlines, limits and names | 10° × 10° map tiles |
| Obstacles | Towers, turbines, buildings… with heights and lighting | 1° × 1° grid cells |
The header also has slots for airways, SIDs, STARs and holding patterns, but MGL never defined a format for them. Open-data files set them to zero.
2. Where this description comes from
MGL's written specification is an unfinished draft (March 2014) and is wrong in several places. This description was checked against, in order of authority:
- Real MGL files (
navidataUS.ewd (from Michigan Avionics),navidataZA.ewd (from MGL Avionics), and files re-saved by MGL Central). When the bytes disagree with a document, the bytes win. - MGL's “rainier”, the format's author, in the MGL forum thread “NAVIDATA format spec question”.
- The G4 firmware source, which shows how the EFIS actually reads each field.
- The draft PDF, “MGL Avionics Navidata file format, version 5”.
Every difference from the draft is listed in section 13.
3. Basics: numbers, positions, strings, dates
| Item | How it's stored | Example |
|---|---|---|
| Integers | Little-endian (least significant byte first). 8, 16 or 32 bits, signed or unsigned. | 496 = bytes F0 01 00 00 |
| Latitude / longitude | Signed 32-bit, in units of 1/180,000 of a degree (0.02 arc-seconds, about 0.6 m). North and east are positive. | N45°59′30″ = 45.9917 × 180000 = 8278500 |
Fixed string ShortString[N] | 1 length byte, then a field of exactly N bytes; unused bytes are padding. Takes N+1 bytes. | Short name: ShortString[6] = 7 bytes |
| Variable string | 1 length byte, then exactly that many bytes. | Frequency descriptions, airspace names |
| Date | Unsigned 32-bit seconds since 1 January 2000, 00:00. | |
| Elevation (airports, runways, airport waypoints) | Feet plus 1000, so the value stays positive below sea level. | 809 ft stored as 1809 |
4. File layout
Sections appear in this order in files written by MGL Central and by this tool. The EFIS finds each one through the pointers in the header, so the order itself isn't required.
offset 0 +---------------------------------------------+
| Header 496 bytes |
offset 496 +---------------------------------------------+
| Airport index (size + 20-byte records) |
+---------------------------------------------+
| Airport info (frequencies + runways) |
+---------------------------------------------+
| Airspace (648-tile directory + records)|
+---------------------------------------------+
| Obstacles (grid header + bins + records)|
+---------------------------------------------+
| Waypoints (52-byte records) |
+---------------------------------------------+
| WAT (361 x 8 bytes = 2,888 bytes) |
+---------------------------------------------+
5. The three kinds of pointer
A pointer is a number saying where something is in the file. The format measures pointers from three different starting points, and mixing them up is the most common way to produce a broken file.
| Pointer | Measured from | Example |
|---|---|---|
| Header section pointers | Start of the file. The draft says “after the header”; that's out of date. | Airport index at 496 |
| Airport index → airport info | End of the header: add 496. | KOSH: stored 775982, record at 776478 |
| Inside an airport record | A local starting point in that record (see section 9). | Frequency and runway tables |
Waypoint records have one more link, AirportInfoReference, measured from the start of the airport info section.
6. Header (496 bytes)
| Offset | Field | Meaning |
|---|---|---|
| 0 | FileID | The text NAVIDATA |
| 8 | Vendor | 0 = open, unencrypted data. Other values are copy-protected commercial data. |
| 12 | NaviDataDate | When the file was made |
| 16–407 | Magic numbers, 32 serials | Copy protection; all zero for open data |
| 408–411 | Sections / encryption / version | 10 / 0 / 5 |
| 412–423 | Airports: count, index pointer, info pointer | |
| 424–431 | Airspaces: count, pointer | |
| 432–455 | Airways, SIDs, STARs | All 0 (format never defined) |
| 456–463 | Obstacles: count, pointer | If the count is 0 the pointer is meaningless and must be ignored. |
| 464–475 | Waypoints: count, pointer, WAT pointer | |
| 476–483 | Start / end dates | Validity period; may be 0 |
| 484 | CycleStr | 4-character AIRAC cycle, e.g. 2610; may be blank |
| 488–495 | Holding patterns | 0 |
7. Waypoints
Every point the EFIS can show or navigate to is a waypoint record, including airports and navaids. The airport sections only add extra detail for airport-type waypoints. Each record is 52 bytes:
| Offset | Size | Field | Meaning |
|---|---|---|---|
| 0 | 4 | Latitude | 1/180,000 degree |
| 4 | 4 | Longitude | 1/180,000 degree |
| 8 | 4 | DataField | Depends on the type (below) |
| 12 | 1 | Type | Bits 0–6: waypoint type. Bit 7: steering allowed. |
| 13 | 7 | ShortName | Identifier, up to 6 characters (KOSH, OSH, BUOYE) |
| 20 | 28 | LongName | Description, up to 27 characters |
| 48 | 4 | AirportInfoReference | For airports: where its airport info record is, from the start of the airport info section. 0 for everything else. |
AirportInfoReference is missing, MGL Central still shows the airport, but its frequency and runway panels come up empty.Waypoint types
| Code | Type | Code | Type |
|---|---|---|---|
| 0 | WAYPOINT | 12 | VOR/DME |
| 1 | AIRPORT | 13 | VORTAC |
| 2 | MAJOR AIRPORT | 14 | FAN MARKER |
| 3 | SEAPLANE BASE | 15 | VOR |
| 4 | AIRFIELD | 16 | REP-PT (reporting point) |
| 5 | PRIVATE AIRFIELD | 17, 18 | LFR, UHF-NDB |
| 6 | ULTRALIGHT FIELD | 20–22 | M-NDB/DME, LOM, LMM |
| 7 | INTERSECTION | 23, 24 | LOC/SDF, MLS/ISMLS |
| 8 | HELIPORT | 25 | OTHER NAV |
| 9 | TACAN | 26–30 | Route actions (altitude/speed change, notify); not map points |
| 10, 11 | NDB/DME, NDB |
What DataField holds
| Types | DataField |
|---|---|
| 0–6, 8 (waypoints and airports) | Elevation in feet + 1000 |
| 7 (intersection) | Unused |
| VHF navaids (VOR, VOR/DME, VORTAC, TACAN…) | Frequency in kHz: 113.200 MHz = 113200 |
| NDB family (NDB, NDB/DME, LOM…) | Frequency in Hz: 329 kHz = 329000 |
| 16 (REP-PT) | Frequency of the associated navaid, if any |
8. Waypoint Allocation Table (WAT)
The WAT lets the EFIS find the waypoints in a longitude band without reading them all. It has 361 entries of 8 bytes, one per degree of longitude from 180° W to 180° E. Each entry holds a count and a start index.
- Waypoints must be sorted by longitude, west to east; equal longitudes are sorted by short name.
- A waypoint's band is its longitude rounded toward zero, plus 180. So 88.6° W (−88.6) is band 92.
- For a band with waypoints, the start index is the position of its first waypoint. Empty bands store 0, not the running total; MGL Central relies on this.
- All counts add up to the number of waypoints.
Example: if band 92 has count 1,250 and start 40,100, waypoints 40,100 to 41,349 all lie between 88° W and 89° W.
9. Airport index and airport info
Airport index
Starts right after the header (offset 496) with a 4-byte number giving the index size in bytes, then one 20-byte entry per airport, sorted by identifier so the EFIS can binary-search it.
| Offset | Size | Field | Meaning |
|---|---|---|---|
| 0 | 1 | Kind | Airport type (waypoint types 1–8) |
| 1 | 7 | Identifier | Up to 6 characters |
| 8 | 4 | Ptr | Airport info record location, from the end of the header (add 496) |
| 12 | 8 | Latitude, Longitude | Airport position |
Airport info record
Each airport's details: a 20-byte fixed part, then its frequencies, then its runways.
| Offset | Size | Field | Meaning |
|---|---|---|---|
| 0 | 4 | RunwaysPointer | Where the runway table starts, measured from the frequency base (this record + 20) |
| 4 | 4 | DataPointer | “Other data”, or 0 (undocumented; not written by this tool) |
| 8 | 2 | Altitude | Elevation, feet + 1000 |
| 10–12 | 3 | Counts | Number of frequencies, runways, other data |
| 13 | 3 | Spare | Padding |
| 16 | 4 | WaypointPointer | Link back to the airport's waypoint |
Frequencies follow at the frequency base: a table of 16-bit pointers (from the frequency base), then the records. Each record is the frequency in Hz (4 bytes), a type of up to 4 characters (TWR, GND, CTAF, ATIS…) and a variable-length description.
Runways follow at RunwaysPointer: a table of 16-bit pointers measured from the start of the runway table, then 36-byte records:
| Offset | Size | Field | Meaning |
|---|---|---|---|
| 0 | 2 | Designation | Encoded pair, see below |
| 2, 4 | 2 + 2 | Length, Width | Feet |
| 6 | 2 | Bearing | True bearing 0–359°, or 0xFFFF if none |
| 8 | 9 | Surface | Short text, e.g. ASPH, CONC, TURF |
| 17 | 3 | Spare | Padding |
| 20 | 8 | Threshold 1 | Latitude and longitude of the first end |
| 28 | 4 | Threshold 2 | Offset from threshold 1 (16-bit latitude, 16-bit longitude) |
| 32 | 4 | Altitude 1, 2 | Threshold elevations, feet + 1000 |
Runway designation
| Encoded value | Kind | Shown as |
|---|---|---|
0x0009 | Number and reciprocal | 09/27 |
0x2009 / 0x3009 | Parallel, first end Left / Right | 09L/27R, 09R/27L |
0x7009 | Water runway | 09W/27W |
0x6001 | Helipad | H1 |
0x8000–0x8007 | Compass-point water lane | N/S, NE/SW… |
For parallel runways the reciprocal swaps L and R: 07L pairs with 25R.
10. Airspace
The world is divided into 648 tiles of 10° × 10° (36 columns × 18 rows, starting at 90° N, 180° W). The section starts with a marker (0xFFFF0001) and one pointer per tile. Each tile holds a linked list of the airspaces that touch it, plus 5° of overlap on each side, so the EFIS only reads the tiles around the aircraft. An airspace that spans several tiles is stored once per tile.
Each airspace record has:
- Fixed part (44 bytes): type, bounding box, pointer to the next record in the tile, pointer to the outline, two frequencies (kHz), upper and lower limits.
- Text: eight variable-length strings: ICAO, name, class, exception, comm name, level, times, weather.
- Outline: a point count, then latitude/longitude pairs. A special point (latitude 200) ends each ring. Arcs and circles must already be turned into points; the format can't store them as curves.
| Type codes | Meaning |
|---|---|
| 1–12 | Advisory, ADIZ, ARTCC, ACC, buffer, control area (Class C), control zone (Class D), FIR, OCA, radar area, TCA (Class B), UIR |
| 32–38 | Alert, danger, MOA, prohibited, restricted, temporary reserved, warning |
Altitude limits pack a unit code in the low 3 bits and the value in the rest: 0 = surface / unlimited, 1 = feet MSL, 2 = feet AGL, 3 = flight level, 4 = ground, 5 = by NOTAM, 6 = undefined.
11. Obstacles
Obstacles are stored in a grid of 1° × 1° cells covering the area that has obstacles.
- Grid header (14 bytes): version, west edge, south edge, width, height (in degrees), the largest cell count, and a check value
0xAA55. - Cell index: 6 bytes per cell (pointer + count), row by row from the south-west corner.
- Obstacle records (16 bytes): latitude, longitude, height above ground (ft), height above sea level (ft), kind (tower, wind turbine, building… 0–45) and lighting (0–8). Within a cell they are sorted west to east.
When a file has no obstacles, MGL Central still writes a fixed empty grid (385,580 bytes) with a negative width and height. This tool writes the same thing so MGL Central reads it the same way.
12. How the EFIS reads the file
From the MGL iEFIS G4 firmware source:
| Limit | Effect |
|---|---|
| 20,000 nearby waypoints | The EFIS loads waypoints within about ±10° of the aircraft into a list of at most 20,000, then sorts it for the nearest list. Because the file is sorted west to east, anything beyond 20,000 (the eastern part) is never loaded. Primary navidata, SNAVI.EWD and user waypoints share the list, in that order. |
| 800 points per airspace | Longer outlines are cut off at 800 points. |
| Map memory (about 10 MB) | Decoded airspace shares it with the vector map; once it's full, further airspaces aren't loaded. |
| Declutter settings | Each waypoint type is shown only at the zoom levels the pilot enables. Intersections and reporting points are usually shown only close in. |
| File size | No practical limit. Obstacles and waypoints are read from the card as needed. |
13. Corrections to MGL's draft specification
| Area | Draft says | Real files |
|---|---|---|
| Header section pointers | From the end of the header | From the start of the file |
| Header size | Not stated | 496 bytes |
| Obstacle pointer when count is 0 | Valid | Meaningless; ignore it |
| Airport index | Records start at the section | A 4-byte size comes first |
| Index → airport info pointer | Unclear | From the end of the header (+496) |
| Airport fixed part | 13 bytes | 20 bytes (3 spare + WaypointPointer) |
| Airport and runway elevations | Feet | Feet + 1000 |
| Frequency pointers | 32-bit | 16-bit |
| Frequency description | Fixed 50 characters | Variable length |
| Runway pointers | From the frequency base | From the start of the runway table |
| Runway record | 33 bytes | 36 bytes (3 spare) |
| Waypoint record | 48 bytes | 52 bytes (+ AirportInfoReference) |
| WAT empty bands | Not stated | Start index 0 |