2014-05-02 135 views
1

我試圖解析KML文件,以計算與下面的算法兩個相鄰點之間的速度(類似於myTracks Android應用程序一樣)算法從KML跟蹤GPS座標

public double calculateSpeed(Location prev, Location curr) { 

    double deltaDistance = curr.distanceTo(prev); 
    double deltaTime = (curr.getTime() - prev.getTime())/1000.0; 
    double speedInMph = deltaDistance/deltaTime * 2.2369; 
    return speedInMph; 
} 

計算速度代碼初始化位置更新:

locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);   
Criteria criteria = new Criteria();   
provider = locationManager.getBestProvider(criteria, false); 
locationManager.requestLocationUpdates(provider,1000,5,locationListener); 

鏈接樣本KML文件和日誌文件:

https://dl.dropboxusercontent.com/u/29927114/kml/doc.kml https://dl.dropboxusercontent.com/u/29927114/kml/Log.txt

但我的問題是,有時值不正確。

對於例如:在下面登錄值來作爲74的速度,73,71,39 ,97,75,74和22,22,10 ,3085,20%,20除突出顯示的偏差值的剩餘值看起來是正確的。有沒有辦法找到/放棄這些值,或者我的算法存在一個基本缺陷?

05-02 09:08:10.657: D/KMLParser(11545): Attributes: when: 2014-04-30T17:03:32.070Z 
05-02 09:08:10.657: D/KMLParser(11545): Attributes: gx:coord: -1.40748616 52.13896311 175.0 
05-02 09:08:10.658: I/KMLParser(11545): 1. -1.40783922, 52.13916636 2. -1.40748616, 52.13896311 
05-02 09:08:10.658: I/KMLParser(11545): Dist = 33.102333068847656, Time = 0.999 mps = 74.1207295712766 
05-02 09:08:10.658: E/KMLParser(11545): Index = 2, Speed = 74.0 
05-02 09:08:10.658: D/KMLParser(11545): Attributes: when: 2014-04-30T17:03:33.073Z 
05-02 09:08:10.658: D/KMLParser(11545): Attributes: gx:coord: -1.4071429 52.13875571 174.0 
05-02 09:08:10.659: I/KMLParser(11545): 1. -1.40748616, 52.13896311 2. -1.4071429, 52.13875571 
05-02 09:08:10.659: I/KMLParser(11545): Dist = 32.93754959106445, Time = 1.003 mph = 73.45763178489739 
05-02 09:08:10.659: E/KMLParser(11545): Index = 3, Speed = 73.0 
05-02 09:08:10.659: D/KMLParser(11545): Attributes: when: 2014-04-30T17:03:34.073Z 
05-02 09:08:10.659: D/KMLParser(11545): Attributes: gx:coord: -1.40680545 52.13855525 173.0 
05-02 09:08:10.660: I/KMLParser(11545): 1. -1.4071429, 52.13875571 2. -1.40680545, 52.13855525 
05-02 09:08:10.660: I/KMLParser(11545): Dist = 32.11391067504883, Time = 1.0 mph = 71.83560678901672 
05-02 09:08:10.660: E/KMLParser(11545): Index = 4, Speed = 71.0 
05-02 09:08:10.660: D/KMLParser(11545): Attributes: when: 2014-04-30T17:03:35.073Z 
05-02 09:08:10.660: D/KMLParser(11545): Attributes: gx:coord: -1.40663056 52.13844134 173.0 
05-02 09:08:10.661: I/KMLParser(11545): 1. -1.40680545, 52.13855525 2. -1.40663056, 52.13844134 
05-02 09:08:10.661: I/KMLParser(11545): Dist = 17.43634796142578, Time = 1.0 mph = 39.00336675491333 
05-02 09:08:10.661: E/KMLParser(11545): Index = 5, Speed = 39.0 
05-02 09:08:10.661: D/KMLParser(11545): Attributes: when: 2014-04-30T17:03:36.601Z 
05-02 09:08:10.661: D/KMLParser(11545): Attributes: gx:coord: -1.40592909 52.13802792 172.0 
05-02 09:08:10.662: I/KMLParser(11545): 1. -1.40663056, 52.13844134 2. -1.40592909, 52.13802792 
05-02 09:08:10.662: I/KMLParser(11545): Dist = 66.50345611572266, Time = 1.528 mph = 97.35705561862565 
05-02 09:08:10.662: E/KMLParser(11545): Index = 6, Speed = 97.0 
05-02 09:08:10.662: D/KMLParser(11545): Attributes: when: 2014-04-30T17:03:37.601Z 
05-02 09:08:10.662: D/KMLParser(11545): Attributes: gx:coord: -1.40557412 52.13781792 172.0 
05-02 09:08:10.663: I/KMLParser(11545): 1. -1.40592909, 52.13802792 2. -1.40557412, 52.13781792 
05-02 09:08:10.663: I/KMLParser(11545): Dist = 33.71452713012695, Time = 1.0 mph = 75.41602573738098 
05-02 09:08:10.663: E/KMLParser(11545): Index = 7, Speed = 75.0 
05-02 09:08:10.663: D/KMLParser(11545): Attributes: when: 2014-04-30T17:03:38.600Z 
05-02 09:08:10.663: D/KMLParser(11545): Attributes: gx:coord: -1.40522992 52.13760866 172.0 
05-02 09:08:10.663: I/KMLParser(11545): 1. -1.40557412, 52.13781792 2. -1.40522992, 52.13760866 
05-02 09:08:10.663: I/KMLParser(11545): Dist = 33.12906265258789, Time = 0.999 mph = 74.18058082840226 
05-02 09:08:10.663: E/KMLParser(11545): Index = 8, Speed = 74.0 

