据我所知,在存储/操作/处理“路由”数据时,没有标准库、接口,甚至没有一套既定的最佳实践。我们在 Ride with GPS 上为这些问题付出了很多努力,我知道其他解决相关问题的站点也可以这样说。我希望有一个标准,并愿意与某人一起工作。
GPX 没问题,似乎是一种标准……至少在您开始处理 GPX 文件并发现每个人都同时向格式添加了自己的自定义扩展来处理心率、节奏、功率等数据之前。此外,没有将路线点与跟踪点相关联的标准方法。路线的“面包屑轨迹”表示为一系列 trkpt 元素,而路线点(例如“左转进入第 4 街”)则表示为一系列单独的 rtept 元素。理想情况下,您希望将给定的路线点与特定的跟踪点相关联,而不是仅仅为路线点提供纬度和经度。如果您的路径在同一条街道上进行了多次循环,则可能会在路线点应沿路线连接的位置产生一些歧义。
KML 和 Garmin 的 TCX 格式与 GPX 类似,各有优缺点。最后,这些格式实际上仅用于在程序之间传输数据。它们没有解决如何在程序中表示数据的问题,或者可以对数据执行什么类型的操作。
我们将轨迹数据存储为对象数组,其键对应于不同的属性,例如纬度、经度、海拔、开始时间、开始距离、速度、心率等。此外,我们沿路线存储一些元数据以指定每个部分的详细信息。在解析我们的跟踪点数组时,我们使用此元数据将 Route 拆分为一系列 Segment。段可以拆分、连接、移除、附加、反转等。它们还封装了跟踪点生成的方法,无论是通过沿直线插入点,还是请求表示端点之间方向的路径。这些方法允许相当直接地实现拖放编辑和其他常见操作。Route 对象可用于处理涉及多个段的操作。一个例子是,如果您有一条由路段组成的路线 - 一些行车路线、直线、步行路线等等 - 并且想要反转路线。您可以要求每个段自行反转,在此过程中保持其设置。在更高的层次上,我们使用 Map 类来连接接口,向 Route(s) 发送命令,并保持一系列快照或转换函数正确更新,以支持合理的撤消/重做。
路线操纵和生成是目标之一。其他人正在汇总汇总统计信息,正在构建数据以实现有效的可视化/交互。任何可以接收数据并生成折线图的系统都已在一定程度上解决了这些问题。这里不完全是新领域。路线数据的一个有趣特征是,您通常会为 x 轴选择两个变量:距起点的时间和距起点的距离。两者都是单调递增的,并且都提供了有用但不同的数据解释。查看带有 x 轴距离的高程图将显示骑自行车上下山是对称的。使用 x 轴时间,上坡部分相当宽。这不仅仅是在图表上可视化数据,它还转化为您在将数据处理为汇总统计数据时所做的决策。一些加权平均值基于时间,一些基于距离是有意义的。您最终想要的操作是最小、最大、加权(基于您选择的独立 var)平均值、过滤点和执行过滤的最小/最大/平均值的能力(仅使用您移动的点、忽略异常值等) )、不同的平滑函数(例如帮助计算总高程增益)、地图/减少功能的基本概念(我在 20-30 英里/小时之间花费了多少时间等),以及涉及一些插值的固定窗口移动平均值。如果您想确定您最快的 10 分钟或 10 分钟的最高平均心率等,则后者是必要的。最后,您
如果您有兴趣,可以在此处查看所有这些操作的示例:http ://ridewithgps.com/trips/964148
可以将鼠标悬停在底部的图表上,拖动选择以放大。x 轴有一个链接可以在距离/时间之间切换。在底部的左侧边栏中,您会看到 30 秒和 60 秒的最佳效果 - 这些都是通过固定窗口移动平均线和插值完成的。在右侧边栏上,单击“指标”选项卡。拖动选择以放大图表上的某个部分,您将看到所有指标更新以反映您的选择。
乐于回答任何问题,或与任何人一起就其中一些想法的某种标准或开放实施进行合作。
这可能不是您正在寻找的答案,但我想我会提供一些关于我们如何在 Ride with GPS 上做事的细节,因为我们不知道您似乎正在寻找任何真正的标准。
谢谢!