2016-04-22 108 views
0

我正在開發一個正在運行的應用程序,因此計算某人旅行的總距離對於我的項目很重要。在我的didUpdateLocations方法中,我將新位置附加到一個數組,然後計算兩個最近值之間的距離。然而,第一個計算是一個荒謬的數字。無論我使用何種精度設置,問題都會持續存在。CLLocation distanceFromLocation返回錯誤的答案,然後正確的答案

一些代碼:

var locationIndex = 0 
    var distanceTraveled: CLLocationDistance = 0.0 
    var allLocations = [CLLocation]() 

    func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { 

     print(allLocations.count) 

     if locations[0].horizontalAccuracy < 15 { 

     self.allLocations.append(locations[0]) 

     if allLocations.count > 1 { 

      var distanceIncrement = CLLocationDistance() 

      distanceIncrement = allLocations[allLocations.endIndex - 2].distanceFromLocation(allLocations[allLocations.endIndex - 1]) 

      self.distanceTraveled += distanceIncrement 
      print(distanceTraveled) 

     } 

     } else { 

      print("Invalid") 

     } 

    } 

會發生什麼事,當我打印(distanceTraveled)是第一個值,例如,34.5模擬運行,這是荒謬的,因爲它意味着當跑步者在大約1.3秒內(更新之間的時間)移動了34.5米。然後,在第一次打印後,數字會增加合理的數量,例如:34.5,39.8,43.3等...有時第一次打印的數字甚至可能在500s內,這顯然是不正確的。這是模擬器還是我的實現問題?我能做些什麼來解決這個問題?

+0

http://stackoverflow.com/a/28953613/2303865 –

回答

2

根據我的經驗,你從位置經理獲得的第一個值是不好的。第一個位置讀數通常是GPS上次「點亮」時的緩存讀數。您可以通過檢查位置上的時間戳來檢測並拒絕陳舊的讀數。如果它超過了一秒鐘,就丟棄它。

接下來,您獲得的前幾個位置讀數往往相當不準確。您想要檢查水平精度讀數,這實際上是一個「半徑」值(以米爲單位),用於指定位置可能位於的圓的半徑。較小的值更好。

如果精度低於您選擇的某個閾值,您應該檢查水平精度讀數並丟棄讀數。我建議20米左右。根據條件,您可能無法獲得比此更準確的任何讀數。

模擬器對測試這些東西毫無價值。你需要創建一個測試應用程序,記錄你得到的讀數,然後出去走走(和/或乘坐汽車/公共汽車乘客)並測試。您甚至可以讓某人在您擁有手機和Mac時驅動您,並在繫繩時從Xcode運行應用程序。 (當我第一次弄清楚位置管理器的細微之處時,我這樣做了。)

+0

謝謝。它並沒有真正的幫助,但卻提供了寶貴的建議。我認爲這只是一個模擬器。我已經實施了你的安全衛士。爲了模擬的目的,我剛剛拋出了第一個值。似乎工作得不錯。 –

+0

它沒有幫助?你有沒有弄清楚爲什麼你會得到錯誤的答案,然後是好的答案?你在模擬器或設備上測試嗎? –

+0

它沒有幫助,因爲無論我嘗試了什麼,我仍然在模擬器上看到錯誤的讀數。這個問題可以在實際設備上解決。 –