Optimization GPS轨道的简化/优化

Optimization GPS轨道的简化/优化,optimization,gps,simplify,gpx,Optimization,Gps,Simplify,Gpx,我有一个由gpxlogger(1)(作为客户提供)生成的GPS轨迹。GPS接收机每1秒更新一次坐标,gpxlogger的逻辑非常简单,它记录位置(lat,lon,ele),以及每n秒(在我的例子中,n=3)从GPS接收的时间戳(time) 在写下几个小时的曲目后,gpxlogger保存了数兆字节长的GPX文件,其中包括数千个点。之后,我尝试在地图上绘制这条轨迹,并将其用于。这是可行的,但数千个点使得使用地图成为一种草率而缓慢的体验 我知道有几千个次优点。有无数个点可以被删除而几乎不丢失任何东西:

我有一个由
gpxlogger(1)
(作为客户提供)生成的GPS轨迹。GPS接收机每1秒更新一次坐标,gpxlogger的逻辑非常简单,它记录位置(
lat
lon
ele
),以及每n秒(在我的例子中,n=3)从GPS接收的时间戳(
time

在写下几个小时的曲目后,gpxlogger保存了数兆字节长的GPX文件,其中包括数千个点。之后,我尝试在地图上绘制这条轨迹,并将其用于。这是可行的,但数千个点使得使用地图成为一种草率而缓慢的体验

我知道有几千个次优点。有无数个点可以被删除而几乎不丢失任何东西:当有几个点大致构成直线,我们以相同的恒定速度在它们之间移动时,我们可以只留下第一个点和最后一个点,然后扔掉任何其他点

我曾想过用它来做这样的轨道简化/优化工作,但是,唉,它只适用于路线,即只分析路径的几何形状,没有时间戳(即不检查速度是否大致恒定)


是否有现成的实用程序/库/算法可用于优化轨迹?或者可能是我错过了gpsbabel的一些聪明的选择?

我遇到了类似的问题。gps单元获取点数的速率比需要的要大得多。许多地点在地理上彼此并不遥远。我采用的方法是使用哈弗森公式计算点之间的距离。如果距离不超过我的临界值(在我的例子中是0.1英里),我就放弃这个点。这会迅速将点数降低到可管理的大小

我不知道你在找什么语言。这是我正在做的一个C#项目。在底部,您将找到哈弗森代码

希望这能让你走


鲍勃

这可能是NP难的。假设你有点A,B,C,D,E

让我们尝试一个简单的确定性算法。假设您计算从点B到线A-C的距离,它小于您的阈值(1米)。所以你删除了B,然后你试着用同样的方法把C换成A-D行,但它更大,而D换成C-E,它也更大

但结果是最优解是A,B,E,因为点C和D靠近线B-E,但在相反的边上

如果你删除了一个点,你无法确定它是否应该是你应该保留的点,除非你尝试每一个可能的解决方案(大小可以是
n^n
,等等
n=80
,这超过了已知宇宙中的最小原子数)

下一步:尝试蛮力或分支绑定算法。不可缩放,不适用于真实世界的大小。您可以安全地跳过此步骤:)

下一步:首先做一个确定性算法,并用元启发式算法(禁忌搜索、模拟退火、遗传算法)对其进行改进。在java中有两种开源实现,例如

总之,使用第一个简单的确定性算法,您可能会得到一个可行的解决方案(尽管不是最优的),因为您只有一个约束


这个问题的一个远亲可能是旅行推销员问题变体,在这个变体中,推销员不能访问所有的城市,但必须选择几个城市。

你想扔掉一些不感兴趣的点。所以你需要一个函数来计算一个点有多有趣,然后你可以计算所有的点有多有趣,然后扔掉N个最不有趣的点,在这里你选择N来充分缩小数据集。听起来你对有趣的定义对应于高加速度(偏离直线运动),这很容易计算。

我想你需要保持改变方向的点。如果将轨迹分割为一组恒定方向的间隔,则只能保留这些间隔的边界点。

而且,正如Raedwald所指出的,你会希望留下加速度不为零的点。

看看平滑复杂多边形的算法,直线简化算法也可以帮助你减少点。

不确定这会有多好,但看看你的点列表如何,计算出它们之间的距离,从而计算出路线的总距离,然后确定分辨率距离,然后根据x米的每一步线性插值位置。也就是说,对于每一个固定点,你都有一个“距起点的距离”测量值,你只需对整个路线的n*x进行插值即可。(您可以决定需要多少个点,然后将总距离除以该值以获得分辨率距离)。除此之外,您还可以添加一个窗口函数,该函数可能取当前点+/-z点,并应用exp(-k*dist^2/精度^2)等权重要获得一组点的加权平均值,其中dist是与原始插值点的距离,精度是gps位置的假定精度。

一个非常简单的方法是重复移除产生最大角度的点(在0°到180°的范围内,其中180°表示它位于相邻点之间的直线上)在相邻点之间移动,直到你有足够的点为止。这将开始移除所有与其相邻点完全一致的点,并从那里开始

您可以在Ⅹ(n log(n))中这样做,方法是列出每个索引及其角度,按角度降序排列该列表,从列表前面保留所需数量,按索引降序排列较短的列表,并从点列表中删除索引

def simplify_points(points, how_many_points_to_remove)
  angle_map = Array.new
  (2..points.length - 1).each { |next_index|
    removal_list.add([next_index - 1, angle_between(points[next_index - 2], points[next_index - 1], points[next_index])])
  }
  removal_list = removal_list.sort_by { |index, angle| angle }.reverse
  removal_list = removal_list.first(how_many_points_to_remove)
  removal_list = removal_list.sort_by { |index, angle| index }.reverse
  removal_list.each { |index| points.delete_at(index) }
  return points
end

是的,如前所述,Douglas Peucker算法是一种简化2D连接的简单方法