SimpleFly
SimpleFly is a simple flight moving map and navigation app for Android and IOS devices. It shows ADS-B aggregated data, and provides electronic conspicuity on ADS-IP. It is free software and the download link is below.
Getting Started
Yes, there are many moving map apps for flight navigation, but as the name implies this one is without all of the cumbersome whistle and bells. When flying VFR in a small aircraft or ultralight, you typically only need a some basic positional information and a way to navigate from point A to point B. Everything else adds to the pilot workload, and this can be a bad thing in a stressful situation.
When the app is opened:
- It starts the GPS.
- It starts GPS recording.
- It opens the main Flight Display.
Displays
The Flight Display and Navigation Display:


The main Flight Display purposely has limited gestures. When bouncing around in an aircraft, having only a couple of things you can press is beneficial:
- You can pinch-zoom in and out.
- You can save the current recorded flight information.
On the Flight Display you can not pan off of the current position, intentionally. Again, it is one less thing to correct when bouncing about.
Selecting a Destination
At the bottom right of the displays is a flip-flop to switch between the Flight Display and the Navigation Display. By providing these two displays separately allows you to zoom into to a specific area on the Navigation Display (like the detailed information shown on a FAA sectional for your destination) and then flip back to the Flight Display without losing your view on the Navigation Display.
The Navigation Display has a bit more functionality:
- You can pinch-zoom in and out and pan.
- You can long-press to set a destination.
- There is a button on the bottom left for Settings.
-
The five additional buttons at the bottom right allow you to:
- Clear the destination.
- Set the destination to Home, as determined by when the app was started.
- Zoom in to the destination.
- Center on the current position, at the current zoom.
- Zoom out to the current path.
The Navigation Display and Flight Display after selecting a destination:


