2016-04-22 15 views
0

私は実行中のアプリを開発中ですので、誰かが旅行した合計距離を計算することは私のプロジェクトにとって重要です。私のdidUpdateLocationsメソッドでは、新しい場所を配列に追加して、2つの最新の値の間の距離を計算しています。しかし、最初の計算は馬鹿馬鹿しいほどです。私が使っている精度の設定に関係なく問題は残っています。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などのように合理的な金額で数字が増加します。最初に印刷された数字が500になることもありますが、これは明らかに正しくありません。これはシミュレータの問題ですか、実装ですか?これを修正するにはどうすればよいですか?

+0

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

答えて

2

私の経験では、ロケーションマネージャから得た最初の値は悪いです。非常に最初の位置の読み取りは、しばしば、GPSが最後に点灯した時からのキャッシュされた読み取り値です。場所のタイムスタンプをチェックすることで、古い読みを検出して拒否することができます。 2歳以上の場合は、それを捨てます。

次に、取得する最初の数箇所の位置情報は、しばしば非常に不正確です。水平精度の読み取り値を確認します。これは実際には、半径が指定された円の半径を指定する「半径」値です(メートル単位)。値が小さくなるほど良好です。

正確度が選択したしきい値以下の場合は、水平精度の読み取り値と破棄値を確認してください。私は20メートルほどを提案する。条件によっては、それ以上の正確な測定値が得られないことがあります。

シミュレータは、このようなものをテストするのにまったく役に立たないです。あなたは取得した読み取り値を記録し、そこから出て歩き回る(および/または車/バスで乗客として乗車する)テストアプリケーションを作成してテストする必要があります。あなたはあなたの携帯電話とMacを持っている間にあなたを運転してXcodeからアプリを走らせてもらうことができます。 (私が最初にロケーションマネージャーの微妙な点を見つけたときにそれをしました)。

+0

ありがとう。それは本当に助けにはなりませんでしたが、貴重な助言はありました。私はそれが単なるシミュレータの事だと思っています。私はあなたの安全な警備員を実装しました。シミュレーション目的のために、私はちょうど最初の値を投げている。十分にうまくいくと思われる。 –

+0

どのように役立ちませんか?なぜあなたは間違った答えに続いて良いものが続くかを理解しましたか?あなたはシミュレータまたはデバイスでテストしていますか? –

+0

私は何を試しても、私はまだシミュレータ上で誤った読みを取得していたので、役に立たなかった。この問題は、実際のデバイス上で解決されます。 –

関連する問題