読者です 読者をやめる 読者になる 読者になる

koogawa log

iOS、Android、foursquareに関する話題

【Tips】iOSで標高を取得する方法(Swift 3.0対応)

数年前に書いたこちらの記事が古くなってきたので、Swift編 として書き直しました。

blog.koogawa.com


CoreLocationを使って、位置情報から標高を取得する方法をメモしておきます。

実行環境

実装方法

準備

まずは「CoreLocation.framework」を追加します。

f:id:koogawa:20131122152458p:plain

次に Info.plist の NSLocationWhenInUseUsageDescription位置情報を使用する目的 を記載します。この内容はユーザに位置情報の使用を許可する際に表示されます。

f:id:koogawa:20160326145627p:plain

実装

CoreLocation をインポートします。

import CoreLocation

CLLocationManagerDelegate プロトコルを宣言します。

class ViewController: UIViewController, CLLocationManagerDelegate {

ユーザが位置情報の使用を許可しているか確認します。許可状況は didChangeAuthorizationStatus デリゲートで確認できます。初回は NotDetermined ステータスが返るので、requestWhenInUseAuthorization() メソッドでユーザに許可を求めます。

func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
    switch status {
    case .notDetermined:
        locationManager.requestWhenInUseAuthorization()
    case .restricted, .denied:
        break
    case .authorizedAlways, .authorizedWhenInUse:
        break
    }
}

現在地の取得を開始します。

if CLLocationManager.locationServicesEnabled() {
    locationManager = CLLocationManager()
    locationManager.delegate = self
    locationManager.startUpdatingLocation()
}

この状態で iPhone の位置情報が更新されると、次のデリゲートが呼ばれます。

// 位置情報が更新されるたびに呼ばれる
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
    guard let newLocation = locations.last else {
        return
    }
    self.textField.text = "".appendingFormat("%.2f m", newLocation.altitude)
}

newLocationaltitude プロパティで標高が取得できます。単位は メートル です。

現在地情報の取得を停止するには次のメソッドを実行します。

if CLLocationManager.locationServicesEnabled() {
    locationManager.stopUpdatingLocation()
}

サンプルコード

注意点

  • 標高は、現在の高度からではなく地図データから測定されます
  • つまり、東京タワーの展望台にいても地上にいても、取得できる標高は一緒になります

応用できそうなアプリ

  • 現在地の標高測定アプリ(すでにいろんなアプリがリリースされている)
  • 標高を競い合ったり、高さによって景品が出るゲーム
  • 気圧計と組み合わせて正確な高度を計測するアプリ