Convert TCX to GeoJSON

Your file never leaves your device — conversion happens here in your browser.

A TCX file is built for training logs, not for GIS software, so getting a Garmin activity into QGIS, a Mapbox map, or any tool expecting standard geospatial JSON means changing format first — that's what this conversion does. The route becomes a GeoJSON LineString, and unlike the TCX-to-KML path on this site, nothing about your sensor data is lost in the process: heart rate, cadence, power, and temperature (when your file has it) ride along per point in a coordinateProperties object, the same structure the togeojson library uses, so the output is compatible with tools already built around that convention. Position and elevation carry over at full precision, and timestamps pick up millisecond resolution in the output. Laps are the one structural piece that doesn't survive — TCX has genuinely rich lap data, full boundaries with their own stats, but GeoJSON has no lap concept anywhere in its spec, so there's no field for that data to land in regardless of which converter you use. If lap structure matters more than mapping compatibility for your use case, keeping the file as TCX, or converting to CSV instead (where laps survive as a per-point index column), are the better options; GeoJSON is the right target when the destination is a map or a GIS pipeline, not a training log. Everything happens locally: the parsing, the coordinateProperties construction, the file write, all run in your browser in a background worker, so a long ride's worth of trackpoints converts without a page freeze and without the file ever reaching a server.

Questions

Does my heart rate and power data survive converting TCX to GeoJSON?

Yes, fully. It's stored per point in a coordinateProperties object, the same convention the togeojson library uses, so mapping and GIS tools built around that structure read it directly.

What happens to my TCX lap splits?

They're dropped. GeoJSON has no lap concept in its specification, so there's no field to hold lap boundaries regardless of which converter produces the file.

Is GeoJSON or CSV better if I need to keep lap information?

CSV — it stores lap boundaries as a per-point lap_index column. GeoJSON has no lap concept at all, so that data can't be represented there no matter how the source file is structured.

Can I load the output into QGIS or Mapbox directly?

Yes — it's standard GeoJSON with a LineString geometry and a coordinateProperties block, which both tools read without extra conversion steps.