Utility to process routes and waypoints used by the British Antarctic Survey (BAS) Air Unit
Project description
BAS Air Unit Network Dataset
Management of the network of routes and waypoints used by the British Antarctic Survey (BAS) Air Unit.
Including a utility for the Air Unit to process routes and waypoints for use in their handheld and aircraft GPS devices.
Overview
Purpose
To support the BAS Air Unit manage their network of routes and waypoints such that:
- information is internally consistent, through defined structures and constraints
- information is interoperable between different systems, through the use of open/standard formats
- information is well described and sharable with other teams, through distribution as datasets
Background
This project was developed in response to discussions and requests with the BAS Air Unit to review and simplify the process they used to manage their network of waypoints, and to ensure it's future sustainability.
BAS staff can read more about this background in this GitLab issue [Internal].
Status
This project is an early alpha, working towards a Minimal Viable Product (MVP). This means:
- all, or parts, of this project:
- may not be working
- may stop working at any time
- may not work correctly, or as expectedly (including destructively)
- may change at any time (in terms of implementation or functionality)
- documentation may be missing or incorrect
- no support is provided for this project
- no real and/or sensitive information should be used with this project
Limitations
This service has a number of limitations, including:
- the default base map used in Garmin BaseCamp is not useful for Antarctica
- the Air Unit Network utility is only supported on Windows computers
- the Air Unit Network utility does not support multiple users importing data at the same time
- the Air Unit Network utility does not create backups when importing new data
- the Air Unit Network utility does not require route names to follow the required naming convention
- the Air Unit Network utility does not require waypoint identifiers to be unique across all waypoints
- the Air Unit Network utility does not require waypoint comments to follow the required structure
- the Air Unit Network utility does not require waypoints within imported routes to be listed as standalone waypoints
- contextual comments for waypoints within a route (e.g. 'Start of route') cannot be set using Garmin BaseCamp
- comments for waypoints use an overly complex structure to support an ad-hoc serialisation format
- Unicode characters (such as emoji) cannot be used in route/waypoint names, comments, etc.
- CSV outputs are not designed for printing (i.e. column formatting and page breaks)
- the workspace directory and its data is only available at Rothera (i.e. it isn't synced back to Cambridge)
Some or all of these limitations will be addressed in Future improvements to this project.
Future improvements
See the project issue tracker for a backlog of planned features and ideas to further improve this project.
Usage
Workspace directory
The workspace directory contains all files related to this project. This directory should be shared between all users/computers that require access by storing on a shared drive or synced folder accessible to relevant users.
A typical/example workspace directory contains:
/path/to/workspace/directory
├── bas-air-unit-network-dataset.gpkg
├── input.gpx
└── output/
├── CSV/
│ ├── 00_WAYPOINTS_2022_07_08.csv
│ ├── 00_WAYPOINTS_2022_07_08_DD.csv
├── FPL/
│ ├── 00_WAYPOINTS_2022_07_08.fpl
│ ├── 01_BRAVO_TO_ALPHA.fpl
│ ├── 02_BRAVO_TO_BRAVO.fpl
│ └── 03_bBRAVO_TO_LIMA.fpl
└── GPX/
└── 00_NETWORK_2022_07_08.gpx
- the
output/
directory contains files for use in GPS devices and as print outs, organised by file type (CSV, GPX and FPL) - the
input.gpx
file contains routes and waypoints exported from Garmin BaseCamp to be imported into the Air Unit Network utility - the
bas-air-unit-network-dataset.gpkg
file is a GeoPackage used internally by the Air Unit Network utility
Note: To create a new workspace directory, see the Setup section.
Access control
The Air Unit Network utility does not include access control, therefore the permissions applied to the working directory should be used if access to information needs to be restricted. It is recommended that wrtite permissions on the directory are restricted to users that need to edit information.
Workflow
Note: You need to complete the steps in the Installation section to complete this workflow.
To update waypoints and routes (the network) and create new files for use in GPS devices and as print outs:
- waypoints and routes are created and edited using Garmin BaseCamp
- export routes and waypoints from BaseCamp as a GPX file
- import the GPX file into the Air Unit Network utility
- use the utility to export the network in a range of formats (CSV, GPX and FPL)
The sub-sections below describe these steps in more detail.
Managing waypoints in BaseCamp
Create a new waypoint
- from the start menu, launch BaseCamp
- from the upper left hand panel, under My Collection, select BAS Air Unit Network -> BAS Air Unit Network
- choose the Create a waypoint tool (flag icon) from the top middle toolbar (creation tools)
- select the general location of the waypoint (precise position can be entered later)
- from the General tab of the waypoint properties screen that opens:
- enter a suitable Name or identifier (maximum 6 characters)
- enter a suitable Comment, which consists of 5 elements in the order below, each separated with a
|
(vertical bar) character:- name: a full, or formal name for the waypoint (maximum 17 characters)
- co-located with: name of a related depot, instrument and/or other feature - use
N/A
if not relevant - last accessed at: date waypoint was last accessed in the form
YYYY-MM-DD
- useN/A
if unvisited - last accessed by: pilot that that last accessed waypoint - use
N/A
if unvisited - other information: any other information - use
N/A
if not relevant
- from the Advanced tab:
- if necessary, edit the Position to the correct latitude and longitude in degrees, decimal minutes (DDM) format
- close the waypoint properties screen
For example (a co-located, previously visited, waypoint with a full name and additional information):
- name:
ALPHA
- comment:
Alpha 001 | Dog | 2014-12-24 | CW | Bring treats.
- position:
S69° 54.910' W75° 00.878'
For example (a standalone, unvisited, waypoint with no full/formal name or additional information):
- name:
BRAVO
- comment:
N/A | N/A | N/A | N/A | N/A
- position:
S70° 49.810' W75° 11.420'
Note: Only the 'name' in a comment will be included in FPL waypoints.
Edit an existing waypoint
- from the start menu, launch BaseCamp
- from the upper left hand panel, under My Collection, select BAS Air Unit Network -> BAS Air Unit Network
- from the lower left hand panel, right click the waypoint to be edited and select Get Info
- from the waypoint properties screen, update (as needed):
- the name (identifier)
- comment (see rules above for how comments must be written)
- position
Managing routes in BaseCamp
Create a new route
- from the start menu, launch BaseCamp
- from the upper left hand panel, under My Collection, select BAS Air Unit Network -> BAS Air Unit Network
- choose the Create a route tool (path/network icon) from the top middle toolbar (creation tools)
- from the window that opens:
- enter the starting waypoint using the search box
- enter the ending waypoint using the search box
- select the Go command
- from the Via Points tab of the route properties screen that opens:
- un-tick the Autoname checkbox
- rename the route as per the route naming convention:
{Route Number}_{Start Waypoint Identifier}_To_{End Waypoint Identifier}
- for example:
01_ALPHA_TO_BRAVO
- the first route should use
01
as a route number,00
is a reserved value and should not be used
- if additional waypoints should be added between start and end waypoints:
- from the lower left navigation panel, drag waypoints into the route properties screen, in its position within the route
- close the route properties screen
Edit an existing route
- from the start menu, launch BaseCamp
- from the upper left hand panel, under My Collection, select BAS Air Unit Network -> BAS Air Unit Network
- from the lower left hand panel, right click the route to be edited and select Get Info
- to remove a waypoint from the route:
- right click the route waypoint from the list and select Remove
- to add a new waypoint to the route:
- from the lower left navigation panel, drag waypoints into the route properties screen, in its position within the route
- if the start or end waypoint in the route has changed, update the route name (see rules above for format)
Saving waypoints and routes from BaseCamp
- from the start menu, launch BaseCamp
- from the upper left hand panel, under My Collection, select BAS Air Unit Network -> BAS Air Unit Network
- from the File menu, select Export "BAS Air Unit Network"
- name the file
input.gpx
and save to the Workspace directory (the existing file should be overwritten) - set the export format as GPX v1.1
Importing waypoints and routes into the Network utility
- from the start menu, launch Command Prompt and run the commands in [1]
WARNING: Importing replaces all existing information. Ensure you have suitable backups of existing data.
[1]
$ C:\ProgramData\Miniconda3\envs\airnet\Scripts\activate.bat
# navigate to the workspace directory
(airnet) $ cd '/path/to/workspace/directory'
(airnet) $ C:\ProgramData\Miniconda3\envs\airnet\python.exe C:\ProgramData\Miniconda3\envs\airnet\Scripts\airnet.exe import --dataset-path bas-air-unit-network-dataset.gpkg --input-path input.gpx
Dataset is located at: /path/to/workspace/directory/bas-air-unit-network-dataset.gpkg
Input is located at: /path/to/workspace/directory/input.gpx
<NetworkManager : 12 Waypoints - 3 Routes>
Waypoints [12]:
01. <Waypoint 01G7T144RF7WENM8PBKC15W1YB :- [ALPHA_], POINT (-75.01463335007429 -69.91516669280827)>
02. <Waypoint 01G7T144RFVMA8XSD2NES8EFW0 :- [BRAVO_], POINT (-75.19033329561353 -70.8301666751504)>
03. <Waypoint 01G7T144RFBM65YQC317D7XCC8 :- [CHARLE], POINT (-71.49899996817112 -71.76016665995121)>
04. <Waypoint 01G7T144RFXNTDVKXCEBTW4DSJ :- [DELTA_], POINT (-66.09375 -72.7509999834001)>
05. <Waypoint 01G7T144RFMSAZZQEAD5ANBTAN :- [ECHO__], POINT (-61.611166689544916 -73.45333331264555)>
06. <Waypoint 01G7T144RFVJFRW1VY0MFQNW06 :- [FOXTRT], POINT (-70.22449999116361 -73.17583330906928)>
07. <Waypoint 01G7T144RFSM18AJ9G2A3GKGZ9 :- [GOLF__], POINT (-70.3125 -74.20000003650784)>
08. <Waypoint 01G7T144RFFA3B2009P6FAXC3H :- [HOTEL_], POINT (-65.43449998833239 -74.42566668614745)>
09. <Waypoint 01G7T144RFP1F3EB58V421Y65S :- [INDIA_], POINT (-63.017566641792655 -75.70466665551066)>
10. <Waypoint 01G7T144RFTW3RN38TNR6TJ585 :- [JULIET], POINT (-58.93050002865493 -76.34150002151728)>
11. <Waypoint 01G7T144RFV5N138VMTC80WTA1 :- [KILO__], POINT (-55.37100004032254 -77.16683333739638)>
12. <Waypoint 01G7T144RFNDB0TEMY911J8VN7 :- [LIMA__], POINT (-50.8461666572839 -78.08921668678522)>
Routes [3]:
01. <Route 01G7T144RF040ETQSEBGS73A9Z :- [01_BRAVO_TO_ALPHA], 2 waypoints, Start/End: BRAVO / ALPHA >
02. <Route 01G7T144RFAN8RKG006NJ2CC4B :- [02_BRAVO_TO_BRAVO], 9 waypoints, Start/End: BRAVO / BRAVO >
03. <Route 01G7T144RFGTXKKJGA1V6CM24F :- [03_BRAVO_TO_LIMA], 8 waypoints, Start/End: BRAVO / LIMA >
Import complete
Exporting waypoints and routes using the Network utility
- from the start menu, launch Command Prompt and run the commands in [1]
[1]
$ C:\ProgramData\Miniconda3\envs\airnet\Scripts\activate.bat
# navigate to the workspace directory
(airnet) $ cd '/path/to/workspace/directory'
(airnet) $ C:\ProgramData\Miniconda3\envs\airnet\python.exe C:\ProgramData\Miniconda3\envs\airnet\Scripts\airnet.exe export --dataset-path bas-air-unit-network-dataset.gpkg --output-path output/
Dataset is located at: /path/to/workspace/directory/bas-air-unit-network-dataset.gpkg
Output directory is is: /path/to/workspace/directory/output
- CSV export complete
- GPX export complete
- FPL export complete
Export complete
Installation
Install software
Note: You will need an internet connection, administrator rights and access to the Installation bundle to install the Air Unit Network utility.
To install software needed to manage the Air Unit Network dataset:
- ensure all required Windows updates are installed
- download, or copy from a hard drive, the Installation bundle
- these instructions assume you will download, or copy, the bundle to your Downloads directory
- from the installation bundle, install Garmin BaseCamp, and optionally, QGIS:
- run
garmin-basecamp-installer.exe
to install Garmin BaseCamp - optionally, run
qgis-installer.msi
to install the Long Term Support (LTS) version of QGIS
- run
- from the installation bundle, install Miniconda (needed to run the Air Unit Network utility):
- run
miniconda-installer.exe
to install Miniconda - select the All users (requires admin privileges) installation option when asked
- run
- from the installation bundle, install LibXML2 (needed to run the Air Unit Network utility):
- unzip the
libxml2.zip
archive to a temporary directory - copy the
libxml2
directory toC:\Program Files
, such thatC:\Program Files\bin\xmllint.exe
exists - from Windows Explorer, right click This PC from the left hand panel and click Properties
- from the left hand menu of the System Control Panel screen, click Advanced system settings
- from the Advanced tab of the System Properties screen, click Environment Variables
- from the bottom section (System variables) select the Path variable and click Edit:
- from the Edit environment variable screen, click New
- enter
C:\Program Files\libxml2\bin
as a new entry (at the bottom of the list)
- click OK, then OK, then OK again and close Control Panel
- delete the temporary directory created earlier
- unzip the
- from the installation bundle, install the Air Unit Network utility virtual environment:
- unzip the
airnet-virtual-environment.zip
archive to a temporary directory (this will take some time) - from the View tab in Explorer, check the Hidden items checkbox
- copy the
airnet
directory toC:\ProgramData\Miniconda3\envs
, such thatC:\ProgramData\Miniconda3\envs\airnet\Scripts\airnet.exe
exists - delete the temporary directory created earlier
- optionally, uncheck the Hidden items checkbox in Explorer
- unzip the
Note: Only versions of software within the Installation Bundle are supported.
Configure software
Configure Garmin BaseCamp
To configure Garmin BaseCamp needed to manage the Air Unit Network dataset:
- from the start menu, launch BaseCamp
- when asked for an activity type, select Direct
- from the upper left hand panel, under My Collection:
- right-click and select New List folder
- name the folder
BAS Air Unit Network
- within this new folder:
- right-click and select New List
- name the list
BAS Air Unit Network
- from the upper left hand panel, under My Collection, select BAS Air Unit Network -> BAS Air Unit Network
- from the File menu, select Import into "BAS Air Unit Network"
- select the
input.gpx
file from the Workspace directory
Installation bundle
The installation bundle is a folder of supported software installers and packages. It is designed to run offline and be distributed via an external hard-drive.
The definitive installation bundle is stored in the MAGIC Office 365 OneDrive and is accessible to all BAS staff. When South, MAGIC will hold a copy of the installation bundle on a hard drive.
Software in the installation bundle will be updated periodically after testing, and when new versions of the Air Unit Network utility are released.
Note: Only versions of software within the Installation Bundle are supported.
Implementation
This project consists of:
- a description of the waypoints and routes datasets for the BAS Air Unit
- a Python command line utility to:
- store waypoints and routes in a structured/neutral format (currently a GeoPackage)
- import waypoints and routes from a GPX file from an editor such as Garmin BaseCamp
- export waypoints and routes into a range of output formats (currently CSV, GPX and Garmin FPL)
Information model
The BAS Air Unit Network information model consists of two entities, forming two, related, datasets:
- Waypoints: Features representing landing sites used by the Air Unit, usually co-located with a BAS Operations depot, field camp or a science/monitoring instrument
- Routes: Features representing formally defined, frequently travelled, paths between two or more Waypoints, as opposed to ad-hoc paths
For example:
- Waypoints: Fossil Bluff
- Routes: Rothera to Fossil Bluff
There is a many-to-many relationship between Waypoints and Routes. I.e. a Waypoint can be part of many Routes, and Routes can contain many Waypoints.
Note: This information model is abstract and requires implementing. See the Data model section for the current implementation.
Waypoints (information model)
Property | Name | Type | Occurrence | Length | Description | Example |
---|---|---|---|---|---|---|
id |
ID | String | 1 | 1 - .. | Unique identifier | '01G7MY680N332AW9H9HR9SG15T' |
identifier |
Identifier | String | 1 | 1 - 6 | Unique reference | 'ALPHA' |
geometry |
Geometry | Geometry (2D/3D Point, EPSG:4326) | 1 | - | Position or location as a single coordinate | 'SRID=4326;Point(-75.014648 -69.915214)' |
name |
Name | String | 0-1 | 1 - 17 | Full or formal name | 'Alpha 001' |
colocated_with |
Co-located With | String | 0-1 | 1 - .. | Features (from other domains) associated with the waypoint | 'Depot: Foo' |
last_accessed_at |
Last Accessed At | Date | 0-1 | 1 - .. | When the Waypoint was last accessed or visited | '2014-12-24' |
last_accessed_by |
Last Accessed By | String | 0-1 | 1 - .. | Who last accessed or visited the Waypoint | 'Conwat' |
comment |
Comment | String | 0-1 | 1 - .. | Freetext description or comments | 'Alpha 001 is on a high ridge ...' |
ID (Waypoint)
IDs:
- MUST be unique
- MUST NOT be based on any information contained within the Waypoint
- MAY use any format/scheme:
- the same scheme SHOULD be used for all IDs
- non-sequential schemes are recommended
Note: This ID can be used to refer to each Waypoint in other systems (i.e. as an foreign identifier).
Identifiers (Waypoint)
Identifiers:
- MUST be between 1 and 6 uppercase alpha-numeric characters without spaces (A-Z, 0-9)
- MUST be unique across all Waypoints
Geometry (Waypoint)
Geometries:
- MUST be expressed in decimal degrees using the EPSG:4326 projection.
- MUST consist of either:
- a longitude (X) and latitude (Y) dimension (2D point)
- a longitude (X), latitude (Y) and elevation (Z) dimension (3D point)
Name (Waypoint)
If specified:
- MUST be between 1 and 17 uppercase alpha-numeric or space characters (A-Z, 0-9, ' ')
Co-located with (Waypoint)
No special comments.
Last accessed at (Waypoint)
If specified:
- MUST be expressed as an ISO 8601-1:2019 date instant
Last accessed by (Waypoint)
If specified:
- MUST unambiguously reference an individual
- MAY use any scheme:
- the same scheme SHOULD be used for all Waypoints
Comment (Waypoint)
No special comments.
Routes (information model)
Property | Name | Type | Occurrence | Length | Description | Example |
---|---|---|---|---|---|---|
id |
ID | String | 1 | 1 - .. | Unique identifier | '01G7MZB9X0R8S7RTNYAMAQKHE4' |
name |
Name | String | 1 | 1 - .. | Name or reference | '01_ALPHA_TO_BRAVO' |
waypoints |
Waypoints | List of Waypoint entities | 2-n | - | Sequence of Waypoints | - |
ID (Route)
IDs:
- MUST be unique
- MUST NOT be based on any information contained within the Route
- MAY use any format/scheme:
- the same scheme SHOULD be used for all IDs
- non-sequential schemes are recommended
Note: This ID can be used to refer to each Route in other systems (i.e. as an foreign identifier).
Name (Route)
Names:
- MUST use the format
{Sequence}_{First Waypoint Identifier}_TO_{Last Waypoint Identifier}
, where{Sequence}
is a zero padded, auto-incrementing prefix (e.g. '01_', '02_', ..., '99_').
Waypoints (Route)
Waypoints in Routes:
- MUST be a subset of the set of Waypoints
- i.e. waypoints in routes MUST be drawn from a common set, rather than defined ad-hoc or inline within a Route
- MUST be expressed as a sequence:
- i.e. a list in a specific order from a start to finish via any number of other places
- MUST contain at least 2 Waypoints but MAY contain more:
- i.e. a start and end
- MAY be included multiple times
- i.e. the start and end can be the same Waypoint, or a route may pass through the same waypoint multiple times
- MAY include a contextual comment or description
- e.g. 'Start of route'
Data model
The BAS Air Unit Network data model implements the Information model using three entities:
- Waypoint: Point features with attributes
- Route: Features to contextualise a set of Waypoints, with attributes (such as route name)
- RouteWaypoint: join between a Waypoint and a Route, with contextual attributes (such as sequence within route)
This data model describes how these entities are:
- persisted as features within layers within an OGC GeoPackage (version 1.2)
- represented as Python class instances (objects)
This GeoPackage, and the data it contains, is considered the Source of Truth and definitive version/format.
Note: This data model does not describe how entities are encoded in specific Output Formats.
Note: This data model does not describe specifics about how entities are encoded in GeoPackages (i.e. database schema), or describe GeoPackage meta tables, which are managed automatically by libraries used by this utility.
FIDs
Feature Identifiers (FIDs) are created automatically when features are persisted to GeoPackages. FIDs are unique auto-incrementing integers, and used as primary keys within database tables.
FIDs SHOULD be considered an implementation detail, and SHOULD be ignored in favour of ID properties (i.e. 'ID' rather than 'FID').
FIDs SHOULD NOT be exposed to end users and their values or structure MUST NOT be relied upon.
ULIDs
Universally Unique Lexicographically Sortable Identifier (ULID)s are the scheme used for identifiers (IDs).
These IDs MAY be exposed to end users.
Waypoints (data model)
Python class:
Waypoint
(single waypoint)WaypointCollection
(waypoints set)
GeoPackage layer: waypoints
Property | Name | Data Type | Nullable | Unique | Max Length | Notes |
---|---|---|---|---|---|---|
fid |
Feature ID | Integer | No | Yes | - | Internal to database, primary key, auto-incrementing |
id |
ID | ULID (String) | No | Yes | - | - |
identifer |
Identifier | String | No | Yes | 6 | - |
geometry |
Geometry | 2D/3D Point | No | No | - | - |
name |
Name | String | Yes | No | 17 | - |
colocated_with |
Co-located With | String | Yes | No | - | - |
last_accessed_at |
Last Accessed At | Date | Yes | No | - | - |
last_accessed_by |
Last Accessed By | String | Yes | No | - | - |
comment |
Comment | String | Yes | No | - | - |
Routes (data model)
Python class:
Route
(single route)RouteCollection
(routes set)
GeoPackage layer: routes
Property | Name | Data Type | Nullable | Unique | Max Length | Notes |
---|---|---|---|---|---|---|
fid |
Feature ID | Integer | No | Yes | - | Internal to database, primary key, auto-incrementing |
id |
ID | ULID (String) | No | Yes | - | - |
name |
Name | String | No | Yes | - | - |
Route Waypoints (data model)
Python class:
RouteWaypoint
(single waypoint in route)
GeoPackage layer: route_waypoints
Property | Name | Data Type | Nullable | Unique | Max Length | Notes |
---|---|---|---|---|---|---|
fid |
Feature ID | Integer | No | Yes | - | Internal to database, primary key, auto-incrementing |
route_id |
Route ID | ULID (String) | No | Yes | - | Foreign key to Route entity |
waypoint_id |
Waypoint ID | ULID (String) | No | Yes | - | Foreign key to Waypoint entity |
sequence |
Sequence | Integer | No | Yes (within Route) | - | Position of waypoint within a route, value must be unique within each route |
comment |
Comment | String | Yes | No | - | - |
Note: Though the route_id
and waypoint_id
columns are effectively foreign keys, they are not configured as
such within the GeoPackage.
Source data
Input/source data MUST be saved in a GPX (GPS Exchange Format) version 1.1 file to be imported into this project.
Note: Only GPX files produced by Garmin BaseCamp are supported. GPX files produced by other tools may also work but are not formally supported.
Limitations:
- Garmin BaseCamp does not support custom GPX extensions, except Garmin's own, limiting fields to the core GPX specification
- this requires non-standard fields (such as
waypoint.last_accessed_at
) to be added to the comment freetext field, making it more complex (see notes in the Creating a Waypoint section)
Test network
A test network of 12 waypoints and 3 routes is used to:
- test various edge cases
- provide consistency for repeatable testing
- prevent needing to use real data that might be sensitive
Note: Route and waypoints in the test network are arbitrary and do not reflect any actual features.
WARNING! This test network is entirely fictitious. It MUST NOT be used for any real navigation.
A Workspace Directory for the test network is maintained in the MAGIC Office 365 OneDrive and is accessible to all BAS staff. When South, MAGIC will hold a copy of the test network on a hard drive.
A QGIS project is provided to visualise the test network and ensure exported outputs match expected test data.
Output formats
Supported formats
Note: The GeoPackage used in the Data Model is not a supported output format.
Format use-cases:
Format | Use Case |
---|---|
CSV | Human readable, printed reference |
GPX | Machine readable, handheld GPS |
FPL | Machine readable, aircraft GPS |
Format details:
Format | Name | Version | Encoding | Open Format | Restricted Attributes | Extensions Available | Extensions Used |
---|---|---|---|---|---|---|---|
CSV | Comma Separated Value | N/A | Text | Yes | No | No | N/A |
GPX | GPS Exchange Format | 1.1 | XML | Yes | Yes | Yes | No |
FPL | (Garmin) Flight Plan | 1.0 | XML | No (Vendor Specific) | Yes | Yes | No |
Outputs produced for each format:
Format | Each Waypoint | Each Route | All Waypoints (Only) | All Routes (Only) | Waypoints and Routes (Combined) |
---|---|---|---|---|---|
CSV | No | No | Yes | No [1] | No |
GPX | No | No | No [1] | No [1] | Yes |
FPL | No | Yes | Yes | No | No |
Where 'All Waypoints (Only)' outputs are produced, waypoints will be sorted alphabetically.
[1] These outputs can be produced but are intentionally excluded as they aren't used by the Air Unit. See this GitLab issue [Internal] for details.
Output file names
Output files use an internal naming convention for all formats:
Export Type | File Name (Pattern) | File Name (Example) |
---|---|---|
Each Waypoint | N/A | N/A |
Each Route | {route name}.ext |
01_ALPHA_TO_BRAVO.ext |
All Waypoints (Only) | 00_WAYPOINTS_{current date}.ext |
00_WAYPOINTS_2014_12_24.ext |
All Routes (Only) | 00_ROUTES_{current date}.ext |
00_ROUTES_2014_12_24.ext |
Waypoints and Routes (Combined) | 00_NETWORK_{current date}.ext |
00_NETWORK_2014_12_24.ext |
Where .ext
is a relevant file extension for each format (i.e. .csv
for CSV outputs).
Output format - CSV
Notes:
- CSV outputs use the first row as a column names header
- outputs produced for all routes use a
route_name
column to distinguish rows related to each route waypoint.geometries
can optionally be included as separate latitude (Y) and longitude (X) columns in either:- decimal degrees (
latitude_dd
,longitude_dd
columns) - native format - degrees, decimal minutes (
latitude_ddm
,longitude_ddm
columns) - format used in aviation
- decimal degrees (
Limitations:
- all properties are encoded as strings, without type hints using extended CSV schemes etc.
waypoint.geometries
containing an elevation (Z) dimension are not included in CSV outputs- CSV outputs are not validated
Output format - GPX
Notes:
- GPX outputs are validated against the GPX XSD schema automatically
Limitations:
- GPX metadata fields (author, last updated, etc.) are not currently populated
- the
waypoint.name
,waypoint.colocated_with
,waypoint.last_accessed_at
,waypoint.last_accessed_by
andwaypoint.comment
, properties are combined into the GPX comment field, as GPX lacks fields for these properties waypoint.geometries
containing an elevation (Z) dimension are not included in GPX outputs
Output format - FPL
Notes:
- FPL outputs are validated against a custom version of the Garmin FPL XSD schema automatically
- route names will use spaces instead of underscores in FPL files, as underscores aren't allowed in FPL route names
Limitations:
- the
waypoint.colocated_with
,waypoint.last_accessed_at
,waypoint.last_accessed_by
andwaypoint.comment
properties are not included in FPL waypoint comments, as they are limited to 17 characters [1] - underscores (
_
) characters are stripped from route names within FPL files (rather than the names of FPL files), a local override is used to replace underscores with spaces ( - FPL metadata fields (author, last updated, etc.) are not currently populated
waypoint.geometries
containing an elevation (Z) dimension are not included in FPL outputs
[1] This limit comes from the specific UI shown in the aircraft GPS used by the BAS Air Unit.
FPL XML schema
A copy of the Garmin FPL XML/XSD schema, http://www8.garmin.com/xmlschemas/FlightPlanv1.xsd, is included in this project to locally validate generated FPL outputs. This schema cannot be used for validation in its published form, as it contains a number of invalid regular expressions. These regular expressions have been modified in the schema used in this project, which hopefully match Garmin's intentions.
In order to produce FPL files that match those produced by earlier processing scripts used by the BAS Air Unit, a number of other changes have been made to the local version of the FPL schema. These include:
- removing the requirement for a
<waypoints-table>
element to be included in all FPL files (relevant to route FPLs) - removing the requirement for all
<waypoint>
elements within<route>
elements to be included in a<waypoint-table>
element (as a consequence of the above) - altering the regular expression used for the
<country-name>
element to allow the_
characters
Note: It is hoped these local modifications will be removed in future through testing with the in-aircraft GPS. See #12 for more information.
Python CLI
A Python based utility, airnet
, is used for:
- importing Source data into the internal GeoPackage
- exporting data from the internal GeoPackage as Outputs
- creating new datasets (setup task, only needs to be performed once)
- describing the contents of a dataset at a high level
This utility provides a Command Line Interface (CLI) using the Click
framework. To enable users to call the CLI from a shell, without needing to run through Python, the Click CLI instance
is configured as a console script entrypoint in the setup.py
generated by Poetry (and defined in pyproject.toml
)
The Python methods used in the Click CLI call methods from a NetworkManager
class, which together with a set of
entity and entity collection classes, is responsible for loading and dumping data.
See bas_air_unit_network_dataset.__main__:cli
for the Click CLI method.
See bas_air_unit_network_dataset.__init__:NetworkManager
for the NetworkManager and related classes.
For a list of available commands and their options, run airnet --help
.
For information on the installed package version, run airnet --version
.
CLI environment variables
Parameter values for the airnet
command line interface (CLI) can be provided using environment variables. These are
typically used when automating commands as part of a script or other automation workflow.
Parameter | Environment Variable |
---|---|
-d / --dataset-path |
AIRNET_DATASET_PATH |
-i / --input-path |
AIRNET_INPUT_PATH |
-o / --output-path |
AIRNET_OUTPUT_PATH |
Note: Where an option is set on the command line and using an environment variable, the command line value takes precedence.
Setup
Populate the installation bundle
Note: You will need appropriate rights within the BAS MAGIC team OneDrive to complete these steps.
To populate the Installation Bundle:
- download the latest Garmin BaseCamp installer (Windows) and rename to
garmin-basecamp-installer.exe
- download the latest LTS QGIS installer (Windows) and rename to
qgis-installer.msi
- download the latest MiniConda installer (Python 3.9, Windows 64 bit) and rename to
miniconda-installer.exe
- download the latest LibXML2 Windows build:
- visit the LibXML2 Gnome project
- view the latest Continuous Deployment pipeline
- view the
cmake:msvc
job - download the artefact
- extract the artefact Zip, rename the containing directory
libxml2
and rezip the directory aslibxml2.zip
- create a
build
directory and:- download the latest 7-Zip installer and rename to
7zip-installer.exe
- download the latest 7-Zip installer and rename to
Before saving installers to the Installation Bundle, test them in a deployment VM.
Setup a workspace directory
- using Windows Explorer, create a suitable directory to use a Workspace (typically on a shared drive or within a synced folder)
- from the start menu, launch Command Prompt and run the commands in [1]
WARNING: Running these commands within an existing workspace directory will reset the dataset, deleting any existing data. Ensure you have suitable backups of existing data.
[1]
$ C:\ProgramData\Miniconda3\envs\airnet\Scripts\activate.bat
(airnet) $ C:\ProgramData\Miniconda3\envs\airnet\python.exe C:\ProgramData\Miniconda3\envs\airnet\Scripts\airnet.exe init --dataset-path '/path/to/workspace/directory'
Dataset will be located at: '/path/to/workspace/directory'
Dataset created at: '/path/to/workspace/directory'
Setup a Windows deployment VM
Note: You will access to the BAS MAGIC resource pool in the BAS vSphere instance to complete these steps.
To create a test VM:
- login to the BAS vSphere instance
- from the left panel, switch to the second view (to see templates)
- from the left panel, select [root] -> Cambridge -> BASDEV -> air-unit-test-template
- right-click and select New VM from this template:
- select a suitable name (e.g.
air-unit-test5
) and choose the MAGIC folder/resource pool in the BASDEV cluster
- select a suitable name (e.g.
- power on the resulting VM (the network may initially show as disconnected but will usually add itself)
- login as the IEUser with the shared password
Passw0rd!
.
To create the VM template used above:
- download the VMware version of the Microsoft Edge test VMs
- follow these instructions to create a VM template,
making changes as needed:
- name the VM and template
air-unit-test
- set the RAM to 8GB
- you should not need to add a virtual network interface or CD device, as this will already be setup
- name the VM and template
Development
Development environment
Git and Poetry are required to set up a local development environment of this project.
Note: If you use Pyenv, this project sets a local Python version for consistency.
# clone from the BAS GitLab instance if possible
$ git clone https://gitlab.data.bas.ac.uk/MAGIC/air-unit-network-dataset.git
# setup virtual environment
$ cd air-unit-network-dataset
$ poetry install
Running commands in development
Within a Development Environment use Poetry to test CLI commands. E.g.:
$ poetry run airnet --help
Dependencies
Python dependencies for this project are managed with Poetry in pyproject.toml
.
Adding new dependencies
To add a new (development) dependency:
$ poetry add [dependency] (--dev)
Testing
Automated tests are not currently implemented (see #16 for more information).
Manual outputs testing
Manual testing of outputs is strongly encouraged prior to a release.
These should aim to be as comprehensive as possible, rather than only testing the outputs currently needed. This
currently requires manual/ad-hoc modification of the NetworkManager.dump_*()
methods as shown in this commit:
- https://gitlab.data.bas.ac.uk/MAGIC/air-unit-network-dataset/-/blob/9892b56c1669bd88dfd5b7212c2d05861c7b5fa0/src/bas_air_unit_network_dataset/__init__.py#L1112
- https://gitlab.data.bas.ac.uk/MAGIC/air-unit-network-dataset/-/blob/9892b56c1669bd88dfd5b7212c2d05861c7b5fa0/src/bas_air_unit_network_dataset/__init__.py#L1134
Deployment
The Air Unit Network utility is distributed in two forms:
- a Python package that can be installed through Pip from the PyPi registry
- a packaged Anaconda environment
Note: Both distributions require OS dependencies to be installed separately (namely GDAL and LibXML2), see the Installation section for more information.
Python package
The Python package is standard, pure Python Pip package, built by Poetry as a binary wheel and source package.
To build the Python package manually:
$ poetry build
To publish the Python package to PyPi manually, you will need an API token for the BAS organisational PyPi account,
set as the POETRY_PYPI_TOKEN_PYPI
environment variable. Then run:
$ poetry publish --username british-antarctic-survey
Packaged Anaconda environment
The packaged Anaconda environment uses Conda Pack to create an OS/platform specific archive of an Anaconda virtual environment, such that dependencies can be copied and installed offline. This is designed for use in running the Air Unit Network utility in Antarctica.
Note: This process will produce an environment that can be run on Windows (10), x86 64 bit computers only.
First, Create a Python Package. Then within a Windows Deployment VM:
- connect to OneDrive, such that the Installation Bundle can be accessed and updated
- from the Installation Bundle, run
miniconda-installer.exe
, installing for all users - from the 'build' directory in the Installation Bundle, run the 7Zip installer (
7z.exe
) - from the start menu, launch Anaconda PowerShell Prompt with admin privileges and run the commands in [1]
- from the user Downloads directory, extract
airnet.tar.gz
using 7-zip:- then, extract
airnet.tar
toairnet/
- then, right-click
airnet/
-> Send to -> Compressed (zipped) folder to produceairnet.zip
- copy
airnet.zip
to the definitive copy of the Installation Bundle, replacing the existing file
- then, extract
[1]
(base) $ cd %USERPROFILE%/Downloads
(base) $ conda create -n airnet
(base) $ conda activate airnet
(airnet) $ conda config --env --add channels conda-forge
(airnet) $ conda config --env --set channel_priority strict
(airnet) $ conda install fiona
(airnet) $ python -m pip install bas-air-unit-network-dataset
(airnet) $ conda activate base
(base) $ conda install -c conda-forge conda-pack
(base) $ conda pack -n airnet -o airnet.tar.gz
Release procedure
For all releases:
- create a release branch
- manually test outputs
- close release in
CHANGELOG.md
- bump package version
poetry version [minor/patch]
- build and publish Python package to PyPi
- push changes, merge the release branch into
main
and tag with version - build a Packaged Anaconda Environment
- update the Installation Bundle as needed
- copy the Installation Bundle and Test Network to a hard drive to take South
Feedback
The maintainer of this project is the BAS Mapping and Geographic Information Centre (MAGIC), they can be contacted at: magic@bas.ac.uk.
Issue tracking
This project uses issue tracking, see the Issue tracker for more information.
Note: Read & write access to this issue tracker is restricted. Contact the project maintainer to request access.
License
Copyright (c) 2022 UK Research and Innovation (UKRI), British Antarctic Survey.
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file bas-air-unit-network-dataset-0.2.0.tar.gz
.
File metadata
- Download URL: bas-air-unit-network-dataset-0.2.0.tar.gz
- Upload date:
- Size: 60.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.1.4 CPython/3.9.1 Darwin/19.6.0
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 1e6b3cb725310e4f0d25b5a4d40b41b41bf6512e9efdcde54dd50f8d50b10c49 |
|
MD5 | f490db542470b25519c58b6277e28814 |
|
BLAKE2b-256 | a3e569dbda89d307d55137966ed2d74db7e690aab9ab5bad67ab7840bbdecc42 |
File details
Details for the file bas_air_unit_network_dataset-0.2.0-py3-none-any.whl
.
File metadata
- Download URL: bas_air_unit_network_dataset-0.2.0-py3-none-any.whl
- Upload date:
- Size: 33.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.1.4 CPython/3.9.1 Darwin/19.6.0
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 4732e71ee1191e8b4f18c6b946b182210f7144ac21e0a31ca5b20a895e3267a6 |
|
MD5 | 9fa7b798a652243478759d0eeefab145 |
|
BLAKE2b-256 | a4f7f1248e16b6c2caa374318604cc50f7d208874497d2892d0de54004b3e542 |