2011-09-28 42 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