{"id":17945373,"url":"https://github.com/sgraaf/gpx","last_synced_at":"2026-01-07T11:23:45.536Z","repository":{"id":57435625,"uuid":"375085945","full_name":"sgraaf/gpx","owner":"sgraaf","description":"A python package that brings support for reading, writing and converting GPX files. ","archived":false,"fork":false,"pushed_at":"2025-08-04T21:34:46.000Z","size":105,"stargazers_count":13,"open_issues_count":9,"forks_count":3,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-08-05T00:06:06.041Z","etag":null,"topics":["gps","gpx","xml"],"latest_commit_sha":null,"homepage":"https://gpx.readthedocs.io/en/stable/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/sgraaf.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","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,"zenodo":null}},"created_at":"2021-06-08T17:05:41.000Z","updated_at":"2025-01-12T16:15:09.000Z","dependencies_parsed_at":"2025-05-05T21:45:12.999Z","dependency_job_id":"0235e86d-f095-4ab2-9445-83aefaaeb31d","html_url":"https://github.com/sgraaf/gpx","commit_stats":null,"previous_names":[],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/sgraaf/gpx","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sgraaf%2Fgpx","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sgraaf%2Fgpx/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sgraaf%2Fgpx/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sgraaf%2Fgpx/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/sgraaf","download_url":"https://codeload.github.com/sgraaf/gpx/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sgraaf%2Fgpx/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":270296560,"owners_count":24560364,"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","status":"online","status_checked_at":"2025-08-13T02:00:09.904Z","response_time":66,"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":["gps","gpx","xml"],"created_at":"2024-10-29T06:43:11.722Z","updated_at":"2026-01-07T11:23:45.531Z","avatar_url":"https://github.com/sgraaf.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003c!-- start docs-include-index --\u003e\n\n# gpx\n\n[![PyPI](https://img.shields.io/pypi/v/gpx)](https://img.shields.io/pypi/v/gpx)\n[![Supported Python Versions](https://img.shields.io/pypi/pyversions/gpx)](https://pypi.org/project/gpx/)\n[![pre-commit.ci status](https://results.pre-commit.ci/badge/github/sgraaf/gpx/main.svg)](https://results.pre-commit.ci/latest/github/sgraaf/gpx/main)\n[![Test](https://github.com/sgraaf/gpx/actions/workflows/test.yml/badge.svg)](https://github.com/sgraaf/gpx/actions/workflows/test.yml)\n[![Documentation Status](https://readthedocs.org/projects/gpx/badge/?version=latest)](https://gpx.readthedocs.io/en/latest/?badge=latest)\n[![PyPI - License](https://img.shields.io/pypi/l/gpx)](https://img.shields.io/pypi/l/gpx)\n\n*gpx* is a zero-dependency, pure Python package for reading, manipulating, writing and converting GPX (GPS Exchange Format) files.\n\n\u003c!-- end docs-include-index --\u003e\n\n## Installation\n\n\u003c!-- start docs-include-installation --\u003e\n\n*gpx* is available on [PyPI](https://pypi.org/project/gpx/). Install with [uv](https://docs.astral.sh/uv/) or your package manager of choice:\n\n```sh\nuv add gpx\n```\n\n\u003c!-- end docs-include-installation --\u003e\n\n## Documentation\n\nCheck out the [*gpx* documentation](https://gpx.readthedocs.io/en/stable/) for the [User's Guide](https://gpx.readthedocs.io/en/stable/usage.html) and [API Reference](https://gpx.readthedocs.io/en/stable/api.html).\n\n## Usage\n\n\u003c!-- start docs-include-usage --\u003e\n\n### Reading a GPX file\n\n```python\nfrom gpx import read_gpx\n\n# Read GPX data from file\ngpx = read_gpx(\"path/to/file.gpx\")\n\n# Access basic properties\nprint(f\"Creator: {gpx.creator}\")\nprint(f\"Bounds: {gpx.bounds}\")\nprint(f\"Number of waypoints: {len(gpx.wpt)}\")\nprint(f\"Number of tracks: {len(gpx.trk)}\")\nprint(f\"Number of routes: {len(gpx.rte)}\")\n```\n\n### Working with waypoints\n\n```python\nfrom gpx import Waypoint\nfrom decimal import Decimal\n\n# Create a new waypoint\nwaypoint = Waypoint(\n    lat=Decimal(\"52.3676\"),\n    lon=Decimal(\"4.9041\"),\n    name=\"Amsterdam\",\n    desc=\"Capital of the Netherlands\",\n    ele=Decimal(\"2.0\"),\n)\n\ngpx.wpt.append(waypoint)\n\n# Iterate over waypoints\nfor wpt in gpx.wpt:\n    print(f\"{wpt.name}: ({wpt.lat}, {wpt.lon})\")\n```\n\n### Working with tracks and statistics\n\n```python\n# Access track data\nfor track in gpx.trk:\n    print(f\"Track: {track.name}\")\n\n    # Get statistics from the track\n    print(f\"  Total distance: {track.total_distance:.2f} meters\")\n    print(f\"  Total duration: {track.total_duration}\")\n    print(f\"  Average speed: {track.avg_speed:.2f} m/s\")\n    print(f\"  Max elevation: {track.max_elevation} meters\")\n    print(f\"  Total ascent: {track.total_ascent} meters\")\n\n    # Iterate over track segments and points\n    for segment in track.segments:\n        print(f\"  Segment with {len(segment.points)} points\")\n        for point in segment.points:\n            print(f\"    Point: ({point.lat}, {point.lon}) at {point.time}\")\n```\n\n### Creating a GPX from scratch\n\n```python\nfrom gpx import GPX, Metadata, Track, TrackSegment, Waypoint\nfrom datetime import datetime, timezone\nfrom decimal import Decimal\n\n# Create track points\npoints = []\nfor i in range(5):\n    point = Waypoint(\n        lat=Decimal(\"52.0\") + Decimal(i) * Decimal(\"0.01\"),\n        lon=Decimal(\"4.0\") + Decimal(i) * Decimal(\"0.01\"),\n        ele=Decimal(\"10.0\") + Decimal(i) * Decimal(\"2.0\"),\n        time=datetime.now(timezone.utc),\n    )\n    points.append(point)\n\n# Create a track with segments\nsegment = TrackSegment(trkpt=points)\ntrack = Track(name=\"Morning Run\", trkseg=[segment])\n\n# Create metadata\nmetadata = Metadata(\n    name=\"My GPS Track\",\n    desc=\"A sample track\",\n    time=datetime.now(timezone.utc),\n)\n\n# Create GPX object (creator defaults to \"*gpx*\")\ngpx = GPX(\n    creator=\"My Application\",\n    metadata=metadata,\n    trk=[track],\n)\n```\n\n### Writing GPX files\n\n```python\nfrom gpx import from_string\n\n# Write GPX data to file\ngpx.write_gpx(\"output.gpx\")\n\n# Convert to string\ngpx_string = gpx.to_string()\nprint(gpx_string)\n\n# Parse from string\ngpx = from_string(gpx_string)\n```\n\n### Working with routes\n\n```python\nfrom gpx import Route\n\n# Create route points (waypoints)\npoint1 = Waypoint(\n    lat=Decimal(\"52.3676\"),\n    lon=Decimal(\"4.9041\"),\n    name=\"Start: Amsterdam Centraal\",\n)\n\npoint2 = Waypoint(\n    lat=Decimal(\"52.3731\"),\n    lon=Decimal(\"4.8922\"),\n    name=\"Dam Square\",\n)\n\n# Create a route\nroute = Route(name=\"City Tour\", rtept=[point1, point2])\ngpx.rte.append(route)\n\n# Access route statistics\nprint(f\"Route distance: {route.total_distance:.2f} meters\")\n```\n\n### Converting to other formats\n\n*gpx* supports converting GPX data to various formats:\n\n```python\nfrom gpx import GPX, read_gpx\n\ngpx = read_gpx(\"path/to/file.gpx\")\n\n# Write to file formats\ngpx.write_gpx(\"output.gpx\")           # GPX file\ngpx.write_geojson(\"output.geojson\")   # GeoJSON file\ngpx.write_kml(\"output.kml\")           # KML file (Google Earth)\n\n# Convert to data formats (strings/bytes)\nwkt_string = gpx.to_wkt()   # Well-Known Text\nwkb_bytes = gpx.to_wkb()    # Well-Known Binary\n\n# Access GeoJSON-compatible data via the __geo_interface__ property\ngeojson_dict = gpx.__geo_interface__\n```\n\n### Reading from other formats\n\n*gpx* can read data from various file formats:\n\n```python\nfrom gpx import read_gpx, read_geojson, read_kml\n\n# Read from files\ngpx = read_gpx(\"path/to/file.gpx\")\ngpx = read_geojson(\"path/to/file.geojson\")\ngpx = read_kml(\"path/to/file.kml\")\n```\n\n### Converting from data formats\n\n*gpx* can convert from data formats (strings, bytes, objects):\n\n```python\nfrom gpx import from_geo_interface, from_wkt, from_wkb\n\n# Convert from WKT (Well-Known Text)\ngpx = from_wkt(\"POINT (4.9041 52.3676)\")\ngpx = from_wkt(\"LINESTRING (4.9 52.3, 4.91 52.31, 4.92 52.32)\")\n\n# Convert from WKB (Well-Known Binary)\ngpx = from_wkb(wkb_bytes)\n\n# Convert from any object that implements the __geo_interface__ protocol (e.g., Shapely)\nfrom shapely.geometry import Point, LineString\n\npoint = Point(4.9041, 52.3676)\ngpx = from_geo_interface(point)\n\nline = LineString([(4.9, 52.3), (4.91, 52.31), (4.92, 52.32)])\ngpx = from_geo_interface(line)\n\n# Or convert from a GeoJSON dict directly\ngeojson = {\"type\": \"Point\", \"coordinates\": [4.9041, 52.3676]}\ngpx = from_geo_interface(geojson)\n```\n\n### Command-Line Interface\n\n*gpx* provides a command-line interface (CLI) for common GPX operations:\n\n```sh\n# Validate a GPX file\ngpx validate path/to/file.gpx\n\n# Show information and statistics about a GPX file\ngpx info path/to/file.gpx\ngpx info --json path/to/file.gpx  # Output as JSON\n\n# Edit a GPX file\ngpx edit input.gpx -o output.gpx --reverse-tracks\ngpx edit input.gpx -o output.gpx --min-lat 52.0 --max-lat 53.0\ngpx edit input.gpx -o output.gpx --start 2024-01-01T10:00:00 --end 2024-01-01T12:00:00\ngpx edit input.gpx -o output.gpx --precision 5 --elevation-precision 1\ngpx edit input.gpx -o output.gpx --strip-all-metadata\n\n# Merge multiple GPX files\ngpx merge file1.gpx file2.gpx file3.gpx -o merged.gpx\n\n# Convert between formats\ngpx convert input.gpx -o output.geojson\ngpx convert input.gpx -o output.kml\ngpx convert input.geojson -o output.gpx\n```\n\n\u003c!-- end docs-include-usage --\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsgraaf%2Fgpx","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsgraaf%2Fgpx","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsgraaf%2Fgpx/lists"}