现有各种各样的运动app、运动手表手环以及gps码表等可以用于记录日常骑行或跑步等运动轨迹;但轨迹显示多数只限于显示一天的轨迹,经过搜索只发现一篇文章介绍跑步轨迹叠加方法(查看),根据教程尝试了下还因为perl语言的一些插件没搞定,果断放弃决定自己动手丰衣足食。

先上效果图:

ps:那条长线不是绘制的有问题,的确是单日骑行距离最远的一次,260多公里(开始30多公里由于码表磁铁位置问题只记录了几公里,码表记录233公里)。

济南市附近轨迹,缺个环泰:

卫星地图轨迹:

轨迹绘制方法:

作为一位骑行爱好者,手头刚好有一部捷安特码表。虽然其对应的APP显示的数据一应俱全,但是轨迹显示效果非常一般,如下图所示。作为一名经验丰富的IT从业者,多年的职业训练带来的敏锐直觉告诉我(没错,就是要自吹自擂然后加粗强调一下!):既然它的app能画出轨迹,码表本身必然保存有轨迹的原始数据,而且很有可能是gps的经纬度组成的点的序列。只要能拿到这些轨迹的原始数据,就能根据经纬度画出所有轨迹。

说干就干,首先把码表通过USB连接电脑,尝试一下看能不能访问内部的文件。进展顺利,发现内部有很多如下所示的.fit文件,而且文件名恰好跟自己的运动日期匹配,且文件大小根据对应日期骑行距离的长短大小不一,想必就是轨迹记录源文件了。

尝试用文本编辑器打开上述.fit文件,居然是乱码——很不幸,.fit文件是二进制文件,无法直接使用。经过一系列搜索发现.fit文件可以通过如下命令转换为另一种文本类型的gpx文件。

gpsbabel -i garmin_fit -f 170712051156.fit -o gpx -F 170712051156.gpx

但是目录下一百个文件,逐个文件执行命令并生成对应的gpx文件那得啥时候搞完?

一、gpx文件获取

linux优势立马体现出来,接下来给出获取gpx文件的详细步骤:

1. 进入存放.fit文件的目录,列出目录下的文件;

2. 把所有的fit文件名导入到文件fitfilelist中;

打开fitfilelist查看文件内容,是一百个fit文件名(图中截取部分):

3.使用正则表达式进行替换(正则表达式的使用),上图中的文件内容变成下图所示:

4.通过source fitfilelist执行fitfilelist文件中的一系列gpsbabel命令,等执行完就可以看到目录下多了很多gpx文件

5.创建gpxfile目录并将gpx文件移动到该目录:

查看一下gpx文件的内容,可以看到文件内容主要就是一系列经纬度、高度、时间、速度数据:

至此完成获取gpx文件部分。

二、利用gpx文件画轨迹图

这部分需要一定的python、django、javascript、HTML、CSS语言基础,以及了解高德地图API,看着语言很多,每个知识点只需要了解一点点就好;本文也直接给出了参考代码,不懂的地方可以去参考相关的官方文档。

本人也是一个跟芯片手册打交道的C语言驱动工程师,提到的这些语言基本都是为了画图现学的; 对于完成目标而言,学习难度并不高(能写出商用级别的代码又是另外一回事了)。

调用高德API画轨迹的步骤如下:

1.将第一部分获取到的gpx存放到/root/virenv_python3/django_for_study/mysite/polls/xmls/目录下;

2.django的view.py python文件导入xml解析模块:import xml.etree.ElementTree as ET,并编写函数完成如下功能:

遍历gpx文件,获取每个文件中的经纬度信息保存到变量path_dot中,所有文件的path_dot组成path_list, 通过render函数渲染给模板。

高能预警此处有坑:利用ElementTree模块递归查找gpx格式的xml文件(见上图)时,想通过查找‘trkpt’这个tag获取到每个tag下的‘lat’和‘lon’两个属性,但是无论如何获取不到,后来将tag打印出来发现内容为'{http://www.topografix.com/GPX/1/0}trkpt',即在trkpt前面加了文件中定义的xmlns的内容,将代码改为下图的496行所示就搞定了。

3.模板中通过javascript调用高德地图API加载地图,并为地图添加由一系列经纬度点组成的矢量折线:

3.设置url触发步骤2中的showmap函数,在浏览器中访问该URL,大功告成。现在还有点问题就是轨迹相比地图整体向西偏移了100米左右,我的码表以及小伙伴的码表数据绘制的轨迹偏移差不多。而且多次经过同一个位置的路线基本是叠加在一起的,这样看来码表记录基本准确,在数据基础上整体加个偏移就能跟地图完美重合了;有时间再研究。

