个人跑步地图 2020 版 • 手艺

by 服老思, on 2020-12-25
永久链接

完成图:2018 - 2020 香港行山、跑步综合轨迹

数据整合

Trail Watch 是老一代行山爱好者常用的记步程序。(其他几个 App 见 🔗香港行山资源 22 个[1]

过去几年的习惯是行山用 Trail Watch 记录,跑步用 Strava 记录。最近被人忽悠入了跑步可视化的坑,没办法得统一下数据。

Trail Watch 导出

Trail Watch 有提供 gpx 文件的下载,所以只需要解决批量下载的问题即可。

先看下面板的样子:

每个活动都有一个唯一的 ID,稍微分析一下页面,可以得到过去 55 个活动 ID 的列表:

然后进入其中一个活动,看下 gpx 导出按钮(“Export”)的事件监听:

跟着这个事件处理函数,找到从 ID 拼接 gpx 文件路径的逻辑:

比如,其中一个 gpx 文件的下载链接如下:

https://www.trailwatch.hk/?t=gpx&export&i=472214

先把这些 ID 存到一个叫 “list” 的文件中,然后使用 wget 下载,用 xargs 开 5 个并发:

然后就得到这堆东西了:

Strava 上传和编辑

目前我以 Strava 为中枢,也买了他的 premium pack,所以会继续使用好一段时间。

得到这些 gpx 文件后,可以上传到 Strava:

不用担心重复上传,Strava 会根据路径信息去重 [编注 2022: 应该是只检查了开始时间]。所以即使网络有问题,也可以放心上传了,有效缓解了强迫症们的压力。

上传完成后,跑一下昨天的地图可视化流程,得到第一个版本:

下载的 gpx 文件

运动轨迹图

我们先利用 Yihong 的开源项目,做一个地图可视化。项目文档非常清晰,从同步 Strava 数据,到开启本地 node 服务器,跟着做大概半小时就能搞定。在此就不赘述。以下链接和二维码通往项目主页。

https://github.com/yihong0618/running_page

注:如果是 Strava 导入,原项目只包含 “Run” 类型的记录;不少同学在香港喜欢跑山,可能使用
“Hike” 类型进行记录。以下修改参考了
Geekplux 的 fork[2]。  

2018-2020 Strava 运动轨迹汇总 (未包含 trail watch 的数据)

数据修整

如果将地图缩放到其中一个区域,会发现一些问题。其中一条横线,从日落观澜亭,直接划到了湾仔…… 这是因为我第一次🔗跑追日路线[3] 失败,在距离终点 200m 的地方手机停电了。等再次上电,都已经到家。Trail Watch 这个 App 做得比较早,不会智能停表,就这样划了一笔回来,颇为难看。

快速扫描了一下导入的路线,发现类似事故过去还出现过多次,比如:

好在 Strava 有这个 crop 的功能,可以剪掉异常的部分:

清理之后的路线图,看起来就正常多了:

那接下来,就是如何从将近 300 个路径中,找到有异常的?

其实 gpx 文件每 10s 左右,会记录一个点,所以只需要观察前后两个点就行,通常这种异常会表现为几种形式:1、距离过长;2、时间过长;3、速度过大(e.g. 上车后忘记关表)。

这部分代码放  gist[4] 上了,可扫码访问。

https://gist.github.com/hupili/600d6ad064de63945118ae1e4e23be9c

经过系统扫描,发现了几条异常路线,比如第一次失败的追日:

也有一些不太好修改,比如这次和朋友爬西高山,上山前误触停表了,发现的时候已经到了山顶,所以就直接划了一横。好在时间和距离没什么畸变,不影响运动统计,就这样留着吧。

其他可视化

针对我 Strava 上记录,也尝试用其他可视化方法探索一下。

气泡图

稍微修改下,把起始点的座标记录下来。以距离为半径,做气泡图。

Zoom in 到香港,用颜色区分 Run 和 Hike。

博闻 | 明察 | 躬行
心法 | 手艺 | 随想

REF

[1] 香港行山资源 22 个: https://mp.weixin.qq.com/s/W3Zx3tQVjQjcj_w6-0YtJA

[2] Geekplux 的 fork: https://github.com/geekplux/activities/commit/27ac5217db192270722eb791a023c3aa34d5064e#diff-02a17b4a00f43e7e49df26b84d2ae78a033766bbeb7a3a91e06c7ea0b10176bdL106-L122

[3] 跑追日路线: https://mp.weixin.qq.com/s/n2RnP1ODRTl1vlSpx-4w2g

[4] gist: https://gist.github.com/hupili/600d6ad064de63945118ae1e4e23be9c