GPS track viewer: route, climb, pace and splits from your watch
Drop a .gpx, .fit, .tcx or .kml file from a Garmin, Wahoo, COROS, Suunto or Polar device, Strava or a phone app. You get the route, an elevation profile, the distance, elapsed and moving time, ascent and descent, average and top speed or pace, splits per kilometre or mile, and heart rate, cadence and power where the file has them. Drop several files to overlay them.
The files are read on your device. Nothing is uploaded, and no map is loaded: the route is drawn from its own coordinates.
What it shows
- The route, drawn as a line on a plain canvas with north up, a scale bar, the start (●), the finish (■) and any waypoints (◆). Several files are overlaid, each in its own colour, and each can be hidden.
- An elevation profile against distance. Point at it (or tap it on a phone) to read the distance, elevation, time since the start and heart rate at that spot, and to see the spot marked on the route.
- The totals: distance, points, elapsed time (first to last timestamp), moving time, ascent and descent, lowest and highest point, average speed or pace while moving, the fastest 30-second stretch, heart rate, cadence, power and temperature. Where the device wrote its own totals (a FIT session, TCX laps) they are shown beside the figures computed here, so you can see where they disagree.
- Splits per kilometre or per mile (switch units at the top): time, pace and speed, climb and average heart rate for each, with the remainder as a last short split.
- Heart rate, cadence, power and the device's speed as charts against distance, when the file has them; the device's laps (auto-lap or lap button) from FIT and TCX files; waypoints with their names, coordinates and notes.
- Save the points as CSV (one row per point: time, position, elevation, distance, sensors) and the track as GPX. A .fit or .tcx saved as GPX keeps every point with a position, its time, elevation, heart rate and cadence (Garmin's TrackPointExtension) and power, so Strava, Komoot, Garmin Connect or a mapping app can import it.
How the figures are worked out
- Distance
- The sum of great-circle distances between consecutive points, by the haversine formula on a sphere of radius 6,371,008.8 m (the WGS84 mean radius, R1). The Earth is not quite a sphere, so this can differ from the exact distance on the WGS84 ellipsoid by up to about 0.5%, depending on latitude and direction. The jump between two track segments (
<trkseg>, or a FIT timer stop) is not counted. Elevation changes are not added in: on a 10% slope that would add only 0.5%. - Ascent and descent
- From the elevations in the file, exactly as recorded, with a threshold you choose (0, 1, 2, 3, 5 or 10 m; 3 m to start). A rise is counted once the elevation has climbed at least that much above the last counted level, so a phone GPS that wobbles by a metre up and down does not add 200 m of "climb" to a flat walk. The threshold is printed next to the figure, and the every-rise (0 m) total is shown beside it for comparison. Nothing is smoothed and no elevation is corrected.
- Moving time
- The sum of the steps between consecutive points whose average speed is at least 0.5 m/s (1.8 km/h). A stop at a traffic light or a café counts in the elapsed time only.
- Top speed
- The fastest stretch lasting at least 30 seconds, from the positions. A single GPS fix can land 20 to 30 metres off, and over one second that reads as 70 km/h or more; over 30 seconds it barely shows. The device's own top speed, from its speed sensor or its own smoothing, is shown on a separate line when the file has one.
- Splits
- The time at each whole kilometre or mile is interpolated between the two points either side of it.
Files it opens
| File | Written by | What is read | How it is recognised |
|---|---|---|---|
| .fit | Garmin, Wahoo, COROS, Suunto, Polar and Hammerhead devices; Zwift; Strava exports of original files | every record (position, time, altitude, heart rate, cadence, power, temperature, speed, distance), laps, the session totals, the device maker, course points; developer fields are skipped | .FIT at bytes 8 to 11 of a 12- or 14-byte header |
| .gpx | almost everything: Strava, Komoot, OsmAnd, Gaia, phone tracking apps, Garmin exports | tracks and segments, routes when there is no track, waypoints, heart rate, cadence, temperature and power extensions | root element <gpx> |
| .tcx | Garmin Connect and Training Center, many training apps | trackpoints with heart rate, cadence, speed and watts, laps with their totals, course points | root element <TrainingCenterDatabase> |
| .kml | Google Earth, Google My Maps, some GPS apps | paths (LineString) and timed tracks (gx:Track) as segments, point placemarks as waypoints | root element <kml> |
A worked example: a 9 km run from a Garmin Fenix 2
The file activity-small-fenix2-run.fit (121,839 bytes, a public test file of the python-fitparse project) holds 2,809 one-second records, 4 laps and a session summary. It opens as 8.996 km by the haversine sum of its points; the watch's own total in the session message is 9.008 km, 0.13% more. Elapsed time is 47:13, moving time 46:52, so the average moving pace is 5:13 per km. The splits run 5:18, 4:47, 4:40, 4:29, 4:11, 4:15, 4:16, 6:45 and 8:32 for the last 996 m.
The climb shows why the threshold is printed. The watch's summary says 64 m of ascent. The page, with a 3 m threshold, says 139 m, and 257 m with every rise counted. The difference is in the first seconds: the recorded altitude goes 55 m, 142.4 m for three seconds, then 56 m. That 87 m jump is in the file, and this page counts what the file says, which is why the first kilometre shows +90 m. The watch evidently filtered it out of its own total. Seeing the jump on the elevation profile tells you which number to trust; a tool that smoothed it away silently would not.
What this cannot do
- No map. No map tiles, satellite images or place names are loaded, because that would mean sending your route's area to a tile server. The line is drawn on a blank background, to scale, north up. To see it on a map, save it as GPX and open it in a mapping app.
- No elevation correction. The elevations are the ones in the file, from the device's barometer or GPS. The page does not look up ground heights from a terrain model (Strava's and Garmin's "elevation correction" does), so a GPS-only phone track can show a climb that is metres off. The threshold only decides which recorded changes are counted; it does not change them.
- No route planning or editing. It reads what was recorded. It cannot draw a new route, snap a track to roads, cut or join tracks, or remove a bad point.
- No training analysis. No heart-rate zones, training load, VO2max, normalized power or calorie estimate of its own; the device's calorie figure is shown when the file has one.
- Not every format. Zipped KML (.kmz), GeoJSON, NMEA logs, Suunto .sml, Polar .hrm and Apple Health exports are not read. A FIT file of a workout plan, sleep or daily steps (not an activity) shows no track. Swimming pool files have laps but no positions.
- Developer fields in FIT files (data added by Connect IQ apps, such as Stryd running power) are skipped, not shown.