Convert GeoJSON to TCX
Your file never leaves your device — conversion happens here in your browser.
Most format conversions on this site are about what survives the trip. This one is unusual because TCX can end up richer than the GeoJSON you started with: GeoJSON has no concept of laps at all, while TCX is Garmin's own training format, built around a `<Lap>` element that groups trackpoints into distinct segments with their own start time, distance, and duration. If you're generating GeoJSON programmatically — say, assembling a structured workout from a script, stitching together interval segments, or exporting planned splits from a GIS tool — this is the target that actually gains structure your source format was never able to express. Feed it timestamp boundaries or let it infer segments from gaps in your data, and the output is a TCX file with genuine laps, not a single flat track pretending to be one. Everything else about the conversion is close to lossless: position, elevation, timestamps, heart rate, cadence, and power all carry across cleanly, since TCX supports every one of those channels at full fidelity. The one channel that doesn't make it is temperature — TCX's schema has no field for it, so any temperature series in your GeoJSON is simply left out rather than approximated. Timestamps round to the nearest second in the output, TCX's native resolution, down from the millisecond precision GeoJSON allows. As with every tool here, none of this touches a server — the parsing, lap construction, and XML output all run locally in your browser, using a background worker so large files don't lock up the page while they convert.
Questions
Can GeoJSON even have laps to convert?
No — GeoJSON has no lap concept at all. That's what makes this conversion different from the others: TCX's Lap structure is added during conversion, either from timestamp boundaries you provide or inferred from your data, not carried over from the source.
What data survives converting GeoJSON to TCX?
Position, elevation, timestamps, heart rate, cadence, and power all convert at full fidelity — TCX supports every one of those. Temperature is the only channel with no home in TCX's schema, so it's dropped.
Why would I want laps if my GeoJSON never had them?
Structured workouts, interval sets, and multi-segment routes are much easier to review, compare, and analyze in training software when they're split into laps instead of one continuous track.
Are timestamps precise in the resulting TCX?
TCX stores timestamps to the second, so any sub-second precision in your source GeoJSON is rounded down during conversion.