2011-09-28 72 views
1

我正在开发一个应用程序,记录一段时间的GPS跟踪。全球定位系统数据时间距离基地转换

跟踪完成后,我需要将基于时间的数据转换为基于距离的数据,也就是说,原始跟踪每秒有一个lon/lat记录,我需要将其转换为具有lon /每20米记录一次。

平滑原始数据似乎是一个很好理解的问题,我想我需要的东西平滑算法,但我很努力思考如何从基于时间的数据集转换为基于距离的数据集。

回答

1

这是一个很好的问题,什么让它如此有趣是数据点应该假定为随机的。这意味着你不能期望开始结束代表一个行为良好的多项式的数据图(如SINE或COS波)。所以你将不得不以小增量工作,这样x轴上的数值(可以这么说)不会振荡,这意味着Xn不能小于Xn-1。下一个考虑是数据点重叠或接近重叠的情况。想象一下,我正在记录我的GPS坐标,并且我们已经停止聊天或休息,并且我在接下来的五分钟内在一个二十五英尺的圈内随机走动。所以问题是如何忽略这种“数据噪音”?

为了简单起见,让我们考虑两点之间没有近似的线性计算;这是一条直线。这对您的计算可能绰绰有余。现在给出上述有关随机数据点的评论,您将希望按顺序遍历从起点到终点的数据。当你超过最后一个数据点或者你超出了产生坐标的总距离时(如子集),就会发生顺序终止。我们假设你的绘图精度为X.这将是你的20米。当你遍历的时候会有三个条件:

  1. 这两点之间的距离大于你的 的精度。因此保存起始点加上精度X.这个 也将成为你的新起点。
  2. 两点之间的距离等于您的精度。 因此保存起始点加精度X(或保存结束 点)。这也将成为你的新起点。
  3. 两点之间的距离小于您的精度。 因此精度被调整为精度减去终点。结束 点将成为您的新起点。

这里是伪代码,可能会帮助你开始。注意,点y减去点x =之间的距离。并且,点x加值=在点x和点y之间的距离值上的新点。

recordedPoints = received from trace; 
newPlotPoints = emplty list of coordinates; 
plotPrecision = 20 

immedPrecision = plotPrecision; 
startPoint = recordedPoints[0]; 
for(int i = 1; i < recordedPoints.Length – 1; i++) 
{ 
    Delta = recordedPoints[i] – startPoint; 

    if (immedPrecision < Delta) 
    { 
     newPlotPoints.Add(startPoint + immedPrecision); 
     startPoint = startPoint + immedPrecision; 
     immedPrecsion = plotPrecsion; 
     i--; 
    } 

    else if (immedPrecision = Delta) 
    {  
     newPlotPoints.Add(startPoint + immedPrecision); 
     startPoint = startPoint + immediatePrecision; 
     immedPrecision = plotPrecision; 
    } 

    else if (immedPrecision > Delta) 
    { 
     // Store last data point regardless 
     if (i == recordedPoints.Length - 1) 
     { 
      newPlotPoints.Add(startPoint + Delta) 
     } 

     startPoint = recordedPoints[i]; 
     immedPrecision = Delta - immedPrecision; 
    } 
} 

以前我曾提到过“数据噪声”。你可以将“if”和“else if”包装在另一个“if”中,这些因素决定了这个因素。最简单的方法是忽略数据点,如果它没有移动给定的距离。请记住,这个幻数必须足够小,使得被忽略的顺序记录的数据点不会总结为大而有价值的东西。因此,对忽略的数据点进行限制可能是一个好处。

综上所述,有很多方法可以准确地执行此操作。一个建议将此主题提升到下一个层次是插值。对于.NET,在http://www.mathdotnet.com有一个开源库。您可以在http://numerics.mathdotnet.com/interpolation/处使用其包含插值的Numberics库。如果你选择这样的路线,你的下一个主要障碍将是决定适当的插值技术。如果你不是数学大师,这里有一些信息可以帮助你入门http://en.wikipedia.org/wiki/Interpolation。坦率地说,使用两个相邻点的多项式插值对于您的近似值绰绰有余,前提是您认为Xn的概念不是< Xn-1,否则您的近似值将会偏斜。

最后要注意的是,这些计算是二维的,并且考虑到高度(方位角)或地球曲率。以下是这方面的一些额外信息:Calculate distance between two latitude-longitude points? (Haversine formula)

永远不会少,希望这会指出你在正确的方向。毫无疑问,这不是一个微不足道的问题,因此尽可能保持数据点范围尽可能小而仍然是准确的将对您有利。

另一个考虑可能是使用精确度来近似使用实际数据点以忽略过多的数据。因此,你基本上不保存两个坐标列表。

干杯, 杰夫

+0

感谢杰夫,这是一个很值得我在考虑去,有点“走线”的GPS点和“标记关”的距离的方式。数学不是一个太大的问题,非常感谢指针。我之前没有提到的一件事是,我很可能会使用卡尔曼滤波器来平滑原始GPS数据,然后再根据时间变为距离。这可能会解决一些“噪音” – RSLAndy