tkrajina / gpxpy

gpx-py is a python GPX parser. GPX (GPS eXchange Format) is an XML based file format for GPS tracks.
Apache License 2.0
1.02k stars 223 forks source link

Extension data for Garmin gpx files #172

Closed pgastinger closed 4 years ago

pgastinger commented 5 years ago

Hi,

I wanted to parse my Garmin gpx files and extract heart rate (and other) values, but could not find a working example.

Let's take this simple gpx file for reference:

<?xml version="1.0" encoding="UTF-8"?>
<gpx creator="Garmin Connect" version="1.1"
  xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/11.xsd"
  xmlns:ns3="http://www.garmin.com/xmlschemas/TrackPointExtension/v1"
  xmlns="http://www.topografix.com/GPX/1/1"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns2="http://www.garmin.com/xmlschemas/GpxExtensions/v3">
  <metadata>
    <link href="connect.garmin.com">
      <text>Garmin Connect</text>
    </link>
    <time>2019-04-20T16:05:31.000Z</time>
  </metadata>
  <trk>
    <name>MTB</name>
    <type>cycling</type>
    <trkseg>
      <trkpt lat="28.25535676442086696624755859375" lon="36.4394402690231800079345703125">
        <ele>175.600006103515625</ele>
        <time>2019-04-20T16:05:31.000Z</time>
        <extensions>
          <ns3:TrackPointExtension>
            <ns3:atemp>26.0</ns3:atemp>
            <ns3:hr>103</ns3:hr>
          </ns3:TrackPointExtension>
        </extensions>
      </trkpt>
      <trkpt lat="28.25535751879215240478515625" lon="36.43944169394671916961669921875">
        <ele>176.8000030517578125</ele>
        <time>2019-04-20T16:05:32.000Z</time>
        <extensions>
          <ns3:TrackPointExtension>
            <ns3:atemp>26.0</ns3:atemp>
            <ns3:hr>97</ns3:hr>
          </ns3:TrackPointExtension>
        </extensions>
      </trkpt>
    </trkseg>
  </trk>
</gpx>

This is my simple python script:

import gpxpy
import gpxpy.gpx

with open('/home/peda/PycharmProjects/Sports/test.gpx') as gpx_file:
    gpx = gpxpy.parse(gpx_file)

for track in gpx.tracks:
    for segment in track.segments:
        for point in segment.points:
            print('Point at ({0},{1}) -> {2}'.format(point.latitude, point.longitude, point.elevation))
            for ext in point.extensions:
                print(ext.tag)
                for extchild in list(ext):
                    print('{0} -> {1}'.format(extchild.tag, extchild.text))

with following output:

(py37test) peda@peda-desktop /tmp/py37test $ python main.py 
Point at (28.255356764420867,36.43944026902318) -> 175.60000610351562
{http://www.garmin.com/xmlschemas/TrackPointExtension/v1}TrackPointExtension
{http://www.garmin.com/xmlschemas/TrackPointExtension/v1}atemp -> 26.0
{http://www.garmin.com/xmlschemas/TrackPointExtension/v1}hr -> 103
Point at (28.255357518792152,36.43944169394672) -> 176.8000030517578
{http://www.garmin.com/xmlschemas/TrackPointExtension/v1}TrackPointExtension
{http://www.garmin.com/xmlschemas/TrackPointExtension/v1}atemp -> 26.0
{http://www.garmin.com/xmlschemas/TrackPointExtension/v1}hr -> 97

This works for my purposes, but it would be nice to abstract all the XML parts for the extensions too and parse it as python objects (without namespaces). It would be nice to have access to these values just by using something like this:

print(ext.hr)
103
print(ext.atemp)
26.0

regards, Peter

tkrajina commented 4 years ago

Duplicate https://github.com/tkrajina/gpxpy/issues/119