数年前に書いたこちらの記事が古くなってきたので、Swift編 として書き直しました。
CoreLocationを使って、位置情報から標高を取得する方法をメモしておきます。
実行環境
- Xcode 8.0
- Swift 3.0
実装方法
準備
まずは「CoreLocation.framework」を追加します。
次に Info.plist の NSLocationWhenInUseUsageDescription
に 位置情報を使用する目的 を記載します。この内容はユーザに位置情報の使用を許可する際に表示されます。
実装
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) }
newLocation
の altitude
プロパティで標高が取得できます。単位は メートル です。
現在地情報の取得を停止するには次のメソッドを実行します。
if CLLocationManager.locationServicesEnabled() {
locationManager.stopUpdatingLocation()
}
サンプルコード
注意点
- 標高は、現在の高度からではなく地図データから測定されます
- つまり、東京タワーの展望台にいても地上にいても、取得できる標高は一緒になります
応用できそうなアプリ
- 現在地の標高測定アプリ(すでにいろんなアプリがリリースされている)
- 標高を競い合ったり、高さによって景品が出るゲーム
- 気圧計と組み合わせて正確な高度を計測するアプリ