Turn a GPX route into an elevation profile
GPXProfile reads your .gpx, .fit, .kml or .kmz file and
draws an interactive, gradient-coloured elevation profile with a matching map, your waypoints and every
sustained climb. Nothing is uploaded — the whole thing runs on your device.
- Elevation profile — distance, ascent, descent and min/max at a glance, with a gradient-coloured chart you can zoom, pan and brush. Hover for distance, elevation, grade and coordinates.
- Route map — an OpenStreetMap-backed map that follows the chart; hover the profile to see exactly where you are on the route, with every waypoint pinned.
- Climb detection — sustained climbs found automatically and listed in route order with start, length, gain and average grade. Click one to zoom straight to it.
- Time & speed — a recorded ride gets a speed strip under the profile, moving and stopped time, and a splits table per kilometre or mile, in speed or in pace. Cadence and temperature get strips of their own when the file carries them.
- Waypoints & POIs — labelled on the chart and listed with category, distance, elevation and notes; searchable, filterable and printable.
- GPX editor — merge several files, split a long route into numbered parts, reverse it, or trim the start and end by hand before saving.
- Conversion tools — KML/KMZ ⇄ GPX conversion, distance markers every mile or kilometre, elevation from the USGS terrain model, and point reduction to fit a device's track-point budget.
- Private by default — files are parsed in your browser and never leave your device. No account, no upload, no server-side copy of your rides.
- Export what you see — save the full-route profile as a PNG, print or PDF the climb and waypoint lists, export the map, and switch between km/m and mi/ft.
Drop a .gpx, .fit, .kml or .kmz file here
or . Everything is parsed in your browser — no upload, no server.
KML and KMZ files are converted to GPX for you.
No file handy? — or use the Samples button up top.
How to use GPXProfile
1 · Load a route
Click Open Route or drag a .gpx, .fit, .kml or
.kmz file onto the page. GPXProfile reads
<trkpt>, <rtept> and <wpt> latitude, longitude and
elevation. A .fit file from a Garmin or Wahoo device is decoded in place, keeping its
cadence, temperature, heart rate and power. Files are parsed entirely in your browser — nothing is
uploaded.
No file to hand? Click the Samples button in the top bar (or the link on the drop area) and pick Tour Divide 2026 or Rapid City to Omaha to load a bundled route straight away.
KML and KMZ files
Got a route from Google My Maps or Google Earth? Open the
.kml / .kmz file with Open Route (or just drop it on the page)
and it is converted to GPX on the spot.
Lines become the track, placemarks become waypoints — with the layer they came from kept as their
category — and the profile is drawn right away.
Convert files with Tools
Open Tools and pick KML → GPX to convert a .kml /
.kmz file, or GPX → KML to turn a .gpx file into KML for
Google Earth or My Maps. The converted file is saved straight to your device — pick the folder and file
name yourself where your browser supports it, otherwise it lands in your downloads. Nothing is uploaded
and the route on screen is left untouched. If no route is loaded yet, a converted KML is drawn straight
away.
Distance markers reads a .gpx route and saves a waypoint-only
<name>_Markers.gpx with a point at the start and one every whole mile or
kilometre after it — labelled Mile 0, Mile 1, Mile 2… (or
Kilometer, following your unit setting), each carrying its own elevation. Set
Marker every to space them further apart — 5 gives Mile 0,
Mile 5, Mile 10… Load it alongside the route on a GPS unit as a cue
sheet.
Reduce GPX thins a dense route until it fits a device's track point budget — 10,000 on a Garmin Edge — by dropping points that sit on a straight and add nothing to the shape. Corners, the start and the finish always survive, and the line never moves further than the tolerance you set (5 m / 15 ft by default, up to 50 m / 150 ft). If your tolerance alone can't get the route under the limit, the smallest tolerance that can is used instead and the saved message says so. Waypoints are carried over untouched.
Split GPX cuts a long route into numbered parts — <name>_1.gpx,
<name>_2.gpx… — for devices that refuse an oversized course; a Garmin Edge, for
example, holds 10,000 GPS points. Every file is packed right up to the limit you choose
(1,000 to 10,000) before the next one is started, so only the final part is short, and no
point is thinned away. Waypoints are handed to the part they sit closest to and don't count
towards the limit. Chrome asks for a folder and writes them all at once; other browsers
download them one by one.
Remove waypoints cleans a .gpx of POIs that don't belong to it:
every waypoint further from the route than the distance you set (10 km / 6 mi by
default) is dropped, and the rest are saved to <name>_Cleaned.gpx. The track
itself is untouched — no point is moved or thinned — so it is the on-disk version of the
off-route filter the waypoint list uses on screen.
Add elevation lifts a flat or noisy .gpx onto real terrain. Every
coordinate in the file is looked up in the USGS 3DEP model at nationalmap.gov — a few
hundred at a time, so a long route takes a moment — and the result is saved to
<name>_Elevation.gpx. Choose Only points without elevation to fill the
gaps in a route drawn in a planner, or Every point to replace a barometric trace that
drifted. Waypoints are lifted too. Coverage is the United States and its territories; anything
outside keeps whatever it had, and the message says how many. This is the only tool that leaves
your browser — the coordinates in the file are sent to that service, and nothing else is.
2 · Read the profile
The chart plots elevation against distance, coloured by gradient. Hover anywhere for a tooltip with distance from start, elevation, grade and coordinates; the Route map highlights the matching spot. Summary stats (distance, ascent, descent, min/max) sit above the chart.
3 · Zoom and pan
Scroll to zoom, drag to pan, double-click to reset. Drag inside the strip below the chart to brush a section. Use the Range buttons (All, 50%, 25%, 10%, 5%) or type an exact percentage — a smaller range zooms around the middle of what you're already viewing, which is handy on very long routes. The elevation axis stays fixed to the whole route, so the profile never changes height as you zoom, pan or scroll.
On a phone or tablet the brush strip and the Range bar are left out — there isn't room for them and they are fiddly with a finger. Pinch the profile itself to zoom and drag with one finger to pan; swiping up or down scrolls the page as usual. The chart gets the space they would have taken.
The Route map zooms the same way — scroll or pinch to zoom, drag to pan, double-click to reset — and it snaps back to the fitted view whenever the profile changes. Every waypoint is pinned by default; the note under the map says how many are pinned and links to the map's ⚙ options, where you can switch symbols off to thin out a busy route.
4 · Climbs
Sustained climbs are detected automatically, shaded in amber on the profile and listed in route order — distance from the start — with start, length, gain and average grade. Click any row to bring that climb into view: by default the profile and map keep their zoom and center on it, or set the panel's ⚙ options to zoom right in on it instead. The same options set what counts as a climb: the minimum gain (200 m / 500 ft by default), how much descent ends a climb (100 m / 250 ft) and, if you want, a minimum average grade.
5 · Time & speed
A ride recorded on a GPS carries a timestamp on every point, and then a speed strip appears under the profile, sharing its x-axis and its zoom, with the average for whatever is on screen drawn as a dashed rule. The stats line gains elapsed time, moving time, time stopped, average moving speed and top speed — all of them for the visible window, so zooming in tells you how one section went.
The Splits panel breaks the ride into equal distances measured from the start, each with its moving time, speed, time stopped, gain and average grade; the fastest full split is highlighted, and clicking a row zooms the profile to it. Its ⚙ options switch the numbers between speed and pace, change the split distance, and set what counts as moving — the speed below which you are stopped, and the gap that means the recording was paused. A planned route has no timestamps, so none of this appears for one.
If the file carries sensor readings, cadence and temperature get strips of their own below the speed one, again sharing the zoom, and columns in the splits table. Neither needs a clock, so they show up even on a file with no timestamps at all. Average cadence counts only the time actually pedalling — a coasted descent reads zero and would otherwise flatter nothing — and the card says what share of the visible window was spent turning the pedals.
6 · Waypoints & POIs
Waypoints are pinned on the chart — a leader line from the exact point on the elevation curve to the name, set vertically above or below the curve wherever there is room, and tinted by category so a cluster of POIs stays readable — and listed underneath with category, distance from start, elevation, coordinates and notes. The Waypoints checkbox shows or hides them on the chart. Filter the list by name, category or notes, and click a row to jump to it. Waypoints further from the route than the limit in the Waypoints panel's ⚙ options (8 km / 5 mi by default) are left out. A POI-only GPX (waypoints, no track) can be dropped on top of a loaded route to overlay its points.
The ⭳ button in the Waypoints panel header opens a print-ready copy of the list and the browser's print dialog — pick Save as PDF to keep it. The page is already set to landscape, and whatever filter is in force is what gets exported. The Climbs panel has the same ⭳ button for its own list, and the Route map panel exports the map as it is drawn on screen.
7 · Tune and export
Use the ⚙ button on the profile to switch Smoothing, grade colouring and waypoints, then the ⭳ button beside it to save the profile as a PNG. The export always covers the whole route, whatever zoom the chart is at: a wide strip six times the width of the chart on screen (same height), so every waypoint name has room. The ⚙ button in the top bar switches between light and dark themes — dark is the default — and between km / m and mi / ft, and remembers your choice.
The ⚑ button beside ⇄ saves distance markers for the route on screen straight away — the same file the Tools menu builds, without picking a file. Reverse the route first if you want the markers counted from the other end.
Keyboard shortcuts
- ← → pan the view
- + − zoom in and out
- Esc reset the zoom (or close this panel)
Privacy & usage stats
Your files never leave your device — parsing, the chart and the map all run in your browser. The Route panel's map background loads tiles from OpenStreetMap, so that server sees the map area you are looking at (never your file); switch “Map background” off to stop those requests. To know which features are worth improving, this site counts anonymous events such as “a file was opened” or “PNG exported”, plus a random per-tab id and coarse buckets like point count and screen size. No file names, no coordinates, no waypoint names, no search text and no IP addresses are stored, and the counters stay on this site's own server.
Contact
Jeff Rowland
Builder and maintainer of GPXProfile
Questions, bug reports and ideas for what to build next are all welcome. A route that renders oddly is especially useful — tell me what you saw and what you expected.
Support the site
GPXProfile is free, carries no ads and never uploads your files. If it saved you an evening of route planning, a small donation keeps the lights on.
Opens PayPal's secure checkout in a new tab — no payment details ever touch this site.
Track
Route
© OpenStreetMap contributors
Highlighted section matches the chart's visible range. Scroll or pinch to zoom the map, drag to pan, double-click to reset.
Climbs
Click a row to zoom the profile to that climb.
Splits
Click a row to zoom the profile to that split.
Waypoints
Click a row to zoom the profile to that waypoint.