{"id":15069052,"url":"https://github.com/bernhardangerer/gpx-stats-helper","last_synced_at":"2026-01-03T11:34:40.972Z","repository":{"id":170428371,"uuid":"642873959","full_name":"BernhardAngerer/gpx-stats-helper","owner":"BernhardAngerer","description":"The \"GPX stats helper\" library allows reading from GPX files (GPS data) and calculates a lot of helpful parameters","archived":false,"fork":false,"pushed_at":"2025-03-15T16:57:51.000Z","size":340,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-15T17:33:56.124Z","etag":null,"topics":["geocoding","gps-data","gpx","gpx-library","gpx-reader","java","java-11","openstreetmap","reverse-geocoding","statistics"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/BernhardAngerer.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","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-05-19T14:37:34.000Z","updated_at":"2025-03-15T16:57:54.000Z","dependencies_parsed_at":"2024-07-06T17:49:05.218Z","dependency_job_id":"5c4be098-96db-49ba-9971-19635b7124f7","html_url":"https://github.com/BernhardAngerer/gpx-stats-helper","commit_stats":null,"previous_names":["bernhardangerer/gpx-stats-helper"],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BernhardAngerer%2Fgpx-stats-helper","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BernhardAngerer%2Fgpx-stats-helper/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BernhardAngerer%2Fgpx-stats-helper/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BernhardAngerer%2Fgpx-stats-helper/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/BernhardAngerer","download_url":"https://codeload.github.com/BernhardAngerer/gpx-stats-helper/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":243847056,"owners_count":20357317,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":["geocoding","gps-data","gpx","gpx-library","gpx-reader","java","java-11","openstreetmap","reverse-geocoding","statistics"],"created_at":"2024-09-25T01:40:11.814Z","updated_at":"2026-01-03T11:34:40.967Z","avatar_url":"https://github.com/BernhardAngerer.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![Maven Package](https://github.com/BernhardAngerer/gpx-stats-helper/actions/workflows/maven-publish.yml/badge.svg)](https://github.com/BernhardAngerer/gpx-stats-helper/actions/workflows/maven-publish.yml)\n[![Maven Package](https://github.com/BernhardAngerer/gpx-stats-helper/actions/workflows/maven-verify.yml/badge.svg)](https://github.com/BernhardAngerer/gpx-stats-helper/actions/workflows/maven-verify.yml)\n\n# 🛰️ GPX Stats Helper Library\n\nA lightweight Java library for **reading, manipulating, writing, and analyzing statistics** from GPX 1.1 files using the official [TopoGrafix XSD schema](https://www.topografix.com/gpx.asp).\n\nThis library enables developers to:\n- Parse and generate GPX 1.1-compliant files\n- Integrate with external APIs for reverse geocoding (OpenStreetMap/Nominatim)\n- Calculate key track statistics (distance, elevation, duration, speed, slope, etc.)\n\n## 📊 Track Statistics Calculated\n\n### 🧭 General Track Info\n- Number of waypoints\n\n### 📏 Distance \u0026 Elevation\n- Total / ascent / flat / descent distance `[m]`\n- Ascent / descent elevation `[m]`\n- Lowest / highest point `[m]`\n- Slope between two waypoints as percentage `%`\n- Slope distribution summary: percentage range → distance `[%, m]`\n\n### ⏱️ Time \u0026 Duration\n- Total duration `[h]`\n- Duration in motion / at rest `[h]`\n- Start / end time `[h]`\n\n### 🚴 Speed \u0026 Movement\n- Max / average speed `[km/h]`\n- Total / In Motion average pace `[min/km]`\n\n### 🗺️ Geographic Extents\n- Latitude range `[lat, lat]`\n- Longitude range `[lon, lon]`\n\n### 📍 Geopositions\n- Start / end / farthest position `[lon, lat, m]`\n- Positive and negative elevation peak positions `[lon, lat, m]`\n\n### 🔄 Coordinate Format Conversion\n- Convert decimal degrees to Degrees Minutes Seconds (DMS) format\n\n### 🗣️ Geolocation Metadata\n- Description of any geo-position  \n  *(using the free [Nominatim API](https://nominatim.org/release-docs/develop/api/Reverse/) for reverse geocoding based on OpenStreetMap data)*\n\n## ✅ Requirements\n+ Java 17+\n+ Maven\n\n## 🚀 Examples\n\n### 📥 Read GPX object from file\n```java\nGpxReader.fromFile(\"example/example1.gpx\").getTrk().stream()\n        .flatMap(track -\u003e track.getTrkseg().stream())\n        .flatMap(trackSegment -\u003e trackSegment.getTrkpt().stream())\n        .forEach(waypoint -\u003e System.out.println(formatWaypoint(waypoint)));\n```\n\n### 💾 Write GPX object to file\n```java\nGpx gpx = new Gpx();\nTrack track = new Track();\nTrackSegment segment = new TrackSegment();\n\nsegment.getTrkpt().addAll(List.of(\n        createWaypoint(47.80743, 12.378228, 587, LocalDateTime.of(2025, 4, 7, 16, 14, 16)),\n        createWaypoint(47.807343, 12.378138, 588, LocalDateTime.of(2025, 4, 7, 16, 14, 17))\n));\n\ntrack.getTrkseg().add(segment);\ngpx.getTrk().add(track);\n\nFile file = GpxWriter.toFile(gpx, \"output/generatedFile.gpx\");\n```\n\n### 🧾 Example Output (`example.gpx`)\n\n\u003e Generated by running `Example.main()`\n```\n🗂️ Metadata\nName: \"My sport activities\"\nAuthor Name: \"Bernhard Angerer\"\nCopyright Year: \"2022\"\nCopyright Author: \"Bernhard Angerer\"\nLink Href: \"https://github.com/BernhardAngerer\"\n\n### Track Nr. 1 - \"Mountainbike-Tour to the Kampenwand/Germany\" ###\n\n🧭 General Track Info\nNumber Of Waypoints: 2108\n\n📏 Distance \u0026 Elevation\nDistance (Total): 26,42 km\nDistance (Ascent): 9,56 km\nDistance (Flat): 7,78 km\nDistance (Descent): 9,07 km\nDistance (Unknown Elevation): 0 km\nElevation (Ascent): 1008 m\nElevation (Descent): 997 m\nHighest Point: 1547 m.s.l.\nLowest Point: 587 m.s.l.\nSlope between start and end point: 69 %\nSlope 20 to 30 % -\u003e 0,02 km\nSlope 10 to 20 % -\u003e 2,03 km\nSlope 0 to 10 % -\u003e 15,3 km\nSlope -10 to 0 % -\u003e 5 km\nSlope -20 to -10 % -\u003e 3,66 km\nSlope -30 to -20 % -\u003e 0,41 km\n\n🗺️ Geographic Extents\nLatitude Range: 47.754356 =\u003e 47.80743\nLongitude Range: 12.334281 =\u003e 12.378897\n\n⏱️ Time \u0026 Duration\nDuration (Total): 02:36:34 h\nDuration (Motion): 02:15:36 h\nDuration (Rest): 00:20:58 h\nStart Time: 07.09.2021, 15:37:42 h\nEnd Time: 07.09.2021, 18:14:16 h\n\n🚴 Speed \u0026 Movement\nSpeed (Maximum): 51,9 km/h\nSpeed (Average): 11,7 km/h\nPace Average (Total): 05:56 min/km\nPace Average (Motion): 05:08 min/km\n\n📍 Geopositions\nStart Position: Lat 47.80743, Lon 12.378228, Ele 587\nEnd Position: Lat 47.807346, Lon 12.378055, Ele 598\nFarthest Point: Lat 47.754356, Lon 12.355104, Ele 1546\nPositive Peak 1: Lat 47.754635, Lon 12.355498, Ele 1547\nNegative Peak 1: Lat 47.80743, Lon 12.378228, Ele 587\nNegative Peak 2: Lat 47.807049, Lon 12.378118, Ele 598\n\n🔄 Coordinate Format Conversion\nLat 47.80743, Lon 12.378228 -\u003e 47°48'26.748\"N, 12°22'41.621\"E\n\n🗣️ Geolocation Metadata\nStart = End - Geoposition: Lindenstraße, Bergham, Kraimoos, Bernau am Chiemsee, Landkreis Rosenheim, Bayern, 83233, Deutschland\nStart = End - Geoposition URL: https://nominatim.openstreetmap.org/ui/reverse.html?lat=47.80743\u0026lon=12.378228\u0026zoom=18\u0026layer=poi\n\n### Track Nr. 2 - \"Mountainbike-Tour in the Karwendel-Mountains from Scharnitz to Radfeld\" ###\n...\n```\n\n## 📦 Dependency (Maven / Gradle)\n\nAdd the dependency via https://jitpack.io/private#BernhardAngerer/gpx-stats-helper/4.0.0\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbernhardangerer%2Fgpx-stats-helper","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbernhardangerer%2Fgpx-stats-helper","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbernhardangerer%2Fgpx-stats-helper/lists"}