Visualise & animate GPX race tracks.
Project description
gpx-player
GPX Race Visualizer
GPX Race Visualizer is a Python script to visualize the progression of multiple GPS tracks (e.g., from a race) on a 2D map. It takes as input one or more GPX files and creates an animation showing the movement of each track over time. This is a simple, open-source alternative to features like Strava's Flyby, which require an account and can have privacy issues.
Modes
The player supports two modes:
1. "Video" mode
Produce an MP4 or a GIF file showing how the situation developed.
For sailing races, it also calculates the distance covered after the 'start' signal and the current speed.
Example:
2. Map mode
Displays the track on OpenSeaMap. You can see the full tracks with colour-coded speeds, and you can 'play' the tracks and see the markers move around the map. While playing, a legend shows each boat's distance travelled (in nautical miles), current speed (in knots), and average speed in knots.
Example:
Since GitHub Markdown doesn't allow embedding HTML, you can see an interactive example here.
Installation
Install directly from PyPI using pip:
pip install gpx-player
Alternatively, clone the repository and install the required dependencies manually:
git clone https://github.com/kirienko/gpx-player.git
cd gpx-player
pip install -r requirements.txt
Usage
To run the script producing mp4, pass one or more GPX file paths as command-line arguments:
gpx-player example-data/track1.gpx example-data/track2.gpx
To get a sea map, run the module:
python -m gpx_player.openseamap --title 'Gin Sul Regatta 2024' --names Alex Yury Richard \
--files example-data/osm-demo-Alex.gpx example-data/osm-demo-Richard.gpx \
example-data/osm-demo-Yury.gpx
A more sophisticated example, that produced a video above:
gpx-player example-data/track1.gpx example-data/track2.gpx example-data/track3.gpx \
--start 2023-07-01T10:53:00+0000 \
--names "Mr. Pommeroy" "Miss Sophie" "Sir Toby²" \
--title "Elbe-Damm Regatta (01.07.2023), Race 1" \
--race_start 2023-07-01T10:58:00+0000 --marks example-data/marks.txt -g
Additional parameters:
--titleor-t: The title of the video--startor-s: start time in the format2023-06-30T12:53:00+0200, all points before that will not be plotted--endor-e: end time in the format2023-06-30T13:53:00+0200, all points after that will not be plotted--namesor-n: names of the participants (otherwise the file names will be used in the legend)--race_start,-r: Race start time in the formatYYYY-MM-DDTHH:MM:SS%z, e.g.2023-07-01T12:29:00+0200--namesor-n: Names of the participants--marksor-m: The file with the static marks to put onto the map. One pair of coordinates per line, see below.--gifor-g: Save as GIF moving picture instead of MP4--timezoneor-tz: Local timezone to use for processing timestamps, e.g.America/Los_Angeles, see here (default:Europe/Berlin).
Marks
The script also supports visualizing predefined marks on the map, which can be useful for events like sailing regattas. The marks are defined as a list of (latitude, longitude) tuples in a separate text file and can be added to the script as follows:
53.542484632728, 9.801163896918299
53.542997846049374, 9.80611324310303
53.54823800356785, 9.812614917755129
53.54921647691311, 9.807373881340029
53.54508251196638, 9.80433225631714
Getting GPX Files
GPX files can be obtained from several GPS-tracking services:
- Strava: Go to the activity page and click on the wrench icon. Then select "Export GPX".
- Garmin Connect: Open the activity, go to the gear icon and select "Export to GPX".
- Endomondo: From the workout page, click the three-dot menu icon and select "Export". Then choose "GPX".
GPX Validation
For the gpx-player to work properly, it needs the correct GPX files.
You can verify that you are inputting the correct file by using the special validator
included in this package.
The validator.py script is a command-line utility and module for validating GPX files.
It checks for XML schema conformance and timestamp consistency,
supporting both strict and lenient modes.
Errors are raised as GPXValidationError which can be caught in Python code.
To run as a CLI tool, use:
gpx-validate path/to/yourfile.gpx --strict
Use as a Python module
from gpx_player.validator import validate_gpx, GPXValidationError
try:
validate_gpx("path/to/yourfile.gpx", strict=True)
print("GPX file is valid")
except GPXValidationError as e:
print("GPX validation failed:", e)
The --strict parameter is optional. In most cases you do not need it,
because files that strictly correspond to the GPX schema are rare.
For example, almost all modern files contain coordinates, elevations and time stamps
with more decimal places than originally planned.
Also, to better understand your GPX file, you can use the gpxinfo console command
that comes with gpxpy. If you are already using the player, you have it:
$ gpxinfo example-data/osm_track1.gpx
File: example-data/osm_track1.gpx
Waypoints: 0
Routes: 0
Length 2D: 9.621km
Length 3D: 9.648km
Moving time: 01:05:22
Stopped time: n/a
Max speed: 3.12m/s = 11.22km/h
Avg speed: 2.46m/s = 8.85km/h
Total uphill: 97.20m
Total downhill: 98.40m
Started: 2024-07-24 15:59:05+00:00
Ended: 2024-07-24 17:04:27+00:00
Points: 776
Avg distance between points: 12.40m
GPX Cleanup
For convenience, the repository provides clean_gpx.py. This utility first
validates a GPX file using validator.py and then removes all <extensions>
blocks using :func:remove_extensions_tags from gpx_utils. By default the
cleaned file is saved alongside the original with _noext appended to its name.
If the optional --overwrite flag is used, the original file is modified in
place.
Run it from the command line as follows:
python -m gpx_player.clean_gpx path/to/yourfile.gpx [--overwrite]
If validation fails, the command exits with an error message. The output reports how many extension blocks were removed.
Support
Now you can buy me a coffee to encourage further development!
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
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file gpx_player-0.2.0.tar.gz.
File metadata
- Download URL: gpx_player-0.2.0.tar.gz
- Upload date:
- Size: 29.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
307a4350b7438a37f231b0f87b2ea90666ad10e821d03e986c5b0a17f3401bb9
|
|
| MD5 |
656c12dda512dfb3a68ae0a49f0596ea
|
|
| BLAKE2b-256 |
b975b2350e5b1e6f2b843fc58a201c98f798fa2b72f9dea9510ad43229b3f491
|
Provenance
The following attestation bundles were made for gpx_player-0.2.0.tar.gz:
Publisher:
publish.yml on kirienko/gpx-player
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
gpx_player-0.2.0.tar.gz -
Subject digest:
307a4350b7438a37f231b0f87b2ea90666ad10e821d03e986c5b0a17f3401bb9 - Sigstore transparency entry: 414383991
- Sigstore integration time:
-
Permalink:
kirienko/gpx-player@2fa3ee846d65d531d500df65332310a2938582bb -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/kirienko
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@2fa3ee846d65d531d500df65332310a2938582bb -
Trigger Event:
push
-
Statement type:
File details
Details for the file gpx_player-0.2.0-py3-none-any.whl.
File metadata
- Download URL: gpx_player-0.2.0-py3-none-any.whl
- Upload date:
- Size: 28.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ec28fc11450d610993bb1ec04c3d40ff5bbe284d32910d22d2d3e5ec4e350d4b
|
|
| MD5 |
5ba4bab17f2588b367ff1d6897a5b533
|
|
| BLAKE2b-256 |
2429888ead31c473b645763de47a099fb54e2b2ec55779658c86d7f4c8eeab81
|
Provenance
The following attestation bundles were made for gpx_player-0.2.0-py3-none-any.whl:
Publisher:
publish.yml on kirienko/gpx-player
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
gpx_player-0.2.0-py3-none-any.whl -
Subject digest:
ec28fc11450d610993bb1ec04c3d40ff5bbe284d32910d22d2d3e5ec4e350d4b - Sigstore transparency entry: 414384004
- Sigstore integration time:
-
Permalink:
kirienko/gpx-player@2fa3ee846d65d531d500df65332310a2938582bb -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/kirienko
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@2fa3ee846d65d531d500df65332310a2938582bb -
Trigger Event:
push
-
Statement type: