Overcloud is a backend for Overland. Overland is a GPS logger for iOS devices, written by Aaron Parecki. It logs your location in the background and sends them to a backend. There are various backends available, some offering detailed visualizations and analyses. Overcloud takes a different approach. Instead of complex features, Overcloud focuses on simplicity. It stores your location history in a single file. That's its sole function. No visualizations, no analytics, just a single GeoPackage you can inspect with other GIS tools.
To recap:
- Overcloud: A backend for Overland, storing location data in a single GeoPackage.
- Overland: An iOS app that logs location data and sends it to a chosen server.
- GeoPackage: An open, standard format for geographic information.
Overcloud is written in Python and uses the excellent GeoPandas library. If you have Nix installed and flakes enabled you can run it in one go:
nix run github:cimm/overcloud -- --host 127.0.0.1 --token sEcretPasswOrd
Warning
Overcloud does not utilize HTTPS, which means that all requests can be seen by anyone on the network. I personally run Overcloud on a server in my home that is not exposed to the internet.
The development environment is easily configured via Nix as well, simply run:
git clone https://github.com/cimm/overcloud.git
cd overcloud
nix develop
GDAL is a powerful library for working with raster and vector geospatial data, including GeoPackages. Here are some usefull examples for manipulating GeoPackages.
These two commands count the number of records in the locations
layer (which Overcloud creates) and displays the results. Both give the same result but are formatted differently.
ogr2ogr /vsistdout/ input.gpkg -f CSV -sql "SELECT count(*) FROM locations"
ogrinfo input.gpkg -sql "SELECT count(*) FROM locations"
Creates a new GeoPackage, output.gpkg, containing only records with a "wifi" value. The filtered results will be stored in the locations
layer. (Without the -nln
parameter, the data would be placed directly in the GeoPackage's root.)
ogr2ogr output.gpkg input.gpkg -f GPKG -nln locations -sql "SELECT * FROM locations WHERE wifi IS NOT NULL"
Creates a new GeoPackage with a locations
layer containing only records from April 2025.
ogr2ogr output.gpkg input.gpkg -f GPKG -nln locations -sql "SELECT * FROM locations WHERE timestamp >= '2025-03-01' AND timestamp < '2025-04-01'"
Append all data from the input.gpkg to the output.gpkg, leaving the input.gpkg GeoPackage untouched.
ogr2ogr -append input.gpkg output.gpkg
To clean up scattered location data recorded around my home Wi-Fi, I use this command. It updates all points where the "wifi" attribute is "MyHomeWiFi" to a single set of coordinates, effectively stacking them.
ogrinfo input.gpkg -sql "UPDATE locations SET geom = ST_GeomFromText('POINT(4.3499932 50.8449861)', 4326) WHERE wifi = 'MyHomeWiFi'"
Convert the GeoPackage to GeoJSON.
ogr2ogr -f GeoJSON output.json input.gpkg