Convert GeoJSON to CSV (spreadsheet)

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

GeoJSON stores your GPS data as nested JSON — a geometry array of coordinates paired with a separate coordinateProperties object holding timestamps, heart rate, cadence, power, and temperature as parallel arrays. That structure is convenient for Leaflet or a Python script using a JSON library, but it's awkward for a spreadsheet, a pivot table, or a quick pandas.read_csv, all of which want one flat row per point. This tool does that flattening for you: it walks the geometry and coordinateProperties arrays together and writes a single CSV row per coordinate, with a header naming every column your file actually contains. Because GeoJSON is the one source format on this site with every channel captured at full fidelity, this is also the one conversion pair with essentially nothing to lose — position, elevation, timestamp, heart rate, cadence, power, and temperature all carry across exactly, at the same millisecond precision GeoJSON stores them in. The only channel that doesn't map cleanly is laps, and that's because GeoJSON never had a lap concept to begin with, not because anything gets dropped in translation; if you need lap boundaries in your CSV, they simply weren't there to convert. Columns for channels your file doesn't contain are omitted rather than padded with empty cells, so what you get is exactly what your GeoJSON had, reshaped rather than reduced. As with every tool here, the flattening happens entirely client-side, in a background worker in your browser, so a route with hundreds of thousands of points converts without uploading anything or freezing the tab.

Questions

Does converting GeoJSON to CSV lose any data?

No — GeoJSON is captured at full fidelity for every channel this site supports, and CSV can hold all of them, so position, timestamps, heart rate, cadence, power, and temperature all survive exactly.

What columns will the CSV have?

timestamp, elapsed_s, lat, lon, elevation_m, plus hr_bpm, cadence_rpm, power_w, and temperature_c for any channel your GeoJSON's coordinateProperties actually contains. Missing channels don't appear as empty columns — they're left out entirely.

Why isn't there a lap column?

GeoJSON has no lap concept, so there's no lap data to include in the CSV. This isn't a loss in conversion — it reflects what the source format was capable of storing in the first place.

Can I open the CSV directly in Excel or Google Sheets?

Yes. The output is a standard comma-separated file with a header row, ready to open in any spreadsheet application or load with a data analysis library like pandas.