Android行简化

Android行简化,android,Android,我正在寻找一些最佳实践建议 我创建了一个应用程序(非常像mytracks),它可以收集GPS测量值并将其显示在地图上。我希望能够以10秒的间隔记录24小时的GPS数据。这是大量数据,所以我没有将其保存在内存中,而是在数据到达时将其存储到SQLiteDB中。在draw()函数中,我选择所有内容并将其绘制为路径对象 我的上述方法非常有效,直到我有超过4小时的数据。然后,draw函数将永远执行,这使得应用程序看起来非常慢 我想我需要做的是在地图上画一条简化的轨迹。我的问题是这样做的最佳方式是什么 i)

我正在寻找一些最佳实践建议

我创建了一个应用程序(非常像mytracks),它可以收集GPS测量值并将其显示在地图上。我希望能够以10秒的间隔记录24小时的GPS数据。这是大量数据,所以我没有将其保存在内存中,而是在数据到达时将其存储到SQLiteDB中。在draw()函数中,我选择所有内容并将其绘制为路径对象

我的上述方法非常有效,直到我有超过4小时的数据。然后,draw函数将永远执行,这使得应用程序看起来非常慢

我想我需要做的是在地图上画一条简化的轨迹。我的问题是这样做的最佳方式是什么

i) 处理器密集型:在draw()中,从SQLiteDB中选择所有内容,构建简化的轨迹,并将其绘制在地图上

ii)内存密集:在内存中保持简化的轨迹,在新数据到达时更新,在draw()中只需将其绘制到地图

iii)魔术:使用一些特殊的覆盖,我不知道哪些处理线简化为您

亲切问候,,
Cathal

我最初的半随机想法:

  • 您不会说您实际上正在这样做,但不会为每个数据库表行存储一个样本。每隔10秒采集24小时的样本,即8640个样本。每个样本为2个双精度,即16个字节。一天的数据量为135KB,这个总和可以很容易地完全存储在内存中。您的数据库策略应该是让一个表行对应于一个采样周期,其最大长度为一天。不用说,示例数据应该位于BLOB字段中

  • 绘制路径:这取决于当前的地图缩放以及样本集的哪一部分可见。您要做的第一件事是迭代样本集合(最大8640),并确定当前缩放时可见的子集。这应该是一个相当快的行动。例如,5000是可见的。然后根据h/w假设为路径选择一些最大样本数。。。从稀薄的空气中挑选一个数字,比如说,用于路径的样本不超过500个(即,设备将不会很难绘制一条有500个点的路径)。因此,使用每10个样本(5000/500=10)构建路径,并确保包含可见集的第一个和最后一个样本


  • 注意,并不是每帧都做这些工作。用户完成平移或缩放地图后,只需重新计算路径。剩下的时间你只需画出你已经计算过的路径。

    我最初的半随机想法:

  • 您不会说您实际上正在这样做,但不会为每个数据库表行存储一个样本。每隔10秒采集24小时的样本,即8640个样本。每个样本为2个双精度,即16个字节。一天的数据量为135KB,这个总和可以很容易地完全存储在内存中。您的数据库策略应该是让一个表行对应于一个采样周期,其最大长度为一天。不用说,示例数据应该位于BLOB字段中

  • 绘制路径:这取决于当前的地图缩放以及样本集的哪一部分可见。您要做的第一件事是迭代样本集合(最大8640),并确定当前缩放时可见的子集。这应该是一个相当快的行动。例如,5000是可见的。然后根据h/w假设为路径选择一些最大样本数。。。从稀薄的空气中挑选一个数字,比如说,用于路径的样本不超过500个(即,设备将不会很难绘制一条有500个点的路径)。因此,使用每10个样本(5000/500=10)构建路径,并确保包含可见集的第一个和最后一个样本


  • 注意,并不是每帧都做这些工作。用户完成平移或缩放地图后,只需重新计算路径。剩下的时间,你只需画出你已经计算过的路径。

    奇怪的是,我只是在看大约5年前我为做类似事情而编写的代码

    以下是我所经历的步骤:

    • 将数据集简化为仅可见的细节。我设计了几个可插拔的简化策略,但有一个用于公差和输入/输出点渲染的通用接口。更多关于如何设计它下面

    • 缓存简化点列表的紧凑、快速访问版本。对于大数据集,尽可能多地使用基本体(而不是点对象)是有帮助的。使用
      双精度
      位置,每个点需要128字节,10000个点需要1.3MB内存

    • 高效渲染,且不会产生垃圾。通过x和y坐标的int/float/double数组进行迭代是最好的,使用一个紧密的渲染循环,在循环之外尽可能多地进行渲染。如果只是“绘制此路径”,您会惊讶于一次可以渲染多少点

    • 添加新点时通知简化程序,并在将新点添加到缓存点列表之前运行新点。根据需要进行更新,但尽量只处理最新的

    简化界面: 有很多方法可以实现这一点。最好的方法(对于大型点集)是为其提供一个
    迭代器
    ,并让简化算法使用它。这样,这些点不必都在内存中,您可以从DB查询中获取数据。例如,迭代器可以包装JDBC结果集。Simplifier还应该有一个“公差”值,以确定在忽略点之前点的接近程度

    如何简化点集/多边形线: 有很多算法

    • 最简单的方法是删除小于$