And although it may be obvious, as shown on the Flight Display above:
- Ground Speed (in knots).
- Altitude (in feet MSL).
- Bearing (degrees true).
- Distance and bearing to destination.
Please note: Ground speed is not airspeed, and bearing (which way you are going) is not heading (which way you are pointing). These are not flight instruments, they are navigation instruments. But then, that is all you can get from a GPS.
Miscellaneous
There are a couple of other items worth mentioning:
-
For simplicity, the GPS recorder runs as long as the app is open. Not having to hit a start button is one less thing to remember. However, exit the program when finished; do not simply swipe it to the background. The recorder keeps running in the background!
-
The saved GPS flight information file is located in Files > Internal Storage > Downloads. If you have Android 10 or lower, this file will be placed in Files > Internal Storage > Android > data > us.worktablecnc.SimpleFly > files > downloads.
-
Map tiles are cached. It is expected that you will have data service even while flying, but in the event you lose it for a bit it will used cached map tiles.
-
Downloaded map tiles are saved in the App's cache location. This can be cleared by using the "Clear Cache" function under the app settings of your device.
-
Currently, FAA Sectional map tiles are being provided by worktablecnc.us. This is a preliminary arrangement and may not be ideal if this app becomes extremely popular. You can host your own tiles, and if there is a demand I will detail how.
ADS-B Traffic
The app calls an ADS-B aggregator to acquire a list of other aircraft in the area. These are shown on the Flight Display as icons with the following details:
- An aircraft above you is blue (blue skies above).
- An aircraft below you is green (green grass below).
- The further an aircraft is above or below you, they are more transparent.
- An aircraft within an altitude of about 1000 feet of your altitude is red.
- An aircraft on the ground is shaded gray.
- An aircraft not providing heading information is shown as a circle.
- Fast moving aircraft are larger.
Unfortunately, most small aircraft do not have ADS-B. You need to look out the window to spot those guys!
The current ADS-B aggregator is adsb.fi. They are community-driven with open data. I have two ADS-B receivers feeding data to their network.
ADS-IP Traffic
The app uses ads-ip.net to acquire a list of other traffic using that system and to share your location on that system.
ADS-IP traffic is currently shown as a simple triangle since the target may be an airplane, drone, balloon, ultralight, paramotor, etc. and an airplane icon did not seem appropriate.
The ADS-IP icons are similar to the ADS-B icons noted above:
- Traffic above you is blue (blue skies above).
- Traffic below you is green (green grass below).
- The further traffic is above or below you, they are more transparent.
- Traffic within an altitude of about 1000 feet of your altitude is red.
Download SimpleFly
SimpleFly is free and requires no log-in, account, or submission of your email address. This is the fully functional version of the app; there is no free version with limitations tempting your to pay for a better version. There are no advertisements. The only tracking is anonymous electronic conspicuity provided to ADS-IP of which you can turn off.
The following will start the download of the current release:
Download SimpleFly for Android
I respect your privacy and have not programmed any hidden tracking, hacking, or nefarious behavior in the app. However, it was written in Flutter (Google) using open-source Flutter libraries, and those things are out of my control.
This app is being provided outside of the Google Play Store. Your Android device will warn you and ask for permission to download and install it.
If you have previously download it, clear your browser cache before downloading an update. Some browsers simply use the cached file and you do not get the updated file.
Additional Information
Everything below is a fun read, not necessary to use the software, and is a bit of a rabbit hole. Enjoy!
ADS-B, Electronic Conspicuity, SimpleFly, and ADS-IP
As a pilot, when I fly I want to know everything that is up there with me. And I would be happy to transmit my location so I can be seen by others. But when writing this app, I did not have any place to send my location. And, there are so many not-quite connected systems out there to listen to...
Certified ADS-B is the official system. It covers all large commercial aircraft, anything above 10,000 feet, and anything in Class A, B, or C airspace. However, only above 1/3 of the light aircraft have it, and almost no ultralights or paramotors do.
Thousands of volunteers have set up receivers to listen for 1090 MHz transmissions and forward them to aggregators. This is where we get FlightAware, FlightTracker24, adsb.fi, etc. These are unofficial non-certified sources, but generally show most of the ADS-B traffic in real time.
Then there are non-certified ADS-B transmitters, like SkyEcho. And here in the USA it is relegated to the 978 UAT frequency... which, eh, who is listening on that frequency?
Then there are a couple of separate proprietary systems like FLARM or apps like XCTrack, but they do not show up on the ADS-B system.
And radio controlled drones have a FAA required positional system... Does it even work?
However, everybody that flies probably carries a smartphone. This device has a GPS and way to connect with others. You just need an app to both receive traffic and transmit location to everyone else (ADS-B but with a data plan). Even ForeFlight, which tracks almost every aspect of your flight, is just another proprietary and closed data tracking system.
A company called SafeSky has the right idea... they aggregate other aggregators, they have an app which feeds positional reports of the users of the app, they have a few third-party apps which they allow to integrate into their system, and they gather FLARM and whatever other proprietary feeds they can gather. Unfortunately, they do not directly serve outside of Europe (the Google Play Store will not let you download it), and, well, they are a private for-profit company.
What we all really need is an international, works everywhere, open-source, open-data, community-supported aggregator which aggregates everything and shows everything flying to everyone!
So I started one.
ADS-IP
ADS-IP: Automatic Dependent Surveillance - Internet Protocol: OK, I just made that up. I quickly searched the Internet and could not find a result, so I guess this is a new term. An open-data community-based system that facilitates electronic conspicuity, using an Internet connection, centrally aggregated, with data available to all.
I even created a website for the proposed system. The details can be found here:
Follow this link to ADS-IP.NET
Granted, it is not for the certified crowd (those aircraft five miles up with 300 souls on board). But the alternative for light aircraft and ultralights is either expensive, or invisibility. Hopefully this serves the aviation community and promotes safety.
Map Tiles for FAA VFR Sectionals
Maps shown on websites and apps are typically not a single large file. They are pieces of maps called tiles. When you need a view of a map, the system only downloads the tiles it needs to show you that view. And, tile sets are provided for different zoom levels. This way you can zoom in really close without having a fuzzy image or zoom out without having a massively large file.
The FAA provides flight maps files for free, but they are only image files of the area maps you would otherwise physically have. Sidebar: the FAA is the Federal Aviation Administration, the area maps are called Sectionals, those are provided either for Visual Flight Rules (VRF) or Instrument Flight Rules (IFR). Unfortunately, the FAA does not provide a single whole detailed map of the USA. And, they certainly do not provide map tiles (well, sometimes a third party does for them but not without prohibitive restrictions... worthless).
So you have to make your own FAA VFR Sectional map tiles. The steps:
- Download the Sectionals.
- Crop out the map, get rid of the border and legend.
- Stitch all into one big file.
- Tile the big file.
I have to credit Shane at ephemeral.cx. She detailed the steps in this blog post.
And since the size and layout of every Sectional is different, Shane also went through every Sectional and manually created the cropping information. Thank you Shane!
Using her guide I slightly modified her bash script file:
#!/bin/bash
set -e
# List all the chart zip files you have downloaded:
CHARTS=("Seattle" "Klamath Falls" "Great Falls" "Salt Lake City")
rm all_charts.vrt || true
rm -rf webviewer/tiles || true
for CHART in "${CHARTS[@]}"; do
# Unzip the folder from the FAA:
unzip -o "${CHART// /_}.zip"
# Trim the unusable edges and warp the TIF:
gdalwarp \
-t_srs EPSG:3857 \
-co TILED=YES \
-dstalpha \
-of GTiff \
-cutline "shapefiles/$CHART.shp" \
-crop_to_cutline \
-wo NUM_THREADS=`grep -c ^processor /proc/cpuinfo` \
-multi \
-overwrite \
"$CHART SEC.tif" \
"$CHART cropped.tif"
# Translate the TIF into a single VRT (vector tile):
gdal_translate -of vrt -expand rgba "$CHART cropped.tif" "$CHART.vrt"
done
# Combine the single VRT's into one large VRT:
gdalbuildvrt all_charts.vrt *.vrt
# Create VRT tile sets from the large VRT:
gdal2tiles.py \
--zoom "8-11" \
--xyz \
--processes=`grep -c ^processor /proc/cpuinfo` \
--webviewer=none \
--exclude \
--tiledriver=WEBP \
--webp-quality=50 \
all_charts.vrt \
webviewer/tiles
GPS Shenanigans
The raw GPS sensor information is in:
- Latitude degrees (0 equator, +90 north pole, -90 south pole).
- Longitude degrees (0 Prime Meridian / England, +180 east, -180 west).
- Altitude in meters (WGS84 ellipsoid datum).
So why is my GPS altitude not MSL?
If you ask someone to draw a picture of the Earth, they draw a circle (a sphere in three-dimensions). But because the Earth is spinning, the centrifugal force makes the equator bulge out. So, A more accurate drawing would be an ellipse (an ellipsoid in three-dimensions). Although this was known in the 19th century, when 20th century rocket scientists got involved they eventually agreed on a specific ellipsoid in 1984. This is the World Geodetic System (WGS) 1984 model, or known as WGS84. This is what our Global Positioning System (GPS) currently uses as a baseline for Mean Sea Level (MSL) (and mean as in average, not as in not nice).
However, the WGS84 model assumes that the density and thus the gravity of the Earth is homogeneous. It is not. Some parts of the Earth have stronger gravity at the surface than others. And because of that, more sea water gets pulled to those areas. The Mean Sea Level around the Earth is actually is not level, it has gradual hills and valleys, and those are plus or minus 100 meters! So in addition to the WGS84 ideal shape, there are Earth Gravitational Models (EGM) which map these gravitation (and thus MSL) differences. The first was the EGM84 developed with the WGS84, but as surface mapping satellites got better, better models were developed. There is the EGM96, EGM2008, and the EGM2020, each more accurate but more complicated. The odd shape that the EGMs define is termed Geoid.
So, to get a basic moving map with altitude shown in MSL on an Android device, you need the ideal WGS84 altitude provided by the device, and then add the real altitude correction from a EGM Geoid model. On an iOS device this correction is built in with some I-do-not-know EGM model (as always with iOS devices: hopefully easier but with less control).
WGS and EGM Models
WGS and EGM models and support can be found at the United States Government Office of Geomatics.
A couple of notes about the EGM models and support:
-
The Geoid can be defined by a math equation with a series of numerical coefficients using the spherical harmonics (differential equation calculus), or defined by a simple data set.
-
The EGM84 data set is a text file rounded to the half degree (30 minutes). Each row is a space-separated list of longitude, latitude, and correction. Easy. At times they use scientific notation and the string value contains the letter
E
, so a function to convert this file to a list/array needs to watch for that. -
The EGM96 data set is a binary file rounded to the quarter degree (15 minutes). This one seems to be more popular in the examples that I have seen. The correction information is arranged by position in the file; the associated Fortran file contains a header explaining it.
-
Both the EGM96 and EGM84 supplied programs are in Fortran. Readable, but somewhat worthless for anything other than reading the comments.
-
In theory, when using a data set, one should linearly interpolate between two points (if the location is halfway between two points, the correction should be halfway between the two values). In practice, just rounding to the nearest correction will provide about a one meter accuracy. Not accurate enough for surveying, good enough for bouncing around in the sky.
Using the Geoid Files
Although one could use the Geoid files as provided, they are in formats for best practices at the time. It is just as easy to parse the information and reformat it to a JSON file, or whatever you need, so your code is easier to write/read/debug.
Reading the EGM96 Geoid File
The EGM96 data set is binary, and here is a Python file to convert it to text for review:
#!/usr/bin/env python3
with open('WW15MGH.GRD', 'r') as file:
data = str(file.read())
print(data)
On review, the file contains returns and newlines for printing, which is kind of nice for looking at but just one more thing to deal with. It is also a bit confusing to figure out (not impossible, just not efficient for this project). They have grouped the data for printing into 9 sets of 160 values (1440 values == 360 * 4; so a full latitude set grouped strangely), with a 10th set of a single value (WTF?). Weird. By comparison, the EGM84 data set is a no-brainer... so I moved on.
Reading the EGM84 Geoid File
The EGM84 data set is text, but contains the letter E
for scientific notation. For this application, converting it to a JSON file would be great! Here is a Python file to convert it:
#!/usr/bin/env python3
# Read the file, convert values from string to floating point.
# Some strings have exponents, such as `0.0000000000E+00` and
# Those need to be fixed:
with open('WWGRID.TXT', 'r') as file:
fileList = []
for line in file:
lineList = []
lineSplit = line.split()
for item in lineSplit:
if len(lineSplit) != 3:
print(f"Error: {line}")
else:
itemSplit = item.split('E')
if len(itemSplit) > 1:
item = float(itemSplit[0]) * ( 10 ** (float(itemSplit[1])) )
else:
item = float(item)
lineList.append(item)
fileList.append(lineList)
# Create a usable file from the list:
# Key = (string) Latitude-Longitude
# Value = (double) Correction
# Longitude is from 0 to 360, change to -180 to 180
# and drop 360; it creates a duplicate
print('{')
for line in fileList:
if line[1] != 360:
longitude = (line[1] - 360) if (line[1] > 180) else line[1]
print("\"{:07.2f} {:07.2f}\": {:},".format(line[0], longitude, line[2]))
print('}')
That will print the formatted output. Then just redirect the output to a file named WWGRID.JSON and you are golden! (OK, only if you delete the comma on the very last entity.)