A simple Python-based VidMap draw tool for use with vNAS.
It is designed to be a stopgap for any facilities that do not have available vidmap data, or low traffic facilities that might not merit a FOIA request.
If you would like to test your maps prior to loading them into vNAS Data Admin, GeoJSON.io is a great tool.
Python3.8 or Later (Tested with Python 3.10.12)
First, download the FAA CIFP zip file. Copy the FAACIFP18
file from the zip into the ./navdata
directory.
Next, create a facility file in the ./facilities
directory with the name of the facility you will be creating. For example, if you are creating a facility for Dover RAPCON, the facility file would be DOV.json
. If the facility ID matches the ID from the Simaware TRACON Project, it will automatically add it to your videomap. The facility file defines what should be drawn into the map.
An example facility file is available in the root folder as example_fac.json
.
The facility json file has the following properties, with the properties marked * being required:
id
*: The FAA three letter identifier for the facilitymagvar
*: The magnetic variance for the facility.airports
: An array of airport objects.fixes
: An array of fix objects. These print as crossed lines, a triangle, or an RNAV point symbol (four-pointed star) at the fix location.vors
: An array of VOR objects.restrictive
: An array of restrictive (Alert, Caution, Danger, MOA, Prohibited, Restricted, Training, Warning) airspace names.
The airport object has the following properties, with the properties marked * being required:
id
*: The identifier for the airport. For airports with an ICAO code, use the ICAO code. Otherwise, use the FAA code (generally only necessary for smaller airports).runways
: A boolean value that tells the script to print the runways for the airport.symbol
: A boolean value that tells the script to print an airport symbol for the airport.centerlines
: An array of centerline objects.
The centerline object has the following properties, with the properties marked * being required:
runway
*: The identifier for the runway in the formatRW[0][0][L/C/R]
. Example:RW04L
.length
*: An integer length value that the centerlines should extend to.crossbars
: An array of decimal values that tells the script to print a crossbar at that distance from the runway threshold.
The fix object has the following properties, with the properties marked * being required:
id
*: The identifier for the fix.defined_by
: An array of VORs that define the fix.frd_point
: A string in the format"VOR/Radial/Distance"
("AML/135/12"
). This overridesdefined_by
but is overridden byrnav_point
rnav_point
: A boolean value that tells the script to draw this point as an RNAV point symbol (four-pointed star). This overrides any defines indefined_by
orfrd_point
.
NOTE: If defined_by
, frd_point
, and rnav_point
are not set, the fix will be drawn as a triangle.
The VOR object has the following properties, with the properties marked * being required:
id
*: The identifier for the VOR.inner_only
: A boolean value that tells the script to print only the inner circle for the VOR. Useful for VORs at airports.
The Restrictive object is an array of restrictive airspace names.
- Alert: use the standard format of
A0[0000][A]
(A, followed by at least one number, and an optional letter, no dashes) - [The FAA doesn't appear to use Caution airspace]
- [The FAA doesn't appear to use Danger airspace]
- MOA: use
M[MOA Name]
(see note, below) - Prohibited, use the standard format of
P0[0000][A]
(P, followed by at least one number, and an optional letter, with no dashes) - Restricted, use the standard format of
R0[0000][A]
(R, followed by at least one number, and an optional letter, with no dashes) - [The FAA doesn't appear to use Training airspace]
- Warning, use the standard format of
W0[0000][A]
(W, followed by at least one number, and an optional letter, with no dashes)
NOTE: Naming in the CIFP file is mostly standardized, but has some quirks, particularly for MOAs. It may be worth opening the CIFP file and searching for the entry. For example, Stumpy Point MOA appears in the file as STUMPY PT. If your program supports regex, you can search with SUSAUR..M
and start typing the MOA name right after the M
(e.g., SUSAUR..MDEMO
for the DEMO MOA). For longer names, the name may actually be truncated. The Tombstone MOA, for example, is truncated as TOMBSTON A
, TOMBSTON B
amd TOMBSTON C
.
Run the following command, where AAA
is the FAA three letter identifier for the facility:
python3 draw.py --facility=[AAA]
The resulting file will be in ./vidmaps
An additional command line argument of --purge
is available to quickly clean up the navdata subfolders. This is particularly useful if you have downloaded a new CIFP file, when you will want to make sure the old navdata has been removed.
The argument can be included as part of a normal vidmap draw. Regardless of its position, the navdata will be cleared prior to attempting to read the new navdata and drawing the videomap.
Purge only:
python3 draw.py --purge
Purge and draw:
python3 draw.py --facility=[AAA] --purge
-OR-
python3 draw.py --purge --facility=[AAA]