koogawa blog

iOS、Android、foursquareに関する話題

【Tips】iOSで標高を測定する

追記:Swift版はこちら

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


CoreLocationを使って、現在地の標高*1を測定する方法をメモしておきます。

実装方法

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

f:id:koogawa:20131122152458p:plain

ヘッダをインポートします。

#import <CoreLocation/CoreLocation.h>

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

@interface ViewController : UIViewController <CLLocationManagerDelegate>
@end

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

if ([CLLocationManager locationServicesEnabled])
{
    // インスタンスを生成
    _locationManager = [[CLLocationManager alloc] init];

    // デリゲートを設定
    _locationManager.delegate = self;

    // 位置情報の取得開始
    [_locationManager startUpdatingLocation];
}

この状態でiPhoneの位置情報が更新されると、次のメソッドが呼ばれます。

// 位置情報が更新されるたびに呼ばれる
- (void)locationManager:(CLLocationManager *)manager
    didUpdateToLocation:(CLLocation *)newLocation
           fromLocation:(CLLocation *)oldLocation
{
    self.textField.text = [NSString stringWithFormat:@"%.2f m", newLocation.altitude];
}

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

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

if ([CLLocationManager locationServicesEnabled]) {
    [_locationManager stopUpdatingLocation];
}

サンプルコード

注意点

  • 標高は、現在の高度からではなく位置情報から測定されます
    • つまり、東京タワーの展望台にいても地上にいても、取得できる標高は一緒になります
  • ユーザが位置情報の取得を許可していない場合は測定できません

応用できそうなアプリ

  • 標高測定アプリ(すでにいろんなアプリがリリースされている)
  • 標高を競い合ったり、高さによって景品が出るゲーム

参考リンク

*1:海面からの高さ