TrailCam

指南

GPX 和 GeoJSON,轨迹数据到底该用哪个

GPX 和 GeoJSON 说到底都是一串坐标,但两者当初要回答的问题不一样。GPX 是专门为了描述一次 GPS 记录而生的——轨迹、海拔、每个点被记录下来的时间。GeoJSON 是为了描述地图上几乎任何形状而生的——一条徒步路线、一栋建筑的轮廓、一条国界线,用的都是同一小撮几何类型。这个出发点上的差异,纸面上看起来很小,可一旦真要把一次记录下来的徒步在两者之间搬来搬去,反而特别容易栽跟头。

两种格式各自是为了装什么

GPX 只为一件事而生:GPS 轨迹

GPX 有一套固定的、专门为这件事设计的结构——一条由点组成的轨迹,每个点带经纬度,通常还带海拔和时间戳,另外还能加单独的路点。这个格式里的每一项都是因为 GPS 记录需要它才存在的,没有什么需要配置,也没有什么是通用的。

GeoJSON 为任何一种地图数据而生

GeoJSON 是一种通用的方式,用来把地图上的形状——点、线、多边形——写成纯粹的 JSON,它在网页地图和 GIS 软件里随处可见,正是因为它不绑定任何一种特定的数据。一条徒步路线会变成一个 "LineString",建筑物的轮廓、湖泊的边界、国界线也一样,用的是完全相同的结构。对一张要放十几种不同地物的网页地图来说,这份灵活性正是它的全部吸引力所在。但对一次记录下来的徒步来说,这就意味着这个格式里根本没有内置"轨迹"这个概念——一次徒步只是 GeoJSON 能装的众多形状里的一条线而已。

转成 GeoJSON 之后,一次徒步会丢掉什么

GeoJSON 压根就没有专门存时间的字段。GPX 的轨迹点理所当然地带着时间戳;GeoJSON 的坐标就是一串数字——经度、纬度,外加可选的海拔,格式本身不会再挂上别的东西。想保留时间戳的转换工具只能自己发明一个地方去塞,通常是塞进要素自由格式的 "properties" 对象里的一个数组,这更像是权宜之计而不是标准做法——另一个工具读同一个文件时,既不保证知道这个数组存在,更不保证看得懂它是什么意思。

海拔保留得干净一些,作为每个坐标里经度、纬度之后可选的第三个数字。但这个顺序本身就是一个常见的坑:GeoJSON 永远把经度写在纬度前面,跟人平时说坐标的习惯顺序相反,也跟 GPX 自己属性里的顺序相反。转换时把这个顺序弄反了不会报错提醒你,只会把路线画到地球上完全不同的地方,或者相对该有的方位整个上下颠倒。

为什么这对一次徒步很关键

Strava、Garmin Connect、Komoot、Gaia GPS、CalTopo 这类徒步和骑行平台,从一开始就是围着 GPX 搭起来的。它们需要的是时间戳完好无损的轨迹——移动时间、配速,还有回放这次徒步,这些都得知道每个点是什么时候记录的,而不只是在哪儿。把 GeoJSON 文件丢给这些平台,运气好也就是把路线的形状导进去,但让这次徒步真正成为"记录"而不是一条画出来的线的那部分时间信息,全都不见了;运气不好,压根就不接受这个文件。

GeoJSON 的主场在别处:网页地图、GIS 软件,还有路线需要跟其他种类的地理数据摆在一起、而不是作为一次独立活动单独存在的场合。网站上的自定义地图、把步道跟地界叠在一起分析的 QGIS 项目、直接在 GitHub 仓库里预览的路线——这些地方原生读的就是 GeoJSON,本来也用不上 GPX 的时间戳。

两者对照

  • 用途:GPX 专为 GPS 轨迹而生。GeoJSON 是给地图上任何形状用的通用格式。
  • 时间戳:GPX 把它当作每个点的基本字段。GeoJSON 压根没有专门存时间的字段。
  • 坐标顺序:GPX 在自己的属性里把纬度写在经度前面。GeoJSON 永远把经度写在纬度前面——路线错位、跑偏的一个常见原因。
  • 出身:GPX 是 2002 年发布的开放格式,专为 GPS 数据而生,不属于任何一家公司。GeoJSON 是后来才定下来的网页地图和 GIS 通用标准。
  • 兼容性:GPX 几乎被所有徒步、骑行和地图平台原生支持。GeoJSON 被网页地图和 GIS 工具原生支持,在围着"活动"设计的健身类平台上支持面要窄得多。
  • 适合场景:GPX 适合想让计时、配速和回放都完好保留下来的一次记录徒步。GeoJSON 适合要显示在自定义网页地图上、或者要跟其他 GIS 图层放在一起分析的路线。

两种格式互相转换

把 GPX 转成 GeoJSON 是常见也很成熟的一步,GPSBabel 这类工具,还有不少免费的网页转换工具,一次操作就能完成,路线的形状转换后原样保留。但转换之后具体剩下什么,取决于用的是哪个工具:有的会悄悄把时间戳丢掉,有的会把它塞进 properties 对象里,接收端的工具不一定会去那儿找。如果后面还要用到时间信息,转换完最好检查一下输出结果。

反过来,把 GeoJSON 转回 GPX,坐标本身能转得很干净,但转换工具能补回来的时间戳,仅限于 GeoJSON 里原本就保留下来的那部分。一个从来没存过时间信息的 GeoJSON 文件——由于 GeoJSON 并不要求必须有时间信息,大多数文件都是这样——转出来的 GPX 轨迹会一个时间戳都没有:地图上是条对的线,但对需要移动时间或配速的平台来说,基本派不上什么用场。

TrailCam 导出的是什么

TrailCam 用 GPS 记录路线,单条路线或整段历史都能导出成 GPX 1.1,也能导出 CSV 汇总,不导出 GeoJSON。对一次徒步来说,GPX 这个格式保留的正是让它成为"记录"而不是"画出来的线"的那部分——每个点上的时间戳,移动时间、配速、爬升全靠它才能算出来,Strava、Garmin Connect、Komoot 也都能不丢东西地直接读取这个文件。导出是可选的 TrailCam Pro 功能,App 本身免费下载。

常见问题

GeoJSON 比 GPX 更适合徒步吗?
如果是想完整保留一次记录下来的徒步,不适合。GeoJSON 没有专门存时间的字段,转换出来的轨迹会丢掉计算移动时间、配速和爬升所依赖的时间信息,除非转换工具专门想办法用非标准的方式把它保留下来。GPX 把这份时间信息当作格式的核心部分来携带。
为什么转成 GeoJSON 之后我的路线跑到别的地方去了?
多半是经纬度顺序搞反了。GeoJSON 永远把经度写在纬度前面,GPX 自己的属性顺序正好相反。转换工具或者自己写的脚本一旦把这个顺序弄错,不会报错提醒,只会把路线画到地球上完全不同的地方。
TrailCam 能导出 GeoJSON 吗?
不能。TrailCam 导出的是 GPX 1.1 或 CSV 汇总,两者都会在每个点上保留时间戳——这正是 Strava、Garmin Connect、Komoot 都需要的东西,回放这次徒步也要靠它。

记录你自己的轨迹

TrailCam 是一款 iPhone 上的 GPS 轨迹记录 App,会把沿途拍的视频、照片和语音钉在你拍下它的那个位置,并支持导出成 GPX 1.1 或 CSV。免费下载。

在 App Store 下载