Posted at

iPhone5sの位置情報水平精度を取得してみた

More than 5 years have passed since last update.

サンプル取得回数も少なく、適当に計測しているので正確な値ではない可能性があります。ここの値を鵜呑みにしないようお願いします。

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を開いて EventsEvent Logs から参照する。

kobito.1386043979.326856.png

で、肝心の水平精度はどうなのよ?というと、取得開始直後は次のような感じ。場所は屋内→屋外(ただし建物のすぐ隣)。

スクリーンショット_2013-12-03_13.16.07-6.png

走りだして少ししたら精度が良くなった。

スクリーンショット 2013-12-03 14.13.43.png

他にもいくつかデータを取得して表にまとめてみた。セルラーが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がなくてもおおよその位置を把握できる(どうやってるんだ?過去の値か?)

以上。ツッコミ歓迎。