python - gpxpy : How to extract heart rate data from gpx file

标签 python gpx

This commit to gpxpy library包括对 Garmin 1.1 扩展的额外解析。然而,自这次提交以来,代码似乎发生了很大变化,而且现在似乎可以自动解析扩展。

但是我一直无法弄清楚如何使用 gpxpy 从 gpx 文件中提取心率数据或其他扩展数据。 .有没有人用 gpxpy 做过这个?它是怎么做到的?


编辑以避免关闭此问题:

如果您查看我上面链接的提交中的代码添加,它会修改 TrackPoint 类以添加“atemp”和“hr”

 class GPXTrackPoint(mod_geo.Location):
     def __init__(self, latitude, longitude, elevation=None, time=None, symbol=None, comment=None,
             horizontal_dilution=None, vertical_dilution=None, position_dilution=None, speed=None,
             name=None, atemp = None, hr = None):

然后在 parser.py 中您会看到添加了这个例程

def __parse_track_point_extension(self, node):
+        atemp_node = self.xml_parser.get_first_child(node, 'atemp')
+        atemp = mod_utils.to_number(self.xml_parser.get_node_data(atemp_node))
+
+        hr_node = self.xml_parser.get_first_child(node, 'hr')
+        hr = mod_utils.to_number(self.xml_parser.get_node_data(hr_node))

+        extensions = {"atemp":atemp, "hr":hr}
+        return extensions

然而,在当前代码中,结构看起来与最初提交时非常不同,但它似乎允许以更通用的方式解析扩展。但是我对 python 不够熟练,无法理解如何让它解析这些标签。我的问题是试图了解我在新代码的工作方式中遗漏了什么。我的直觉是将这样的一行添加到 the gpx.py code 中大约在第 74 行。

mod_gpxfield.GPXField('heart_rate', 'hr', type=mod_gpxfield.FLOAT_TYPE),

但是我希望有经验的人可以查看代码,看看是否有我遗漏的东西,比如指定列表 extensions=[hr, atemp] 并在读取数据时对它们进行一般解析。这个提交是在过去进行的,这似乎很奇怪,但现在这个功能已经丢失了,所以我想我遗漏了什么。

心率 xml 的部分在 trkpt 中看起来像这样 compared to their test schema

 <trkpt lat="1.6685718186199665069580078125" lon="-101.03414486162364482879638671875">
        <time>2018-02-10T19:24:06.000Z</time>
        <extensions>
          <ns3:TrackPointExtension>
            <ns3:hr>106</ns3:hr>
          </ns3:TrackPointExtension>
        </extensions>
      </trkpt>

在他们的 test.py 中你可以看到他们在他们的 gpx 测试文件中测试他们的测试扩展:

            <trkpt lat="10.1" lon="-20.2">
                <ele>11.1</ele>
                <time>2013-01-01T12:00:04</time>
                <extensions>
                    <last>true</last>
                </extensions>

正在测试标签:

self.assertEquals('true',gpx.tracks[0].segments[0].points[0].extensions['last'])

虽然我不明白它是如何被解析的,但这是否意味着做这样的事情:

hr=gpx.tracks[0].segments[0].points[0].extensions['hr']

会返回数据吗?使用 python 调试器,我看不到这些加载到 gpx.tracks 数据结构中。

最佳答案

看来,如果 DOM 中的任何扩展扩展很复杂,则子节点不会被解析。

这显然是代码的一个长期存在的问题: https://github.com/tkrajina/gpxpy/issues/73

编辑: 这是一个实际示例,但这在一定程度上取决于您的结构。

heart_rate = gpx.tracks[0].segments[0].points[0].extensions[0]['hr']

关于python - gpxpy : How to extract heart rate data from gpx file,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48795435/

相关文章:

python - Unicode解码错误: 'utf-8' codec can't decode byte 0xff in position 0: invalid start byte error in python while reading a csv file

python - 如何按目录隔离S3存储桶中的文件?

python - 杀死线程不起作用

xml - 如何处理深度 XQuery 递归问题

xml - 使用经典 ASP 在 XML 文档中追加子项

algorithm - 从 GPS 坐标记录计算圈数

python - 按键对字典进行排序并检索值

python - 有 "pip bundle"的合适替代品吗?

xml - 如何使用 SimpleStorage 插入 xml 序言以生成 gpx 文件?

java - 用于 Java 的 GPX 解析器?