サーバー構築不要!スマートフォンアプリ向けの新クラウド

トップ >ドキュメント >位置情報検索(Obj-C):基本的な使い方

位置情報検索(Obj-C)

基本的な使い方

概要

このページでは、アプリから位置情報検索を行う方法について解説します。

位置情報について

NCMBGeoPointは、位置情報を扱うためのクラスです。
プロパティは以下の通り緯度・経度となっております。
緯度は-90.0~90.0、経度は-180.0~180.0まで設定できます。

// 緯度 ; -90.0~90.0
@property (nonatomic, readwrite) double latitude;

// 経度 ; -180.0-180.0
@property (nonatomic, readwrite) double longitude;

NCMBGeoPointオブジェクトの作成

geoPointメソッドを使って位置情報のオブジェクトを生成できます。
このメソッドで生成されたオブジェクトの緯度・経度は0に設定されます。

例 緯度・経度 0で生成しています。

NCMBGeoPoint *geoPoint = [NCMBGeoPoint geoPoint];

緯度、経度を指定して生成する場合はgeoPointWithLatitude:longitude:メソッドを使います。

例 新宿駅の座標を指定して生成しています。

double latitude = 35.690921;
double longitude = 139.700258;
NCMBGeoPoint *geoPoint = [NCMBGeoPoint geoPointWithLatitude:latitude longitude:longitude];

iOS8で位置情報を利用する場合の準備

iOS8からは位置情報を取得する方法が2種類になったため、
位置情報の利用方法にあわせて以下の準備が必要です。

アプリが起動中の場合にのみ位置情報を利用する場合
  1. Info.plistにNSLocationWhenInUseUsageDescriptionという項目を追加し、位置情報を利用する用途を記載する
  2. 位置情報を取得する前にCLLocationManagerクラスのrequestWhenInUseAuthorizationメソッドを実行する
アプリが起動していなくても位置情報を利用する場合
  1. Info.plistにNSLocationAlwaysUsageDescriptionという項目を追加し、位置情報を利用する用途を記載する
  2. 位置情報を取得する前にCLLocationManagerクラスのrequestAlwaysAuthorizationメソッドを実行する

位置情報の利用をリクエストするrequestXXXXAuthorizationメソッドを、
geoPointForCurrentLocationInBackgroundメソッドの実行直前に記載することで、
位置情報が必要になってから、認証画面を表示することが可能になります。

Info.plistに記載した内容が認証画面の下側に表示されます。

現在地を取得する

GPS機能などでお客様の位置情報を元にオブジェクトの生成もできます。

※geoPointForCurrentLocationInBackground:を使用する場合には「CoreLocation.framework」の追加が必要になります。

例 現在地を非同期に取得する

    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0){
        CLLocationManager *locationManager = [[CLLocationManager alloc] init];
        [locationManager requestWhenInUseAuthorization];
    }

    [NCMBGeoPoint geoPointForCurrentLocationInBackground:^(NCMBGeoPoint *geoPoint, NSError *error) {
        if (error){
            //位置情報取得に失敗したエラー処理
        } else {
            //位置情報の取得に成功した場合の処理
        }
    }];

CLLocationを元にオブジェクトの生成もできます。
※CLLocationを使用する場合には「CoreLocation.framework」の追加が必要になります。

例 CoreLocationのstartUpdatingLocation実行後、CLLocationの緯度・経度を元にオブジェクトの生成を行っています。

