GPX 文件里的 extensions(扩展)元素是什么?
extensions 是 GPX 文件里的一个可选区块,可以挂在某个轨迹点上,也可以挂在整条路线或整份文件上,专门用来放某个具体设备或软件想额外记下来、但 GPX 规范本身没有给它留位置的东西。规范只规定了"这里可以有个容器",容器里到底装什么,完全由写这份文件的那个程序自己决定——这也是为什么同一份 GPX 文件一旦离开写出它的那个 App,extensions 部分的表现会和文件其他部分完全不一样。
先说结论
GPX 1.1 给轨迹点定死了一份公开的字段清单:经纬度、海拔、时间戳,再加上名称、定位类型之类的少数几项。这份清单是故意锁死的——一个要在许多不同软件之间流通的格式,必须让所有读它的程序对同一个字段的含义有一致的理解,才谈得上真正通用。extensions 是规范里唯一故意留着开口的地方:一个带标签的容器,设备或 App 不用等格式的维护者先给它加一个正式字段,就能把自己想要的额外数据塞进去。
标准字段装不下的东西
轨迹点的基本字段管的是你在哪儿、多高、什么时候——这是几乎所有 GPS 用途都需要的三样东西,也是 GPX 从一开始公开就带着的三样东西。除此之外,不少硬件和软件还想在同一个点上多记一点别的:某个具体设备自带传感器读到的数值、某个 App 用来给不同定位打分、自己判断可信度用的内部标记,或者只有写出这份文件的程序自己才认得的一个编号。这些东西在规范里都没有正式位置,因为规范一旦定型,不可能每次有哪家厂商想多记一样东西就跟着加一个新字段。
里面实际装的是什么
实际情况是,extensions 区块里装的,是写出这份文件的软件自己觉得值得留下来的东西。一台带气象观测功能的户外设备,可能会在某个点上附一个环境读数。某个 App 可能会给点打上一个内部的精度标记,用来在自己的地图上画出不同的置信度颜色。一个允许把路线重新上传的网站,可能会埋一个只有它自己用得上的参考编号,方便下次收到同一份文件时对上账号。这些都不是 GPX 的正式字段,各自活在发明它的那一方自己的命名空间里,挂在轨迹点上,而不是内建进格式本身。
为什么 extensions 换个 App 就不太经得住折腾
这是最容易让人摸不着头脑的地方。一个 GPX 读取程序,只有义务理解规范里的基本字段;至于用它不认识的命名空间写的 extensions 内容,它完全可以直接跳过不管。这不算接收方出了问题——遇到不认识的 extensions 就跳过去,本来就是一个规矩的 GPX 读取程序该做的事,这样才能保证某一家的私有附加内容,不会拖累另一个完全不相关的程序去读大家都认的经纬度、海拔和时间。实际发生的事就是:extensions 里的一个数值,在写出它的那个 App 里看着好好的,换一个地方打开同一份文件,它就悄悄不见了,而文件本身其实完全没坏。
这也意味着,extensions 不是放"换个工具也要留住"的数据的好地方。如果一个数值重要到你希望它在 Strava、Garmin Connect、Komoot 和表格软件里看起来都一样,它就该放进这几家都已经认可的字段里,而不是一个只有写出它的那个 App 才保证能正确读回来的容器里。
TrailCam 在这里做了什么
从 TrailCam 导出的路线是一份普普通通的 GPX 1.1 文件:轨迹点上带着位置、海拔和时间,都是所有读取程序早就认得的字段,没有附带一个只有 TrailCam 自己才能正确读回来的私有 extensions 区块。这是有意为之的取舍——不附加任何别的 App 不一定认识、也可能被悄悄丢掉的专有数据,这份文件不管拿到哪里,表现都是一样的。GPX 导出是可选的 TrailCam Pro 里的功能,App 本身免费下载。
常见问题
- 是不是每份 GPX 文件都带 extensions?
- 不是,它完全是可选的。一份只需要位置、海拔和时间的普通轨迹导出文件,本来就没有理由带上它。
- 把 GPX 文件里的 extensions 区块删掉安全吗?
- 对轨迹本身没影响。位置、海拔和时间各自是独立的字段,删掉 extensions 区块不会动到它们,丢掉的只是那个区块里存的 App 或设备自己的数据。
- 为什么一个数值在这个 App 里看得到,换一个 App 打开同一份文件却不见了?
- 很可能它本来就存在那个 App 自己命名空间下的 extensions 里。读取的一方对看不懂的数据可以直接跳过,不用去猜它的意思,所以只存在 extensions 里的东西,就会出现在这个地方看得见、到另一个地方却看不见的情况。
记录你自己的轨迹
TrailCam 是一款 iPhone 上的 GPS 轨迹记录 App,会把沿途拍的视频、照片和语音钉在你拍下它的那个位置,并支持导出成 GPX 1.1 或 CSV。免费下载。