*

アプリで位置情報を取得する方法

   

NKJ56_kanagawamap500

GPS機能、気づくと結構使っていますよね。

ではアプリでそれを実現する場合はどうすればよいのか?

今回は位置情報を取得する方法をご紹介します。

CLLocationManagerを使うための準備

GPS機能を利用するにはCLLocationManagerを使います。

CLLocationManagerを使うにはCoreLocation.frameworkを追加しなくてはいけないため、まずはフレームワークを追加しておきましょう。

Xcodeのプロジェクト画面から[General]の[Linked Frameworks and Libraries]の[+]をクリック。

検索窓から[CoreLocation]と入力し、[CoreLocation.framework]を選択して追加します。

スクリーンショット 2014-01-14 6.38.00

そして、ヘッダファイルに以下のような記述をします。

#import <CoreLocation/CoreLocation.h>

これでCLLocationManagerが使えるようになります。

CLLocationManagerを使おう

それではCLLocationManagerを使っていきましょう。

ヘッダーファイルにCLLocationManagerDelegateを設定します。

ViewController.h

@interface ViewController : UIViewController
<CLLocationManagerDelegate>

メイン処理ではまず、viewDidLoadでGPS機能利用の判断を行います。
[CLLocationManager locationServicesEnabled]を使うことで、初回起動時にGPS機能を利用するかを問い合わせるダイアログが表示されます。

distanceFilterはGPSの精度になります。以下の例では1000m = 1km距離が移動する毎に位置情報を取得するようになっています。

ViewController.m

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    
    //GPSの利用可否判断
    if ([CLLocationManager locationServicesEnabled]) {
        self.locationManager = [[CLLocationManager alloc] init];
        self.locationManager.delegate = self;
        self.locationManager.distanceFilter = 1000.0;
        [self.locationManager startUpdatingLocation];
        NSLog(@"Start updating location.");
        
    } else {
        NSLog(@"The location services is disabled.");
    }
}

つづいて、locationManager: didUpdateLocations: のメソッドを記述します。
このメソッドは新しい位置情報を取得した際に呼び出されます。
新しい位置情報はlocationsの配列の最後に設定されているので、[locations lastObject]を使って取り出します。
なお、位置情報はCLLocationクラスになります。

あとは取り出したクラスから、緯度と経度の値を取得することで位置の特定ができます。


- (void)locationManager:(CLLocationManager *)manager
     didUpdateLocations:(NSArray *)locations
{
    
    
    CLLocation *newLocation = [locations lastObject];
    // 位置情報を取り出す
    //緯度
    latitude = newLocation.coordinate.latitude;
   //経度
    longitude = newLocation.coordinate.longitude;

    
    NSLog(@"%f",latitude);
    NSLog(@"%f",longitude);

}

位置情報が取得できない場合は、locationManager: didFailWithError:でエラー処理をしましょう。
下の処理ではUIAlertViewを使ってアラートを出しています。


- (void)locationManager:(CLLocationManager *)manager
       didFailWithError:(NSError *)error
{
    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"エラー" message:@"位置情報が取得できませんでした。" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles: nil];
    [alertView show];
    
}

いかがでしょうか。

GPSを使うと考えると結構難しそうなイメージがありますが、実際にやってみるとそこまで難しくはないことがわかります。

むしろ、この取得した緯度、経度をどう使うか考える方が難しいかもしれませんね。

 - objective-c, Xcode, アプリ