2010年10月9日土曜日

CoreLocation - [1] 現在地の緯度経度を取得する

CoreLocation を使って現在地の緯度経度を取得する。簡単なサンプルを作ってシミュレータ、iPhone3GS、iPadで動作確認をやってみた。

CoreLocation


CoreLocationManager を使う。使い方はリファレンスに書いてある。
CLLocationManager Class Reference より抜粋

To configure and use a CLLocationManager object to deliver events:
  1. Always check to see whether the desired services are available before starting any services and abandon the operation if they are not.
  2. Create an instance of the CLLocationManager class.
  3. Assign a custom object to the delegate property. This object must conform to theCLLocationManagerDelegate protocol.
  4. Configure any additional properties relevant to the desired service.
  5. Call the appropriate start method to begin the delivery of events.


サンプル


起動するとデバッガコンソールへ CLLocationの情報を書き出す簡単なサンプルを作った。
[3389:307] Start updating location.
[3389:307] ----------------------------------------------------
[3389:307] latitude,logitude : 35.433066, 139.720322
[3389:307] altitude          : 0.000000
[3389:307] cource            : -1.000000
[3389:307] horizontalAccuracy: 250.000000
[3389:307] verticalAccuracy  : -1.000000
[3389:307] speed             : -1.000000
[3389:307] timestamp         : 2010-10-20 06:31:09 +0900
画面表示は何もなし。



実装


準備

(1) Frameworks に CoreLocation.frameworkを追加する

(2) ヘッダファイル読み込み
#import <CoreLocation/CoreLocation.h>

コード


- (void)viewDidLoad {
    [super viewDidLoad];

 if ([CLLocationManager locationServicesEnabled]) {
  self.locationManager = [[CLLocationManager alloc] init];
  self.locationManager.delegate = self;
  [self.locationManager startUpdatingLocation];
  NSLog(@"Start updating location.");
  
 } else {
  NSLog(@"The location services is disabled.");
 }
}

- (void)logLocation:(CLLocation*)location
{
 CLLocationCoordinate2D coordinate = location.coordinate;
 NSLog(@"----------------------------------------------------");
 NSLog(@"latitude,logitude : %f, %f", coordinate.latitude, coordinate.longitude);
 NSLog(@"altitude          : %f", location.altitude);
 NSLog(@"cource            : %f", location.course);
 NSLog(@"horizontalAccuracy: %f", location.horizontalAccuracy);
 NSLog(@"verticalAccuracy  : %f", location.verticalAccuracy);
 NSLog(@"speed             : %f", location.speed);
 NSLog(@"timestamp         : %@", location.timestamp);
}

- (void)locationManager:(CLLocationManager *)manager
 didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {

 [self logLocation:newLocation];
}

- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error{
 NSLog(@"Error: %@", error);
}



結果


シミュレータ (WiFi)

初回に確認ダイアログが表示される。

1回目
Start updating location.
----------------------------------------------------
latitude,logitude : 35.534066, 139.720422
altitude          : 0.000000
cource            : -1.000000
horizontalAccuracy: 150.000000
verticalAccuracy  : -1.000000
speed             : -1.000000
timestamp         : 2010-10-19 21:44:07 GMT
----------------------------------------------------
latitude,logitude : 35.533892, 139.720450
altitude          : 0.000000
cource            : -1.000000
horizontalAccuracy: 185.000000
verticalAccuracy  : -1.000000
speed             : 0.000000
timestamp         : 2010-10-19 21:44:38 GMT
----------------------------------------------------
latitude,logitude : 35.533892, 139.720450
altitude          : 0.000000
cource            : -1.000000
horizontalAccuracy: 185.000000
verticalAccuracy  : -1.000000
speed             : 0.000000
timestamp         : 2010-10-19 21:44:53 GMT

2回目
Start updating location.
----------------------------------------------------
latitude,logitude : 35.533892, 139.720450
altitude          : 0.000000
cource            : -1.000000
horizontalAccuracy: 185.000000
verticalAccuracy  : -1.000000
speed             : 0.000000
timestamp         : 2010-10-19 21:45:13 GMT
----------------------------------------------------
latitude,logitude : 35.533892, 139.720450
altitude          : 0.000000
cource            : -1.000000
horizontalAccuracy: 185.000000
verticalAccuracy  : -1.000000
speed             : 0.000000
timestamp         : 2010-10-19 21:45:23 GMT

実機 - iPhone 3GS (iOS4.0) ※屋内

初回にダイアログが表示される。

また実行中は位置情報使用中のインジゲータが表示される。

1回目 6:47起動
Start updating location.
----------------------------------------------------
latitude,logitude : 35.530754, 139.718766
altitude          : 0.000000
cource            : -1.000000
horizontalAccuracy: 620.000000
verticalAccuracy  : -1.000000
speed             : -1.000000
timestamp         : 2010-10-20 06:46:50 +0900
----------------------------------------------------
latitude,logitude : 35.530754, 139.718766
altitude          : 0.000000
cource            : -1.000000
horizontalAccuracy: 620.000000
verticalAccuracy  : -1.000000
speed             : -1.000000
timestamp         : 2010-10-20 06:46:50 +0900
----------------------------------------------------
latitude,logitude : 35.533505, 139.720757
altitude          : 0.000000
cource            : -1.000000
horizontalAccuracy: 80.000000
verticalAccuracy  : -1.000000
speed             : -1.000000
timestamp         : 2010-10-20 06:46:52 +0900
  :

