tkrajina/gpxpy

Extension data for Garmin gpx files

Closed this issue · 1 comments

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

Duplicate #119