把记录带走:GPX、KML 和 CSV 各是干什么用的
三种格式,三件不同的活。每一种到底装着什么,什么场合该挑哪一种,以及为什么「能不能导出」这件事本身,才是决定你的骑行历史到底属不属于你的那个属性。
一趟只存在于某一个 App 里的记录,是一趟你租来的记录。App 会停止运营,订阅价格会上调,公司会被收购,而「我能不能带着自己的历史离开」这个问题,往往会在很短的时间里变得紧迫。导出就是决定这件事的那个功能,值得在你真的需要它之前,先弄清楚这几种格式各自在干什么。
GPX——用来在 App 之间搬运一条路线
GPX 是一种 XML 格式,从 2002 年起就是 GPS 软件之间的通用语言。几乎所有东西都读得懂它:Garmin 设备、Strava、Komoot、Gaia、QGIS、OpenStreetMap 的编辑器,以及每一个带上传框的地图网站。
它装着三类东西,而把它们搞混,通常就是麻烦的来源。
- 航点(waypoint)——单独标记的点,没有先后顺序。一个登山口,一个补水点。
- 路线(route)——一串有顺序的点,描述你打算怎么走。一份计划。
- 轨迹(track)——一串有顺序、带时间戳的记录点,内部再分成若干轨迹段。一份关于你实际走过哪里的记录。
一趟记录下来的路是一条轨迹。每个点带着纬度、经度,通常还有高度和时间戳,扩展字段里可以再加心率、踏频、温度等等——而互通性正是从这里开始变得参差不齐的,因为扩展是可选的,而每一家厂商都有自己偏爱的那几个。
对任何一个会骑过隧道的人来说,真正要紧的细节是这个:一条 GPX 轨迹可以包含多个轨迹段,而段与段之间的断点,正是这个格式用来表达「记录在这里被中断了」的方式。一个把中断过的一趟路压平成一整段连续轨迹的导出器,等于把这条信息扔掉了,而之后读这个文件的任何东西,都会把两头连起来。
KML——用来在 Google Earth 里看它
KML 同样是 XML,最初为 Google Earth 开发,现在是开放地理空间信息联盟的一项标准。它和 GPX 有重叠,但目标是呈现而不是交换:样式、颜色、图标、文件夹,以及决定一条线是贴着地形铺、还是画在真实高度上的高度模式。
当你想在三维里看一条路线、把它铺在地形上,或者想递给别人一个双击就能在 Google Earth 里打开的文件时,用 KML。但不要拿它当你的归档副本——它是一种面向渲染的格式,在 Google 生态之外支持要薄一些,而 KMZ 不过是压缩过的 KML。
CSV——用来自己算自己的账
CSV 根本就不是一种 GPS 格式,而这恰恰是它有用的原因。它是行和列,任何一个电子表格都打得开,它让你可以去问一些 App 自己的界面并不回答的问题。
它有两种真正不同的形态,搞清楚你要的是哪一种,能省下很多时间。
- 一个点一行。这趟路里的每一次定位:时间、纬度、经度、高度、速度、精度。这是拿来做分析的那份文件——把速度和坡度画在一起,找出你到底是在哪里慢下来的,或者去核对某一段你信不过的精度数值。
- 一条轨迹一行。你记录过的每一趟,一趟一行:日期、里程、时长、爬升。这是拿来做你这一年表格的那份文件——按月统计总公里数,按运动类型做数据透视,画一张整个赛季的图。
Roam 这四种形态都能导出:GPX、KML、按点的 CSV 和按轨迹的 CSV。FIT 是被有意留空的,而不是做一个半残的出来——对于一种很容易做坏的格式来说,这是一个讲得通的取舍。
有两件事,比格式清单更要紧
它必须从磁盘导出,而不是从正在跑的记录器导出
你最想抢救回来的那一趟,往往正是出了岔子的那一趟——记录被中断、而且再也没有恢复的那一趟。如果一个 App 只能导出它那个活着的记录器此刻攥在手里的东西,那么它恰恰给不了你这一趟。Roam 的导出器读的是数据库,不是引擎,所以一条记录进程被杀掉、再也没有回来的轨迹,依然可以单独导出。
它应该告诉你这个文件能不能信
一次导出可能是完整的,同时又是错的——只要 App 关于某一趟路的认知,和实际存下来的东西已经分了家。Roam 会把两者比一比:汇总里声称的点数,和磁盘上真实的点数,然后报告它们是否一致。不管一致与否,文件都会被写出来,这是有意的:拒绝导出等于连坏消息带数据一起拿走,而拿着这台手机的人,才是那个还能为此做点什么的人。
一些实际的建议
- 归档用 GPX。它是十年之后最有可能还读得懂的那种格式,也是其他每一个工具都接受的那种。
- 在你需要之前就先导出。你想把历史拿出来的那一刻,通常也正是某件事已经出了岔子的那一刻。
- 一趟带缺口的路,在相信第三方网站报出来的里程之前,先看看它的分段结构,因为那个网站会对这些洞做出它自己的处理。
- 做年度回顾,用一条轨迹一行的那份 CSV,而不是导出两百个 GPX 文件再想办法把它们加起来。
- 记住,一条轨迹是一份关于你去过哪里的记录。在把一条从你家门口出发的轨迹发出去之前,先想想这件事。
在 Roam 里,导出属于 Roam Pro。完整地记录一趟、查看它、回放它,都是免费的,也会一直免费下去。
常见问题
GPX 和 KML 有什么区别?
GPX 是交换格式——几乎每一个 GPS 工具都能读能写,也是归档时的正确选择。KML 面向呈现,为 Google Earth 而生,带着 GPX 没有的样式和高度模式。搬数据用 GPX,在三维里看它用 KML。
我该导出哪一种 CSV?
如果你想分析单独的一趟,用一个点一行的那种——沿途的速度、高度和精度都在里面。如果你想要一张涵盖很多趟的表格,用来做月度统计或者画一张赛季图,就用一条轨迹一行的那种。
被中断过的一趟路,还能导出吗?
能,前提是这个 App 导出的是存下来的数据,而不是那个活着的记录器。Roam 的导出器读的是数据库,所以一趟记录被杀掉、再也没有恢复的路,依然能被写出来。
为什么导出来的里程和 App 里显示的不一样?
通常是因为你把文件导进去的那个工具,用它自己的规则重算了一遍——不同的平滑方式,以及它自己对信号缺口的处理决定。一个保留了分段断点的文件,在不同工具里会被区别对待,而它们谁也没有义务跟别人保持一致。
一个不会把这趟弄丢的记录 App
Roam 每收到一个定位点就立刻写进手机,和当前的累计数字在同一个事务里落盘;信号断掉的那一段标成断的,不拿一条直线糊过去;爬升读的是气压计,不是 GPS 高度。没有账号,不用登录,不同步。完整记录一趟、看它、回放它,都是免费的。