viewhack

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

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

FileWritten byWhat is readHow it is recognised
.fitGarmin, Wahoo, COROS, Suunto, Polar and Hammerhead devices; Zwift; Strava exports of original filesevery 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
.gpxalmost everything: Strava, Komoot, OsmAnd, Gaia, phone tracking apps, Garmin exportstracks and segments, routes when there is no track, waypoints, heart rate, cadence, temperature and power extensionsroot element <gpx>
.tcxGarmin Connect and Training Center, many training appstrackpoints with heart rate, cadence, speed and watts, laps with their totals, course pointsroot element <TrainingCenterDatabase>
.kmlGoogle Earth, Google My Maps, some GPS appspaths (LineString) and timed tracks (gx:Track) as segments, point placemarks as waypointsroot 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