2回目 6:47起動
Start updating location.
----------------------------------------------------
latitude,logitude : 35.533505, 139.720757
altitude          : 0.000000
cource            : -1.000000
horizontalAccuracy: 80.000000
verticalAccuracy  : -1.000000
speed             : -1.000000
timestamp         : 2010-10-20 06:47:47 +0900
  :

3回目 6:53起動(5分後)
Start updating location.
----------------------------------------------------
latitude,logitude : 35.533505, 139.720757
altitude          : 0.000000
cource            : -1.000000
horizontalAccuracy: 80.000000
verticalAccuracy  : -1.000000
speed             : -1.000000
timestamp         : 2010-10-20 06:48:22 +0900
----------------------------------------------------
latitude,logitude : 35.533505, 139.720757
altitude          : 0.000000
cource            : -1.000000
horizontalAccuracy: 80.000000
verticalAccuracy  : -1.000000
speed             : -1.000000
timestamp         : 2010-10-20 06:54:22 +0900
----------------------------------------------------
latitude,logitude : 35.533505, 139.720757
altitude          : 0.000000
cource            : -1.000000
horizontalAccuracy: 80.000000
verticalAccuracy  : -1.000000
speed             : -1.000000
timestamp         : 2010-10-20 06:55:25 +0900
----------------------------------------------------
latitude,logitude : 35.533658, 139.720645
altitude          : 0.000000
cource            : -1.000000
horizontalAccuracy: 250.000000
verticalAccuracy  : -1.000000
speed             : -1.000000
timestamp         : 2010-10-20 06:56:27 +0900


実機 - iPad (iOS 3.2/WiFi)

1回目(6:52起動)
Start updating location.
----------------------------------------------------
latitude,logitude : 35.533658, 139.720645
altitude          : 0.000000
cource            : -1.000000
horizontalAccuracy: 250.000000
verticalAccuracy  : -1.000000
speed             : -1.000000
timestamp         : 2010-10-20 06:52:15 +0900
----------------------------------------------------
latitude,logitude : 35.533658, 139.720645
altitude          : 0.000000
cource            : -1.000000
horizontalAccuracy: 250.000000
verticalAccuracy  : -1.000000
speed             : -1.000000
timestamp         : 2010-10-20 06:53:17 +0900

2回目(6:53起動)
Start updating location.
----------------------------------------------------
latitude,logitude : 35.533658, 139.720645
altitude          : 0.000000
cource            : -1.000000
horizontalAccuracy: 250.000000
verticalAccuracy  : -1.000000
speed             : -1.000000
timestamp         : 2010-10-20 06:53:52 +0900


まとめ

  • 実機(iPhone3GS)では1分毎に CLLocationManagerDelegate のメソッドが呼び出される(位置情報が更新される)
  • 実機(iPhone3GS)では位置情報更新の度に精度 が上がっていった(CLLocation.horizontalAccuracyが低くなる)。ただし悪くなるケースも見られた。
  • 5分程度してから位置情報へアクセスすると前回キャッシュされた位置情報が最初に返された(CLLocation.timestampで確認可能)。
  • シミュレータでも WiFi経由で現在位置の取得が可能。確認ダイアログも表示される(昔はそうではなかったらしい)
  • locationServicesEnabledプロパティはiOS4.0から Deprecated。同名のクラスメソッドを使う。
  • 検証環境での精度は
    シミュレータ [150〜185m]
    iPhone3GS [80〜250m]
    iPad-Wifi [250m] ※固定?
  • CLLocation.verticalAccuracyはiOSの場合常に-1(リファレンスに書いてある)。

ソースコード


GitHub からどうぞ。
xcatsan's iOS-Sample-Code at 2010-10-09 - GitHub


参考情報


CLLocationManager Class Reference

リファレンス


LocateMe

iOS Reference Library のサンプル


【コラム】実践! iPhoneアプリ開発 (15) ロギングアプリの作り方 (1) - Core Locationで現在地を取得する | エンタープライズ | マイコミジャーナル
【コラム】実践! iPhoneアプリ開発 (16) ロギングアプリの作り方 (2) - Map Kitで地図を表示する | エンタープライズ | マイコミジャーナル
【コラム】実践! iPhoneアプリ開発 (17) ロギングアプリの作り方 (3) - アノテーションビューをカスタマイズする | エンタープライズ | マイコミジャーナル

木下氏の連載。わかりやすくとても参考になった。


GPSを利用する方法 - プログラミングノート

ソースコードを参考に。


Core Locationのaccuracyについて - The iPhone Development Playground

精度の話。タイムスタンプチェックや精度を上げる為には数回位置更新を待つ、など。昨年の記事なので iOS 3ベース。

- - - - -
今更ながら初めて CoreLocation を試してみた。なんか楽しい-。
次回はマップにピンを立てる。

0 件のコメント:

コメントを投稿