Time GPS数据时距转换

Time GPS数据时距转换,time,gps,distance,Time,Gps,Distance,我正在开发一个应用程序,可以记录一段时间内的GPS跟踪 跟踪完成后,我需要将基于时间的数据转换为基于距离的数据,也就是说,如果原始跟踪每秒有一个lon/lat记录,我需要将其转换为每隔20米有一个lon/lat记录 平滑原始数据似乎是一个很好理解的问题,我想我需要平滑算法之类的东西,但我正在努力思考如何从基于时间的数据集转换为基于距离的数据集。这是一个很好的问题,有趣的是数据点应该是随机的。这意味着您不能期望一个从开始到结束的数据图来表示一个性能良好的多项式(如正弦波或余弦波)。因此,您必须以较

我正在开发一个应用程序,可以记录一段时间内的GPS跟踪

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


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

这是一个很好的问题,有趣的是数据点应该是随机的。这意味着您不能期望一个从开始到结束的数据图来表示一个性能良好的多项式(如正弦波或余弦波)。因此,您必须以较小的增量工作,这样x轴上的值(可以说)就不会振荡,这意味着Xn不能小于Xn-1。下一个考虑事项是数据点重叠或接近重叠的情况。想象一下,我正在记录我的GPS坐标,我们停下来聊天或休息,在接下来的五分钟里,我在一个25英尺的圆圈内随机行走。所以问题是如何忽略这种“数据噪音”

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

  • 两点之间的距离大于您的距离 精确因此,保存起点加上精度X。这 也将成为你新的起点
  • 两点之间的距离等于您的精度。 因此,保存起点加上精度X(或保存终点 点)。这也将成为你的新起点
  • 两点之间的距离小于您的精度。 因此,精度调整为精度减去终点。结局 这一点将成为你的新起点
  • 下面是可能有助于您开始的伪代码。注意,点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;
        }
    }
    
    recordedPoints=从跟踪接收;
    newPlotPoints=坐标的位置列表;
    绘图精度=20
    直接精度=绘图精度;
    起始点=记录点[0];
    对于(int i=1;i增量)
    {
    //不考虑存储最后一个数据点
    if(i==recordedPoints.Length-1)
    {
    newPlotPoints.Add(起点+增量)
    }
    起始点=记录点[i];
    imendprecision=增量-imendprecision;
    }
    }
    
    前面我提到了“数据噪音”。您可以将“if”和“else if”封装在另一个“if”中,该“if”决定了这个因素。最简单的方法是忽略未移动给定距离的数据点。请记住,这个神奇的数字必须足够小,这样被忽略的顺序记录的数据点就不会成为大而有价值的东西。因此,限制被忽略的数据点可能是一个好处

    综上所述,有许多方法可以准确地执行此操作。将这一主题提升到下一个层次的一个建议是插值。对于.NET,在上有一个开源库。您可以使用他们的Numberics库,该库至少包含插值。如果你选择这样一条路线,你的下一个主要障碍将是决定合适的插值技术。如果你不是数学大师,这里有一些信息可以让你开始学习。坦率地说,如果你认为Xn的概念不是最后一项要注意的是,这些计算是二维的,要考虑高度(方位角)或地球的曲率。以下是这方面的一些附加信息:

    无论如何,希望这能为你指明正确的方向。毫无疑问,这不是一个微不足道的问题,因此在保持准确的同时尽可能保持数据点范围小将对您有利

    另一个考虑因素可能是使用实际数据点进行近似计算,使用精度忽略过多的数据。因此,实际上您并没有保存两个坐标列表

    干杯,
    Jeff

    这是一个很好的问题,有趣的是数据点应该是随机的。这意味着您不能期望一个从开始到结束的数据图来表示一个性能良好的多项式(如正弦波或余弦波)。因此,您必须以较小的增量工作,这样x轴上的值(可以说)就不会振荡,这意味着Xn不能小于Xn-1。下一个考虑事项是数据点重叠或接近重叠的情况。想象一下,我正在记录我的GPS坐标,我们停下来聊天或休息,我在20英里内随机行走