サンプル取得回数も少なく、適当に計測しているので正確な値ではない可能性があります。ここの値を鵜呑みにしないようお願いします。
CLLocationManagerが出力する値の水平精度が気になったので、開発中のアプリにFlurryエベントを仕込んで確認してみた。自転車通勤のデータなので、約1時間20分くらい。Flurry側には1000レコードほどログが記録されていて、おそらくアプリケーションからFlurryに記録可能なログの上限と思われる。
コードはこんな感じ(アプリのコードから抜粋+加工なので、コピペで動かないかも。あしからず)。
- (id)init
{
self = [super init];
if (self) {
_locationManager = [[CLLocationManager alloc] init];
_locationManager.delegate = self;
[_locationManager startUpdatingLocation];
[Flurry startSession:@"YOUR_FLURRY_API_KEY"];
}
return self;
}
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
// ログ用のdictionaryを作成
NSDictionary *params = @{
@"latitude": [NSNumber numberWithDouble:newLocation.coordinate.latitude],
@"longitude": [NSNumber numberWithDouble:newLocation.coordinate.longitude],
@"horizontalAccuracy": [NSNumber numberWithDouble:newLocation.horizontalAccuracy], // 水平精度
@"verticalAccuracy": [NSNumber numberWithDouble:newLocation.verticalAccuracy], // 垂直精度
};
// Flurryにログ記録
[Flurry logEvent:@"CLLocation" withParameters:params];
}
ロジックを実行するとlocationManager:didUpdateToLocation:fromLocation
が呼び出されてFlurryにイベントログが記録される。イベントログはFlurryを開いて Events → Event Logs から参照する。
で、肝心の水平精度はどうなのよ?というと、取得開始直後は次のような感じ。場所は屋内→屋外(ただし建物のすぐ隣)。
走りだして少ししたら精度が良くなった。
他にもいくつかデータを取得して表にまとめてみた。セルラーがXになっているのはSIMを抜いたiPhone5(iPhone5sではない)のもの。
Cellular | WiFi | Bluetooth | 場所 | 精度 |
---|---|---|---|---|
○ | ○ | ○ | 屋内 | 65m |
○ | ○ | ○ | 屋外で建物のすぐ隣 | 50m |
○ | ○ | ○ | 見晴らしのいい屋外 | 5m - 10m |
X | ○ | ○ | 屋内 | 65m |
X | X | ○ | 屋内 | 450m - 3000m |
X | X | X | 屋内 | 450m - 3000m |
X | ○ | ○ | 屋外 | 5m - 10m |
X | X | ○ | 屋外 | 5m - 10m |
まとめると次のような傾向がある。
- 水平精度の最高値は5m
- GPSが利用可能であれば、セルラー、Wi-Fiの有無を問わず、水平精度5m - 10mで位置を取得できる
- GPSが利用不可能な場合、Wi-Fiをベースに水平精度50m - 100m程度で位置を取得できる
- 屋外では、見通しが良い場合、悪い場合で精度がかなり違う(5m - 100mくらい)
- セルラー、Wi-Fiがなくてもおおよその位置を把握できる(どうやってるんだ?過去の値か?)
以上。ツッコミ歓迎。