Skip to main content

Recipes & Performance

Common use cases​

Analyze a day hike​

gpx-analyzer analyze chartreuse-hike.gpx

Analyze an ultra-trail with fine stop detection​

gpx-analyzer analyze utmb.gpx --preset trail --stop-duration 30s

Split and analyze a multi-day trek​

# Split into days
gpx-analyzer split gr20-full.gpx --interval 24h --output-dir gr20-days

# View stats for each day separately
gpx-analyzer analyze ./gr20-days/

# Reassemble and verify
gpx-analyzer merge ./gr20-days/ -o gr20-verified.gpx --analyze

Compare stats with and without smoothing​

gpx-analyzer analyze trace.gpx --smoothing none
gpx-analyzer analyze trace.gpx --smoothing heavy

Automated pipeline (JSON + jq)​

# Extract distance from each file
for f in *.gpx; do
dist=$(gpx-analyzer analyze "$f" --format json | jq '.total_distance_km')
echo "$f: ${dist} km"
done

# Get total D+ for a directory
gpx-analyzer merge ./traces/ -o /dev/null --analyze --format json | jq '.elevation_gain_m'

Get the most accurate D+ possible (DEM + segments)​

gpx-analyzer analyze pct.gpx --elevation-algo segments

Compare elevation gain algorithms​

gpx-analyzer analyze trace.gpx --elevation-algo threshold --elevation-threshold 5
gpx-analyzer analyze trace.gpx --elevation-algo douglas-peucker --dp-epsilon 3
gpx-analyzer analyze trace.gpx --elevation-algo segments

Reduce horizontal GPS noise before DEM correction​

gpx-analyzer analyze trace.gpx --track-smoothing medium --elevation-algo segments

Export a GPX with corrected elevations​

# Export with DEM correction for use in another tool
gpx-analyzer analyze my-hike.gpx --export ./processed/

# Export with the best possible reprocessing
gpx-analyzer analyze pct.gpx --elevation-algo segments --smoothing medium --export ./clean/

The exported file contains coordinates and elevations after the full reprocessing pipeline (lat/lon smoothing, DEM correction, elevation smoothing). It can be imported into any GPX-compatible tool.

Export an enriched GPX with computed metrics​

gpx-analyzer analyze my-hike.gpx --export ./processed/ --enrich

When --enrich is used with --export, the output GPX includes per-point extensions:

  • gpxa:TrackPointMetrics — computed speed (m/s), cumulative distance (m), grade (fraction)
  • gpxtpx:TrackPointExtension — heart rate, cadence, power, temperature (when present in the source GPX)

This is used by the web API to precompute elevation profiles and map tracks without client-side reprocessing.

Diagnose GPS issues and fix anomalies​

# Check data quality (detection is always enabled)
gpx-analyzer analyze broken-gps.gpx --preset trail --format json | jq '.anomalies'

# Apply corrections and compare
gpx-analyzer analyze broken-gps.gpx --preset trail
gpx-analyzer analyze broken-gps.gpx --preset trail --fix-anomalies

Benchmark a trace across all configurations​

gpx-analyzer benchmark my-hike.gpx -o results.csv -v

Analyze a bike ride​

gpx-analyzer analyze mountain-pass-ride.gpx --preset cycling --smoothing light

Analyze a road run​

gpx-analyzer analyze 10k-race.gpx --preset running --max-hr 185

Analyze a swim session (open water or pool)​

gpx-analyzer analyze lake-swim.gpx --preset swimming --format json | jq '{distance: .total_distance_km, avg_pace: .avg_moving_pace}'

The swimming preset uses very low speed thresholds suited to aquatic movement. If the GPX was recorded with a Garmin multisport watch, water temperature (gpxtpx:wtemp) is extracted automatically and included in the biometrics output.

Analyze a Backyard Ultra​

gpx-analyzer analyze backyard.gpx --preset running --stop-duration 3m --fix-anomalies

Each yard (loop of ~6.706 km) ends with a stop at the start/finish. Using --stop-duration 3m captures the brief rests between loops without counting short natural pauses.

Performance tuning​

For long tracks (hundreds of km, thousands of points), processing time is dominated by DEM tile downloads and elevation computations. Here are several options to speed up analysis.

Skip DEM correction entirely​

The fastest option: rely on GPS elevation only.

gpx-analyzer analyze trace.gpx --dem-auto-download=false

Skip tile validation​

By default, each downloaded tile is validated (scanned for non-void data). On trusted networks or with pre-downloaded tiles, skip this step:

gpx-analyzer analyze trace.gpx --dem-skip-validation

Disable smoothing​

Both elevation smoothing and track smoothing add processing overhead. Disable them for raw analysis:

gpx-analyzer analyze trace.gpx --smoothing none --track-smoothing none

Use the simplest elevation algorithm​

The threshold algorithm (default) is the fastest. douglas-peucker and segments are more accurate but slower:

gpx-analyzer analyze trace.gpx --elevation-algo threshold

Limit DEM memory usage​

For systems with limited RAM, set a memory cap. If the required tiles exceed the limit, the analysis stops with an explicit error rather than consuming all available memory:

# Allow up to 100 MB for DEM tiles (~35 SRTM3 tiles or ~4 SRTM1 tiles)
gpx-analyzer analyze trace.gpx --dem-max-memory 100

Each SRTM3 tile uses ~2.8 MB in memory, and each SRTM1 tile uses ~25 MB.

Use pre-downloaded tiles​

Avoid download latency by pre-downloading tiles for your area:

# First run: tiles are downloaded and cached automatically
gpx-analyzer analyze region-track.gpx

# Subsequent runs: cached tiles are reused instantly
gpx-analyzer analyze another-track.gpx

Tiles are cached in a hierarchical structure (e.g. N48/N48E002.hgt) under the OS cache directory. Use --dem-cache to point to a custom location.

Combine options for maximum speed​

gpx-analyzer analyze trace.gpx \
--smoothing none \
--track-smoothing none \
--dem-skip-validation \
--elevation-algo threshold
FlagEffect on speedTrade-off
--dem-auto-download=falseFastestNo DEM correction, GPS elevation only
--dem-skip-validationSlightNo corrupt tile detection
--smoothing noneSlightMore noise in elevation data
--track-smoothing noneSlightMore horizontal GPS noise
--elevation-algo thresholdSlight (vs segments)Less accurate D+/D-
--dem-max-memory NN/A (safety)Prevents OOM on large tracks