oop - 是否有通用/标准/接受的方式来建模 GPS 实体(航点、轨迹)?

标签 oop language-agnostic gps data-modeling

这个问题与地理空间信息系统的知识有些重叠,但我认为它属于这里而不是 GIS.StackExchange

有很多应用程序处理具有非常相似对象的 GPS 数据,其中大多数由 GPX standard 定义。 .这些对象将是路线、轨迹、航点等的集合。一些重要的程序,如 GoogleMaps,以 KML 格式或多或少地序列化相同的实体。有许多其他在线 map 应用程序(ridewithgps、strava、runkeeper,仅举几例)以不同的方式处理此类数据,但允许或多或少地对数据进行等效的“操作”。这些操作的示例是:

  • 用鼠标直接操作轨迹/轨迹点(包括在 map 上绘制);
  • 基于时间和/或距离的合并和拆分;
  • 用 DEM/SRTM 高程替换 GPS 收集的高程;
  • 计算轨道部分的属性(总上升、平均速度、距离、耗时);

  • 有一些小型库(如 GpxPy )尝试对这些对象及其方法进行建模,以理想情况下允许封装的、可能与语言无关的库/API 的方式。

    事实是:这个问题已经存在了足够长的时间,足以让“普遍接受的标准”出现,不是吗?另一方面,大多数 GIS 软件非常专业地面向地理空间分析、地形和制图应用程序,而典型的旅行记录和旅行计划应用程序似乎更面向消费者爱好者,这可能解释了不同的分散方式项目/应用程序处理和建模问题。

    因此,考虑到所有所说的,问题是:目前或正在计划中,是否有一种标准方法可以以面向对象的方式对最常用的 GPS/Tracklog 实体及其规范属性和方法进行规范建模?

    有 GPX 模式,它非常接近我的想象,但它只包含对象和属性,而不包含方法。

    任何信息将不胜感激,谢谢!!

    最佳答案

    据我所知,在存储/操作/处理“路线”数据时,没有标准库、接口(interface),甚至没有一套既定的最佳实践。我们在 Ride with GPS 上为解决这些问题付出了很多努力,我知道其他解决相关问题的网站也可以这么说。我希望有一个标准,并愿意与某人一起工作。

    GPX 还可以,而且似乎是一种标准……至少在您开始处理 GPX 文件并发现每个人同时为格式添加了自己的自定义扩展以处理心率、节奏、功率等数据之前。此外,没有将路线点与跟踪点相关联的标准方法。路线的“面包屑路径”表示为一系列 trkpt 元素,路线点(例如“左转进入第 4 街”)表示为一系列单独的 rtept 元素。理想情况下,您希望将给定的类(class)点与特定的轨迹点相关联,而不是仅仅为类(class)点提供纬度和经度。如果您的路径在同一条街道上进行了多次循环,则可能会在路线上的路线点应附加的位置上引入一些歧义。

    KML 和 Garmin 的 TCX 格式与 GPX 类似,各有优缺点。最后,这些格式实际上仅用于在程序之间传输数据。它们没有解决如何在程序中表示数据的问题,或者可以对数据执行什么类型的操作。

    我们将轨迹数据存储为对象数组,键对应不同的属性,例如纬度、经度、海拔、起点时间、起点距离、速度、心率等。此外,我们沿路线存储一些元数据以指定每个部分的详细信息。在解析跟踪点数组时,我们使用此元数据将 Route 拆分为一系列 Segment。段可以被拆分、连接、移除、附加、反转等。它们还封装了轨迹点生成的方法,无论是通过沿直线插入点,还是请求表示端点之间方向的路径。这些方法允许相当简单地实现拖放编辑和其他常见操作。 Route 对象可用于处理涉及多个段的操作。一个例子是,如果您有一条由路段组成的路线 - 一些行车路线、直线、步行路线等等 - 并且想要反转路线。您可以要求每个段自行反转,在此过程中保持其设置。在更高的层次上,我们使用 Map 类来连接接口(interface),将命令分派(dispatch)到 Route(s),并保持一系列快照或转换功能正确更新以支持合理的撤消/重做。

    路线操纵和生成是目标之一。其他聚合汇总统计数据正在构建数据以实现高效的可视化/交互。任何能够接收数据并生成折线图的系统都在一定程度上解决了这些问题。这里并不完全是新领域。路线数据的一个有趣特征是,您通常会为 x 轴选择两个变量:距起点的时间和距起点的距离。两者都是单调递增的,并且都提供有用但不同的数据解释。查看以距离为 x 轴的高程图将显示骑自行车上下山对称。使用时间的 x 轴,上坡部分要宽得多。这不仅仅是在图表上可视化数据,它还转化为您在将数据处理为汇总统计数据时做出的决策。一些加权平均值基于时间,一些基于距离。您最终想要的操作是最小值、最大值、加权(基于您选择的独立变量)平均值、过滤点和执行过滤的最小值/最大值/平均值的能力(仅使用您移动的点,忽略异常值等)、不同的平滑函数(例如帮助计算总高程增益)、 map /减少功能的基本概念(我在 20-30mph 之间花费了多少时间等),以及涉及一些插值的固定窗口移动平均值。如果您想确定最快的 10 分钟或 10 分钟的最高平均心率等,则后者是必要的。最后,您将需要一种简单有效的方法来执行您在跟踪点子集上运行的任何计算.

    如果您有兴趣,可以在此处查看所有这些操作的示例:http://ridewithgps.com/trips/964148

    底部的图形可以鼠标悬停,拖动选择放大。x轴有一个链接,可以在距离/时间之间切换。在底部的左侧边栏上,您会看到 30 秒和 60 秒的最佳效果 - 这些是通过带有插值的固定窗口移动平均线完成的。在右侧边栏上,单击“指标”选项卡。拖动选择以放大图表上的某个部分,您将看到所有指标更新以反射(reflect)您的选择。

    很高兴回答任何问题,或与任何人合作,以某种标准或开放的方式实现其中一些想法。

    这可能不是您正在寻找的答案,但我想我会提供一些关于我们如何在 Ride with GPS 上做事的细节,因为我们不知道您似乎正在寻找任何真正的标准。

    谢谢!

    关于oop - 是否有通用/标准/接受的方式来建模 GPS 实体(航点、轨迹)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13073663/

    相关文章:

    function - 哪些语言是函数抽象而不是原始函数

    language-agnostic - 动态作用域 - 深层绑定(bind)与浅层绑定(bind)

    language-agnostic - 应用CQRS时如何在create中获取ID?

    android - 如何获得 5 分钟 android 一次的 gps 位置?

    Android - GPS 监听器

    java - java中的继承 : object state and behavior

    python - python内部类的目的是什么?

    java - 返回基于多个变量的多态类

    geolocation - 使用 GPS 检查用户是否在路线检查点附近

    javascript将对象方法传递给不同的对象方法