使用python进行运动轨迹合并:多次骑行跑步轨迹叠加显示的更多相关文章

  1. 合并多个python list以及合并多个 django QuerySet 的方法

    在用python或者django写一些小工具应用的时候,有可能会遇到合并多个list到一个 list 的情况.单纯从技术角度来说,处理起来没什么难度,能想到的办法很多,但我觉得有一个很简单而且效率比较 ...

  2. Python win32com模块 合并文件夹内多个docx文件为一个docx

    Python win32com模块 合并文件夹内多个docx文件为一个docx #!/usr/bin/env python # -*- coding: utf-8 -*- from win32com. ...

  3. cesium制作自己的骑行轨迹

    制作自己的骑行轨迹 马上国庆节了,计划骑车回家,突然想到把所有的骑行线路汇总一下,无奈码表和APP不支持这样的操作,出于职业病,在此操作一下. 我用的是黑鸟码表,可以导出fit运动轨迹,但是fit还需 ...

  4. 智能头盔 "Livall携全球首款智能骑行头盔亮相CES"

    LIVALL是全球首创集音乐.通讯.智能灯光为一体的智能骑行头盔的研发者,日前Livall携旗下智能骑行头盔BH 100和BH 60参展CES 2017,这也是目前世全球首款智能骑行头盔类产品,同时亮 ...

  5. 2876: [Noi2012]骑行川藏 - BZOJ

    Description 蛋蛋非常热衷于挑战自我,今年暑假他准备沿川藏线骑着自行车从成都前往拉萨.川藏线的沿途有着非常美丽的风景,但在这一路上也有着很多的艰难险阻,路况变化多端,而蛋蛋的体力十分有限,因 ...

  6. bzoj 2876: [Noi2012]骑行川藏 拉格朗日数乘

    2876: [Noi2012]骑行川藏 Time Limit: 20 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 1033  Solved: ...

  7. 高等数学(拉格朗日乘子法):NOI 2012 骑行川藏

    [NOI2012] 骑行川藏 输入文件:bicycling.in   输出文件:bicycling.out   评测插件 时间限制:1 s   内存限制:128 MB NOI2012 Day1 Des ...

  8. bzoj2876 [Noi2012]骑行川藏

    Description 蛋蛋非常热衷于挑战自我,今年暑假他准备沿川藏线骑着自行车从成都前往拉萨.川藏线的沿途有着非常美丽的风景,但在这一路上也有着很多的艰难险阻,路况变化多端,而蛋蛋的体力十分有限,因 ...

  9. bzoj2876 [NOI2012]骑行川藏(拉格朗日乘数法)

    题目描述 蛋蛋非常热衷于挑战自我,今年暑假他准备沿川藏线骑着自行车从成都前往拉萨.川藏线的沿途有着非常美丽的风景,但在这一路上也有着很多的艰难险阻,路况变化多端,而蛋蛋的体力十分有限,因此在每天的骑行 ...

随机推荐

  1. 机器学习常用性能度量中的Accuracy、Precision、Recall、ROC、F score等都是些什么东西?

    一篇文章就搞懂啦,这个必须收藏! 我们以图片分类来举例,当然换成文本.语音等也是一样的. Positive 正样本.比如你要识别一组图片是不是猫,那么你预测某张图片是猫,这张图片就被预测成了正样本. ...

  2. 记一次处理mysql数据库无故锁表的经历

    某日,生产环境上的用户表突然无故锁表,原以为只是偶发的bug.所以第一时间想到的解决方案简单粗暴:重启数据库(service mysqld restart).问题得以解决. 10min后,该表再次锁表 ...

  3. 23种设计模式之单例(Singleton Pattern)

    单例 在软件系统中,经常有这样一些特殊的类,必须保证它们在系统中只存在一个实例(eg:应对一些特殊情况,比如数据库连接池(内置了资源)  全局唯一号码生成器),才能确保它们的逻辑正确性.以及良好的效率 ...

  4. Spring 梳理 - @Component

    使用@Component注解,表示该类定义为Spring管理Bean,使用默认value(可选)属性表示Bean标识符.如果不指定标识符,默认为首字母小写类名.例如类UserController的标识 ...

  5. Spring boot 梳理 - SpringBoot中注入ApplicationContext对象的三种方式

    直接注入(Autowired) @Configuration public class OAConfig { @Autowired private ApplicationContext applica ...

  6. System.exit退出程序

    方法源码: /** * Terminates the currently running Java Virtual Machine. The * argument serves as a status ...

  7. 利用百度云接口实现车牌识别·python

    一个小需求---实现车牌识别. 目前有两个想法 1. 调云在线的接口或者使用SDK做开发(配置环境和变异第三方库麻烦,当然使用python可以避免这些问题) 2. 自己实现车牌识别算法(复杂) 一开始 ...

  8. HttpWebRequest上传多文件和多参数——整理

    1.整理HttpWebRequest上传多文件和多参数.较上一个版本,更具普适性和简易型.注意(服务方web.config中要配置)这样就可以上传大文件了 <system.webServer&g ...

  9. 夯实Java基础系列16:一文读懂Java IO流和常见面试题

    本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...

  10. (七十九)c#Winform自定义控件-导航菜单

    前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. GitHub:https://github.com/kwwwvagaa/NetWinformControl 码云:ht ...