en

hi, it seems you are using microsoft internet explorer. it doesn't match web standard and causes problems browsing this site. please please please use mozilla firefox or google chrome instead. thank you!

zh

哦哦!您正在使用Internet Explorer 瀏覽器,它與我們的網頁標準並不相容,可能會導致畫面顯示不正常。
請改用 Mozilla Firefox 或者 Google Chrome 才能正常瀏覽本網站,謝謝!

12.16.2011

取得指南針 / 羅盤 / Magnetometer 數值的方法

 

目前大部份的 iOS 裝置都有支援 Magnetometer 指南針的功能,透過 Core Location 的Framework 就可以輕易取得 Magnetometer 當前的數值(角度),請看以下程式碼示範。

首先加入對應的 Framework,與標頭檔,如果不知道如何新增 Framework 的讀者們,可以參考 Xcode 4 新增 Framework 的方法一文。


#import <CoreLocation/CoreLocation.h>
之後在對應的 Class 中設定 CLLocationManagerDelegate 的代理方法,並增加一個 CLLocationManager 型態的指標 locationManager,如下(此範例是寫在 ViewCotroller 中)。

@interface MLViewController : UIViewController <CLLocationManagerDelegate> {

    CLLocationManager *locationManager;
}

接著 回到程式碼中對 locationManager 進行初始化的動作,並且設定其更新的角度度數。

//locationManager初始化(已使用ARC機制)
locationManager = [[CLLocationManager alloc] init];
locationManager.delegate = self;

//設定需要重新定位的角度差距
locationManager.headingFilter = 3;

[locationManager startUpdatingLocation];
[locationManager startUpdatingHeading];

完成上述設置之後,下面我們就可以開始使用 Framework 所提供的功能來取得指南針的角度讀數,每當指南針的角度變化大於上述所設定的角度差距,就會呼叫下列的內建函式。

//內建函式
- (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading {

    //判斷magneticHeading的精準度
    if (newHeading.headingAccuracy > 0) {

        //取得角度值-磁北(0-北, 90-東, 180-南, 270-西)
        CLLocationDirection theHeading = newHeading.magneticHeading;

        //取得角度值-正北(0-北, 90-東, 180-南, 270-西)
        //CLLocationDirection theHeading = newHeading.trueHeading;

        NSLog(@"%f", theHeading);
    } else {
        NSLog(@"需校正");
    }
}

上述程式碼中 headingAccuracy 是一個 double 形態的唯讀值,它代表了真正磁北與 magneticHeading 之間的誤差值,正常運作下 headingAccuracy 皆為正值,如果出現負數則代表 magneticHeading 要做 8 字形的校正。


若在使用上有需要系統做校正上的提示,可以使用下列內建函式,並回傳一個 YES 的布林值。

//內建函式
- (BOOL)locationManagerShouldDisplayHeadingCalibration:(CLLocationManager *)manager {
    return YES;
}

ps:有關 Core Location 的其它應用,可以參考使用 Core Location 做簡易的定位ㄧ文。






沒有留言:

張貼留言