GPX Converter

100% private — files never leave your browser

FIT to GeoJSON Converter

Turn device .fit activities into .geojson files that load directly into QGIS, PostGIS, Mapbox, Leaflet, Datawrapper and every modern data pipeline. Timestamps ride along in the togeojson-standard coordinateProperties, and the whole conversion happens locally in your browser — nothing is uploaded.

How to convert to GeoJSON

  1. 1

    Drop your file

    Drag a FIT, GPX, TCX, KML, KMZ or GeoJSON file onto the box above, or click it to browse. The source format is detected automatically from the file contents.

  2. 2

    Wait a beat

    The conversion runs in a background worker on your device. Typical activities finish in well under a second; even 50 MB files process without freezing the page.

  3. 3

    Check the preview

    Distance, duration, ascent and average heart rate are shown alongside a map of the converted track, so you can confirm nothing was lost before downloading.

  4. 4

    Download

    Click the download button and the .geojson file is saved straight from memory. Nothing was uploaded, so there is nothing to clean up.

What is a FIT file?

FIT (Flexible and Interoperable Data Transfer) is the binary activity format created by Garmin and maintained by the FIT Coalition. Every Garmin watch, cycling computer and trainer writes .fit files, and brands like Wahoo, Zwift, COROS, Suunto and Bryton use it too. Because it is a compact binary format, a FIT file can hold a full season of second-by-second records — GPS position, altitude, heart rate, cadence, power, laps and sessions — in a fraction of the space the same data needs as XML.

The trade-off for that compactness is compatibility. FIT is a device format: desktop tools, older websites, GIS software and many coaching platforms either cannot open it at all or only import it through a vendor uploader. That is the moment most people go looking for a converter — and why this page exists. A faithful conversion preserves every sample your device recorded, including the extension channels (heart rate, cadence, power) that generic GPS formats often drop.

What is a GeoJSON file?

GeoJSON (RFC 7946) is the JSON dialect of geography — the format the modern web speaks natively. Mapping libraries (Leaflet, Mapbox GL, D3, Deck.gl), data-journalism tools (Datawrapper, Flourish), GIS suites (QGIS, PostGIS) and half the data-science Python stack all consume it without ceremony. A file is a FeatureCollection of geometries, coordinates are written as [longitude, latitude] pairs, and properties ride along as plain JSON.

Like KML, GeoJSON is about geography rather than training. It has no native slots for heart rate or power, though tools freely attach custom properties — the widely used togeojson convention stores per-point timestamps in coordinateProperties.times, which this converter both reads and writes. If the destination is a web map, a dashboard or a data pipeline, GeoJSON is almost always the shortest path.

Why convert training files to GeoJSON?

GeoJSON is what the data world speaks. Where FIT needs vendor tooling or a conversion library, GeoJSON drops straight into QGIS for spatial analysis, PostGIS for storage, Python's geopandas for processing, and web mapping libraries for display. Once an activity is GeoJSON, it stops being a 'fitness file' and becomes ordinary geographic data your existing toolchain can touch.

Typical reasons people make this jump: visualizing a season of rides on a Mapbox dashboard, buffering and measuring routes in QGIS, feeding activities into a data-journalism piece, or building a personal API where tracks are served as JSON. The format is also the natural input for tools like Datawrapper and Flourish when a story needs a map.

This converter writes clean RFC 7946 output: one Feature per lap, coordinates in standard [longitude, latitude] order, elevation as the third coordinate, and — when timestamps exist — ISO times in coordinateProperties.times, the same convention Mapbox's togeojson established and most tooling expects.

What to expect from the conversion

Position, elevation and timestamps convert exactly. Lap structure becomes multiple Features in the FeatureCollection, so a track's segmentation survives in a form GIS tools understand natively. The output is pretty-printed JSON — readable, diffable, and friendly to git if you version your tracks.

The honest limit: GeoJSON has no heart rate, cadence or power. Those channels are dropped, not fabricated. For 'where did I go' analysis that is no loss at all; for 'how hard was I working' analysis, stay in the fitness formats or convert to GPX/TCX where the physiological data survives.

Your files never leave this browser

This tool — like every tool on this site — runs entirely as client-side JavaScript. The file you drop is parsed in a Web Worker on your own device, converted in memory and handed straight back to you as a download. There is no upload endpoint, no server-side conversion service and no temporary storage: you can watch the network tab in your browser's developer tools and confirm that no file bytes are transmitted anywhere.

That matters more with fitness data than with most files. A GPS track is a precise log of where you were, at what time, and how hard your heart was working — home address, training habits, favorite routes and race schedule all in one file. Keeping conversion on-device means third-party converters never get a copy of that log, and the tool keeps working identically on a plane, in a basement, or anywhere else without signal.

FIT vs GeoJSON at a glance

AspectFITGeoJSON
Format typeCompact binaryJSON (RFC 7946)
Typical useDevice recording, training platformsGIS, web maps, data pipelines
GPS + elevationYesYes (third coordinate)
TimestampsYescoordinateProperties.times (ISO)
Heart rate / powerNativeNot representable — dropped
Best forTraining analysisSpatial analysis, dashboards, scripting

Frequently asked questions

That ordering is the GeoJSON standard (RFC 7946) — x before y, east before north. It feels backwards if you come from GPS files, but every GeoJSON reader expects it, and this converter writes it correctly. Loading the output into Leaflet, Mapbox or QGIS just works.

Related tools