Pages

Monday, January 3, 2011

Finding your way with Core Location

當使用 iPhone,其中一個強大功能是可以知道現在位置在哪裡。這是透過 Core Location Framework 使用來取得資訊。有三種方式可以計算出地理位置:

第一種、GPS,GPS 讀取來自多個衛星的微電波訊號來辨別現在位置。這是最精準的計算方式,但是在第一代 iPhone 沒有此功能。

第二種、Cell tower triangulation 透過多個電信塔台的位置來找出手機範圍在哪個位置。當 Cell tower 塔台分布密度高的都市裡面,計算位置就可以很精確,但是在遠離郊外地方,距離塔台相隔都遠,計算出來的值比較差了。

第三種、WPS 這是 iPhone 的 Wi-Fi 連線網路,透過 IP address 參考大型資料庫由知名 service providers 資訊來猜出當下的位置。WPS 是不精確而且可以計算出來誤差會差的非常遠。

不論使用哪一種方式使用,都相當耗費 iPhone 的電力,所以要記得使用 Core Location,當有必要要抓地理位置時候再啓動。而且使用 Core Location 可以給與抓取準確度的選項,這也要給與適當的準確層度,不然還是會耗電力。

抓取 Location 資訊採用的技術方式在 Core Location 是隱藏起來的,所以我們不是告知 Core Location 要使用 GPS, triangulation 或者 WPS。我們紙告知要抓的準確度要多少,而它會寄算出最適合的需求來截取地理資訊。

透過 Where Am I 這隻簡單的 iPhone application 我們可以抓出現在當下地理的資訊,我們透過關鍵的 WhereAmIViewController.m 來解析一下。

設定想要的準確度。記得使用越精準的地理位置會越耗電力,而 Core Location 提供了可以查詢最佳精準、最近 10 碼、100 碼、1 公里和 3 公里。我們將這個值設定給 Location Manager 的 desiredAccuracy。


設定當距離改變多少告知要 delegate 。而告知移動了多少碼時候要 delegeate 這個值設定在 Locaiton Manager 的 distanceFilter。

啓動和停用。當開始使用抓取資料透過 Location Manager 的 starUpdatingLocation,當不用地理座標時候,呼叫 Location Manager 的 stopUpdatingLocation。

當開始取得地理座標,會傳進來 locationManager 和上一個位置以及現在位置,如此一來我們可以做資料取得和一些距離計算等功能。當取得 CLLocation 資料後可以使用 NSLog 可以紀錄這樣內容:<+25.05209773, +121.53646565> +/- 79.00m (speed -1.00 mps / course -1.00) @ 1/9/11 5:56:19 PM Taipei Standard Time


當取不到地理位置或者使用者從彈出畫面按下拒絕提供地理資訊,會進入此 method。這邊即可程式上規劃要如何等等。


抓地理位置看起來技術上頗複雜,不過 Apple 提供了簡單的 Interface 介面來蓋住這些複雜度,讓要加上任何關於地理的功能在 applicaitons 上變簡單,可以告知使用者在哪里和辨識他們如何移動等等。

想瞭解更多可以參考
Beginning iPhone 3 Development 章節 Where Am I?,或者上 github 看 source code edwardinubuntu / WhereAmI

1 comment: