{"id":16528387,"url":"https://github.com/danvk/gpx-tools","last_synced_at":"2026-06-22T02:32:10.396Z","repository":{"id":152211636,"uuid":"622253744","full_name":"danvk/gpx-tools","owner":"danvk","description":"A collection of scripts to collect and clean data for my hiking blog","archived":false,"fork":false,"pushed_at":"2023-04-05T21:15:09.000Z","size":14,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2026-04-17T00:17:37.909Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/danvk.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-04-01T15:14:58.000Z","updated_at":"2023-04-01T15:15:57.000Z","dependencies_parsed_at":null,"dependency_job_id":"c27f6583-f931-4ede-a606-a2023d353e0a","html_url":"https://github.com/danvk/gpx-tools","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/danvk/gpx-tools","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danvk%2Fgpx-tools","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danvk%2Fgpx-tools/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danvk%2Fgpx-tools/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danvk%2Fgpx-tools/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/danvk","download_url":"https://codeload.github.com/danvk/gpx-tools/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danvk%2Fgpx-tools/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34632558,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-22T02:00:06.391Z","response_time":106,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-10-11T17:40:09.649Z","updated_at":"2026-06-22T02:32:10.378Z","avatar_url":"https://github.com/danvk.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# gpx-tools\n\nCollection of scripts I've made to collect and clean data for my [hiking blog].\n\nA few use cases:\n\n- Figure out where I've been based on EXIF data in my photos on Google Photos,\n  e.g. to discover forgotten hikes I'd done in years past.\n- Use timestamps on photos to add times to GPX files that lack them.\n\n## Quickstart\n\n    python3 -m venv venv\n    pip install requirements.txt\n    ./extract.py path/to/your/photo-archive.zip\n\n## Scripts\n\n### Extracting location data from photos\n\nExtract all locations and times from photos in a collection of zip archives:\n\n    ./extract.py path/to/your/photo-archives*.zip \u003e photos.geojson\n\nFor me, these ZIP files came either from selecting photos in Google Photos and\ndownloading them, or from using Google Takeout to download _all_ my photos.\n\nIf you have many years of photos, this might produce an unwieldy GeoJSON file.\nTo filter mine down to just the Catskills, I used [mapshaper]:\n\n    mapshaper all-photos.geojson -join catskills.geojson calc='n = count()' -filter 'n\u003e0' -o catskills-photos.geojson\n\nIf you want to turn a collection of photos into a GPX track (for uploading to\n[gpx.studio], say), you can use `fc_to_track.py`:\n\n    ./fc_to_track.py photos.geojson \u003e track.gpx\n\n### Adding times to photos\n\nSometimes you have a GPX file for a hike but it lacks time data. This can happen if you\nstart with a track from [eBird] (which only records the shape of the track) or if you\nuse [gpx.studio] to trace out known hiking trails.\n\nBut you typically do have time data for at least some points on your hike from photos.\nThe trick is to associate those photos with track points from the GPX file.\n\nAssuming you start with `photos.geojson` and `track.gpx` and know the start/end times\nfor the entire hike:\n\n    # Step 1: cluster \"bursts\" of photos\n    ./cluster_photos.py photos.geojson \u003e photos.clustered.geojson\n\n    # Step 2: Associate those photos with track points, interpolating remaining times.\n    ./add_times_from_photos.py track.gpx photos.clustered.geojson '11:38:00' '18:50:00' \u003e track+times.gpx\n\nIf you want to attach elevation data to the track, [gpsvisualizer] has a helpful tool.\n\n[hiking blog]: https://www.danvk.org/catskills/\n[mapshaper]: https://mapshaper.org/\n[ebird]: https://ebird.org/\n[gpx.studio]: https://gpx.studio/\n[gpsvisualizer]: https://www.gpsvisualizer.com/elevation\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdanvk%2Fgpx-tools","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdanvk%2Fgpx-tools","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdanvk%2Fgpx-tools/lists"}