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

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

位置情報検索(Swift)

基本的な使い方

概要

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

位置情報について

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

// 緯度 ; -90.0~90.0
public var latitude : Double

// 経度 ; -180.0-180.0
public var longitude : Double

NCMBGeoPointオブジェクトの作成

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

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

var geoPoint : NCMBGeoPoint? = NCMBGeoPoint.init()

緯度、経度を指定して生成する場合は直接に設定します。

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

var geoPoint : NCMBGeoPoint? = NCMBGeoPoint.init()
geoPoint?.latitude = Double(35.690921)
geoPoint?.longitude = Double(139.700258)

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( CLLocationManager.authorizationStatus() == .authorizedWhenInUse ||
    CLLocationManager.authorizationStatus() ==  .authorizedAlways){
    let latitude: Double = locManager.location!.coordinate.latitude
    let longitude: Double = locManager.location!.coordinate.longitude

    var geoPoint:NCMBGeoPoint = NCMBGeoPoint.init(latitude: latitude, longitude: longitude)
}

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

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

 func locationManager(_ manager:CLLocationManager, didUpdateLocations locations: [CLLocation]) {
    let locValue:CLLocationCoordinate2D = (manager.location?.coordinate)!
    print("locations = \(locValue.latitude) \(locValue.longitude)")

    let latitude: Double = locValue.latitude
    let longitude: Double = locValue.longitude

    var geoPoint:NCMBGeoPoint = NCMBGeoPoint.init(latitude: latitude, longitude: longitude)
    manager.stopUpdatingLocation()
}

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

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

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

func saveExample1() {
    let areaName: String = "新宿駅"
    //geoPointの生成
    let latitude: Double = 35.690921
    let longitude: Double = 139.700258
    let geoPoint:NCMBGeoPoint = NCMBGeoPoint.init(latitude: latitude, longitude: longitude)
    //geoPointの保存
    let object : NCMBObject = NCMBObject(className: "Places")
    object["point"] = geoPoint
    object["areaName"] = areaName
    object.saveInBackground(callback: { result in
        switch result {
        case .success:
            //成功後の処理
            print("保存に成功しました")
        case let .failure(error):
            //エラー処理
            print("保存に失敗しました: \(error)")
        }
    })
}

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

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

        var areaName : String = "高田馬場駅"

        //geoPointの生成
        var geoPoint : NCMBGeoPoint? = NCMBGeoPoint.init()
        geoPoint?.latitude = 35.712285
        geoPoint?.longitude = 139.703782

        //geoPointの保存
        let object : NCMBObject = NCMBObject(className: "Places")
        object["point"] = geoPoint
        object["areaName"] = areaName
        object.saveInBackground(callback: { result in
            switch result {
            case .success:
                //成功後の処理
                print("保存に成功しました")
            case let .failure(error):
                //エラー処理
                print("保存に失敗しました: \(error)")
            }
        })

位置情報の検索

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

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

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

func queryExample1() {

    let areaName: String = "新宿駅"

    // データストアにある新宿駅の位置情報を取得
    var query: NCMBQuery<NCMBObject> = NCMBQuery.getQuery(className: "Places")
    query.where(field: "areaName", equalTo: areaName)
    let result: NCMBResult<[NCMBObject]> = query.find()
    switch result {
        case let .success(array):
            guard let place: NCMBObject = array.first else {
                print("areaNameが該当するデータが存在しません")
                return;  // 後続処理を実施させないために記載
            }
            guard let geoPoint: NCMBGeoPoint = place["point"]  else {
                print("対象データにpointフィールドが存在しません")
                return; // 後続処理を実施させないために記載
            }

            //設定した座標から近い順に検索
            var geoQuery : NCMBQuery<NCMBObject> = 
NCMBQuery.getQuery(className: "Places")
            geoQuery.where(field: "point", nearGeoPoint: geoPoint)
            geoQuery.findInBackground(callback: { result in
                switch result {
                    case let .success(array):
                        //成功後の処理
                    case let .failure(error):
                        //エラー処理
                }
            })
        case let .failure(error):
            //エラー処理
            return;
    }

}

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

func queryExample2() {

    //検索開始地点に新宿駅の座標を設定
    let latitude: Double = 35.690921
    let longitude: Double = 139.700258
    let geoPoint:NCMBGeoPoint = NCMBGeoPoint.init(latitude: latitude, 
longitude: longitude)

    //設定した座標から5キロメートル内を検索
    var geoQuery : NCMBQuery<NCMBObject> = NCMBQuery.getQuery(className: 
"Places")
    geoQuery.where(field: "point", nearGeoPoint: geoPoint, 
withinKilometers: 5.0)
    geoQuery.findInBackground(callback: { result in
        switch result {
            case let .success(array):
                //成功後の処理
            case let .failure(error):
                //エラー処理
        }
    })

}

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

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

func geoBoxExample() {

    //南西位置情報
    let swLatitude: Double = 35.690921
    let swLongitude: Double = 139.700258
    let swGeoPoint:NCMBGeoPoint = NCMBGeoPoint.init(latitude: swLatitude, 
longitude: swLongitude)

    //北東位置情報
    let neLatitude: Double = 35.728926
    let neLongitude: Double = 139.71038
    let neGeoPoint:NCMBGeoPoint = NCMBGeoPoint.init(latitude: neLatitude, 
longitude: neLongitude)

    //範囲検索
    var query : NCMBQuery<NCMBObject> = NCMBQuery.getQuery(className: 
"Places")
    query.where(field: "point", withinGeoBoxFromSouthwest: swGeoPoint, 
toNortheast: neGeoPoint)
    query.findInBackground(callback: { result in
        switch result {
            case let .success(array):
                //成功後の処理
            case let .failure(error):
                //エラー処理
        }
    })

}

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

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

ページの先頭へ