CoreLocation
CoreLocationManager を使う。使い方はリファレンスに書いてある。
CLLocationManager Class Reference より抜粋
To configure and use aCLLocationManager
object to deliver events:
Always check to see whether the desired services are available before starting any services and abandon the operation if they are not. Create an instance of theCLLocationManager
class. Assign a custom object to thedelegate
property. This object must conform to theCLLocationManagerDelegate
protocol. Configure any additional properties relevant to the desired service. 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 を試してみた。なんか楽しい-。
次回はマップにピンを立てる。
Responses
Leave a Response