Core Locationのaccuracyについて

CLLocationManagerのdesiredAccuracyプロパティは、位置情報を取得する時に、求めたい精度を指定するためのパラメタです。しかしながら、実際に取得される位置情報は、その精度を満たしているとは限りません。そのことについて、Appleのドキュメントに書かれていることを要約すると、以下のような感じです。

(参考ドキュメント)
Core Location Framework Reference: Loading...
http://developer.apple.com/iPhone/library/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/AdvancedFeatures/AdvancedFeatures.html#//apple_ref/doc/uid/TP40007072-CH14-SW9

  • 要求された精度を達成するために最善を尽くすが、実際の精度は保証されない。
  • 最初に取得されるデータは精度よりも、できるだけ速くデータを返すことを優先するので、要求した精度に達していない可能性がある。
  • 最初に取得されるデータは、キャッシュされているものが返されることがあるので、タイムスタンプをチェックして、古いデータだったら捨てた方がいい。
  • 高い精度を要求すると、消費電力が大きい。

desiredAccuracyは、最低限このくらいの精度のデータが欲しいという目安を指定するものと考えると、しっくりと来るかもしれません。あと、精度を低く抑えておけば、消費電力を少なくすることができるということですね。

実際に、自宅のリビングで、SDKに付属のLocateMeサンプルで試してみたところ、どの精度を指定しても、複数回データが受信されました。そのときの傾向は、以下のようなものでした。

  • 1回目と2回目は、続けざまに同じ精度(982m)で、緯度/経度は全く同じ
  • 3回目は、2回目の5秒後に受信された。精度が199mのときと、846mのときがあった。緯度/経度もそれに伴って補正された。
  • 3回目が846mのときは、さらに45秒後に4回目として199mのデータが受信された。

ここから考えると、少なくとも3回は待たないと、精度の高いデータは取得できそうになさそうですが、その代わりに取得するまでに時間がかかってしまいます。また、iPhoneは、さまざまな方法を使って位置情報を取得するので、そのときの条件によっては、データが返される回数は変わる可能性があります。目的に応じてうまく制御することが必要ですね。取得の開始と終了を、ユーザの操作で行うというのも、選択肢としてあるかもしれません。
少なくとも、1回目に取得したデータを無条件に使わずに、タイムスタンプのチェックをすることは必須ですね。 http://developer.apple.com/iPhone/library/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/AdvancedFeatures/AdvancedFeatures.html#//apple_ref/doc/uid/TP40007072-CH14-SW9には、そのあたりのサンプルコードが示されているので、参考になるかと思います。