-(void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation{    
    NCMBGeoPoint *geoPoint = [NCMBGeoPoint geoPointWithLocation:newLocation];
    [locationManeger stopUpdatingLocation];
}

位置情報をデータストアに保存する

位置情報をデータストアに保存するには、setObjectでNCMBGeoPointクラスのオブジェクトをセットし、save系メソッドで保存します。

例1 saveInBackgroundWithBlock:を使用し、新宿駅の座標をデータストアに保存しています。

- (IBAction)SaveExample1:(id)sender {
    NSString *areaName = @"新宿駅";

    //geoPointの生成
    double latitude = 35.690921;
    double longitude = 139.700258;
    NCMBGeoPoint *geoPoint = [NCMBGeoPoint geoPointWithLatitude:latitude longitude:longitude];

    //geoPointの保存
    NCMBObject *obj = [NCMBObject objectWithClassName:@"Places"];
    [obj setObject:geoPoint forKey:@"point"];
    [obj setObject:areaName forKey:@"areaName"];
    [obj saveInBackgroundWithBlock:^(NSError *error){
       if (!error) {
           //成功後の処理
       }
       else {
           //エラー処理
       }       
    }];

}

すでに生成されているgeoPointの位置情報を変更して保存する事もできます。

例2 saveInBackgroundWithBlock:を使用し、高田馬場駅の座標をデータストアに保存しています。

- (IBAction)SaveExample2:(id)sender {
    NSString *areaName = @"高田馬場駅";

    //geoPointの生成
    NCMBGeoPoint *geoPoint = [NCMBGeoPoint geoPoint];
    geoPoint.latitude = 35.712285;
    geoPoint.longitude = 139.703782;

    //geoPointの保存
    NCMBObject *obj = [NCMBObject objectWithClassName:@"Places"];
    [obj setObject:geoPoint forKey:@"point"];
    [obj setObject:areaName forKey:@"areaName"];
    [obj saveInBackgroundWithBlock:^(NSError *error){
        if (!error) {
            //成功後の処理
        }
        else {
            //エラー処理
        }
    }];

}

位置情報の検索

位置情報の検索を行う場合は、距離か範囲を指定して検索を行います。

■検索距離
検索距離を指定する場合は、検索開始地点の位置情報とそこからの検索距離を指定します。
指定する場合は、キロメートル、マイル、ラジアンで指定可能です。
また、検索距離を指定せずに検索をかける事もできます。その場合は検索開始地点から近い順に、
保存されている位置情報のオブジェクトが取得されます。

例1 保存した新宿駅の位置情報を検索開始地点に指定し、距離を指定していません。

- (IBAction)QueryEaxmple1:(id)sender {
    NSString *areaName = @"新宿駅";
    NSError *error = nil;

    //データストアにある新宿駅の位置情報を取得
    NCMBGeoPoint *geoPoint;
    NCMBQuery *query = [NCMBQuery queryWithClassName:@"Places"];
    [query whereKey:@"areaName" equalTo:areaName];
    NSArray *array = [query findObjects:&error];
    if (!error) {
        geoPoint = [[array lastObject] objectForKey:@"point"];
    }
    else{
        //エラー処理
    }

    //設定した座標から近い順に検索
    NCMBQuery *geoQuery = [NCMBQuery queryWithClassName:@"Places"];
    [geoQuery whereKey:@"point" nearGeoPoint:geoPoint];
    [geoQuery findObjectsInBackgroundWithBlock:^(NSArray *objects,NSError *error){
        if (!error) {
            //成功後の処理
        }
        else{
            //エラー処理
        }
    }];
}

例2 直接新宿駅の位置情報を検索開始地点に指定し、距離(5キロメートル)を指定しています。

- (IBAction)QueryExample2:(id)sender {

    //検索開始地点に新宿駅の座標を設定
    double latitude = 35.690921;
    double longitude = 139.700258;
    NCMBGeoPoint *geoPoint = [NCMBGeoPoint geoPointWithLatitude:latitude longitude:longitude];

    //設定した座標から5キロメートル内を検索
    NCMBQuery *geoQuery = [NCMBQuery queryWithClassName:@"Places"];
    [geoQuery whereKey:@"point" nearGeoPoint:geoPoint withinKilometers:5.0];
    [geoQuery findObjectsInBackgroundWithBlock:^(NSArray *objects,NSError *error){
        if (!error) {
            //成功後の処理
        }
        else{
            //エラー処理
        }
    }];

}

■検索範囲
検索範囲で指定する場合は、検索範囲となる矩形の左下(南西)と右上(北東)の位置情報を設定し、
その範囲内で保存してあるオブジェクトの検索ができます。

例 南西に新宿、北東に池袋を指定し、その範囲内の検索を行っています。
上記にある「位置情報の保存」で新宿と高田馬場を保存している場合は、それぞれのオブジェクトが検索されます。

- (IBAction)GeoBoxExample:(id)sender {

    //南西位置情報
    double swLatitude = 35.690921;
    double swLongitude = 139.700258;
    NCMBGeoPoint * swGeoPoint = [NCMBGeoPoint geoPointWithLatitude:swLatitude longitude:swLongitude];

    //北東位置情報
    double neLatitude = 35.728926;
    double neLongitude = 139.71038;
    NCMBGeoPoint * neGeoPoint = [NCMBGeoPoint geoPointWithLatitude:neLatitude longitude:neLongitude];

    //範囲検索
    NCMBQuery *query = [NCMBQuery queryWithClassName:@"Places"];
    [query whereKey:@"point" withinGeoBoxFromSouthwest:swGeoPoint toNortheast:neGeoPoint];

    [query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error){
        if (!error) {
            //成功後の処理
        }
        else{
            //エラー処理
        }
    }];

}

お探しの内容が見つからなかった場合はユーザーコミュニティ もご活用ください。(回答保証はいたしかねます)
なお、 Expertプラン以上のお客様はテクニカルサポートにてご質問を承らせて頂きます。

推奨画面サイズ1024×768px以上

ページの先頭へ