Generate maps of real-world airports by ICAO code in game Mini Airways
The following data source must exist (be initialized), but can be outdated. Internet access and paid service (if applicable) is required to update the data source. The program is based on an offline copy of it.
- Navigraph Unlimited: It is a paid service. The database provides airport, runways, navigation database. The data source is updated every month.
- OpenAIP: The original RESTFUL API is free, but the way of accessing (Google Cloud storage) is a paid service. The program is very easy to exceed the free API's rate limit, therefore it requests data from a Google Cloud storage bucket which is maintained by OpenAIP.
The following data source is embedded to the program. If the data source is offline, the program cannot run.
- Airport codes: It provides the name and country of the airport.
- Open street map: It provides the background map near the airport.
- OpenTopography: This API provides the digital elevation model, which is used to calculate relative height between airport and mountains (hills).
The following data source is recommended, but not required.
- Airport code database search: It is a convenient tool to find ICAO code of an airport, while users can remember or use alternative source to find ICAO code.
When subscribed Navigraph Unlimited, in the subscription account, download FMS Data Manager.
In "Addon Mappings" tab, add an "Little NavMap" addon and install to user defined folder.
In "Addon List" tab, download this item.
In the installation options, let the user defined folder be $navmap, which will be referred below.
The purpose of setting up Google cloud storage is to download OpenAIP obstacles dataset. Because its REST API has strict rate limit, we download the daily updated static files.
[Paid service] The user must have a Google Cloud account with a project linked to a billing profile.
Warning
This section will permanently install Google Cloud CLI in the user's computer (user level).
Run gcloud info after this section to learn more.
Run the following command with arguments.
.\download_openaip_obstacles.ps1
Arguments:
| Name | Required? | Data Type | Description |
|---|---|---|---|
-GoogleCloudProject |
✓ | str | The Google Cloud project ID to request OpenAIP dataset. It must link to a valid billing profile (payment method). |
Visit https://opentopography.org/plus
Register an account of this API. It can be a free account, or a paid account having higher rate limit. Based on the account type, there are different rate limit. The value of API key and rate limit will be used later.
Create a Python virtual environment and activate.
Run the following command.
pip install -r requirements.txt
python agg_openaip_obstacles.py
Run the following command with arguments.
python main.py
Arguments:
| Name | Required? | Data Type | Description |
|---|---|---|---|
--db_path |
✓ | str | Path to Little NavMap database, which is $navmap/little_navmap_db. |
--dem_api_key |
✓ | str | Open Topography API key. |
--dem_daily_limit |
int | Open Topography API rate limit, which is maximum number of jobs in the past 24 hours. Default: 50 (free non-academic account, checked on 2026-07-28). | |
--icao |
✓ | str | ICAO code of airport. |
--min_cam_size |
float | Initial camera size, artificial unit defined by game developer. Default: 6.5. | |
--max_cam_size |
float | Camera size after applying maximum times of the airspace expansion, artificial unit defined by game developer. Default: 10.5. | |
--vertical_resolution |
int | Vertical pixels of the background map. Aspect ratio is fixed to 16:9. If actual screen resolution is smaller than it, the game can down-sampled automatically. Default: 1440 (represents 2560*1440 resolution). | |
--anti_aliasing |
float | To make the mountain masking image show normally, simplify the polygon of terrain hills by Douglas-Peucker algorithm. This value is the "tolerance" parameter of this algorithm. Default: 0.2. | |
--och |
float | Obstacle clearance height. Any obstacle (natural terrain like hills, or man-made like radio towers) that extends above this height enters the protected terminal airspace. These dominant obstructions are mapped on air traffic control (ATC) map, to ensure controllers can safely vector aircraft. Default: 150 (meters). |
Note
Runways identifier different from real-world.
In Mini Airways, runways identifier is retrieved from true heading; while in real world, runways identifier is defined by magnetic heading.
The output Mini Airways maps are in results folder.
The following examples are some unique airports.
Queenstown airport, where terrains make it difficult to take off & land. In real world, planes are smaller than shown in the game, therefore it's easier to get out from the valley. In addition, the current setting culls (labels) obstacles taller than 150m above the airport. If there's no terrain in the map, planes can fly in any altitude from 300m to 4000m; however, even if there are obstacles above 150m, pilots can fly in a higher altitude to avoid crashing. The game is 2D, which simplifies this situation by forbidding any entrance to such mountain area.
In Shanghai Hongqiao Airport, we can see tall buildings in Shanghai CBD and also the restricted area. With the real world scale, the runways are too close to each other, therefore two planes cannot take off in different runways at the same time. You can decrease min_cam_size and max_cam_size to zoom in, but the airspace without Shanghai CBD will be less interesting.
There exists an official map of Shanghai Pudong International Airport in the game, while we can create another version based on real-world scale. We can find that, the runways are simplified in the game official map, and the location of forbidden area is also moved in the game official map.
Washington Dulles International Airport is a balanced and comprehensive map, which has both large restricted area and natural terrains. There are 4 runways with large space in-between, so it's easy to make use of all of them.
Near Auckland International Airport, there are many broken hilly area. If the exterior of terrain is red, it means the polygon is invalid in Mini Airways map. The mountain mask of terrain forbidden area cannot correctly displayed. The following image shows the issue when anti_aliasing = 0.1. To solve this problem, increase the value of anti_aliasing argument.
Note
Based on Mini Airways level editor's documentation, reasons of invalid include:
- Too many boundary points.
- Too sharp angles.
- Cross paths.
$\leftarrow$ This issue is solved in this program.
To manually simplify exterior, hold Ctrl and click the vertex to delete it in Mini Airways level editor.
After increasing anti_aliasing to 0.2, the problem is solved.