05-02 09:08:11.551: E/KMLParser(11545): Index = 1035, Speed = 19.0 
05-02 09:08:11.551: D/KMLParser(11545): Attributes: when: 2014-04-30T17:22:54.642Z 
05-02 09:08:11.552: D/KMLParser(11545): Attributes: gx:coord: -1.20618821 51.89674183 128.0 
05-02 09:08:11.556: I/KMLParser(11545): 1. -1.20617359, 51.89683068 2. -1.20618821, 51.89674183 
05-02 09:08:11.556: I/KMLParser(11545): Dist = 9.93702220916748, Time = 0.998 mph = 22.272670320327393 
05-02 09:08:11.556: E/KMLParser(11545): Index = 1036, Speed = 22.0 
05-02 09:08:11.556: D/KMLParser(11545): Attributes: when: 2014-04-30T17:22:55.642Z 
05-02 09:08:11.556: D/KMLParser(11545): Attributes: gx:coord: -1.20618857 51.89665264 129.0 
05-02 09:08:11.557: I/KMLParser(11545): 1. -1.20618821, 51.89674183 2. -1.20618857, 51.89665264 
05-02 09:08:11.557: I/KMLParser(11545): Dist = 9.92379093170166, Time = 1.0 mph = 22.198527935123444 
05-02 09:08:11.557: E/KMLParser(11545): Index = 1037, Speed = 22.0 
05-02 09:08:11.557: D/KMLParser(11545): Attributes: when: 2014-04-30T17:22:57.636Z 
05-02 09:08:11.557: D/KMLParser(11545): Attributes: gx:coord: -1.20619499 51.89656647 129.0 
05-02 09:08:11.558: I/KMLParser(11545): 1. -1.20618857, 51.89665264 2. -1.20619499, 51.89656647 
05-02 09:08:11.558: I/KMLParser(11545): Dist = 9.597917556762695, Time = 1.994 mph = 10.767092167864831 
05-02 09:08:11.558: E/KMLParser(11545): Index = 1038, Speed = 10.0 
05-02 09:08:11.558: D/KMLParser(11545): Attributes: when: 2014-04-30T17:22:57.643Z 
05-02 09:08:11.558: D/KMLParser(11545): Attributes: gx:coord: -1.20619719 51.89647971 130.0 
05-02 09:08:11.559: I/KMLParser(11545): 1. -1.20619499, 51.89656647 2. -1.20619719, 51.89647971 
05-02 09:08:11.559: I/KMLParser(11545): Dist = 9.654572486877441, Time = 0.007 mph = 3085.1875994137354 
05-02 09:08:11.559: E/KMLParser(11545): Index = 1039, Speed = 3085.0 
05-02 09:08:11.559: D/KMLParser(11545): Attributes: when: 2014-04-30T17:22:58.639Z 
05-02 09:08:11.559: D/KMLParser(11545): Attributes: gx:coord: -1.20620314 51.89639872 130.0 
05-02 09:08:11.560: I/KMLParser(11545): 1. -1.20619719, 51.89647971 2. -1.20620314, 51.89639872 
05-02 09:08:11.560: I/KMLParser(11545): Dist = 9.020686149597168, Time = 0.996 mph = 20.25941048999388 
05-02 09:08:11.560: E/KMLParser(11545): Index = 1040, Speed = 20.0 
05-02 09:08:11.560: D/KMLParser(11545): Attributes: when: 2014-04-30T17:22:59.638Z 
05-02 09:08:11.560: D/KMLParser(11545): Attributes: gx:coord: -1.2062078 51.89631631 129.0 
05-02 09:08:11.560: I/KMLParser(11545): 1. -1.20620314, 51.89639872 2. -1.2062078, 51.89631631 
05-02 09:08:11.560: I/KMLParser(11545): Dist = 9.174989700317383, Time = 0.999 mph = 20.54407853917913 
05-02 09:08:11.560: E/KMLParser(11545): Index = 1041, Speed = 20.0 
+0

您是否有在您的kml中登錄的gps點的準確性?或者,更簡單地說,您能否向我們提供kml或至少一部分? – Legisey

+0

@frouil,感謝您的評論,我已更新我的問題與示例代碼和鏈接爲kml文件和logcat輸出 – Harish

回答

3

我認爲問題來自GPS日誌中的小錯誤。當你拿到彼此非常接近的點(30-60米)時,一個小的變化可以將速度加倍。

我相信你可以清理你的數據是這樣的:

public double calculateSpeed(Location prev, Location curr, double lastSpeed) { 

    double deltaDistance = curr.distanceTo(prev); 
    double deltaTime = (curr.getTime() - prev.getTime())/1000.0; 
    double speedInMph = deltaDistance/deltaTime * 2.2369; 

    if (abs(speedInMph - lastSpeed) > lastSpeed/100*20) { //This check that the speed difference is no bigger than 20% of the last known valid speed 
     return -9999; //Or anything that make signal a problem 
    } 


    return speedInMph; 
} 

因此,通過增加輸入最後已知的速度,你可以控制你的計算速度是不是瘋了。但是,即使這可能起作用,通過使用移動平均值也許會有更好的結果。問題在於,如果汽車突然剎車,它可能會顯示出奇怪的行爲,因爲它可能認爲這是數據中的問題。

最好的解決方案我看到的是這樣做如下:

  1. 不要像之前
  2. 另寫代碼,作爲輸入pt.1的輸出此代碼將找到並刪除違規行爲速度 - >因此,如果汽車在0英里時剎車並停留一段時間,那麼它不是一個孤立的瘋狂速度,並且代碼不會將其移除。
+0

謝謝frouil,即使我正在考慮檢查數據變化,但不知道什麼值選擇。將嘗試與您的20%的建議。 – Harish