由於我國國情,在MapView上做標記添加Annotation時總會與實際GPS座標有幾百米的偏差。同樣,在根據GPS點,做反向解析地址時也是位移過的地址。
MapView有一個屬性是showsUserLocation,當置為YES時,地圖上會顯示一個藍色的點,標誌使用者的當前位置。這個藍色的點的位置與使用者的實際位置是相符的。顯然是,MapView把使用者的實際座標做了位移,從而在位移的地圖上顯示出正確的位置。如果能得到這個藍色點的座標,再與使用者實際GPS座標相比較,就能得到地圖在當前位置的位移值。
MapView有一個MKUserLocation類型的屬性userLocation。這個屬性裡又有一個屬性是location,這個location就是地圖上藍色點位移後的座標。把這個點的座標與使用者實際座標相比較,就能得到當前位置的位移值。
MKUserLocation還支援KVO,我們只用添加一個"location"的Observer,就能持續得到藍色點的座標,這樣就能隨著使用者座標的改變,隨時更新位移值。
主要代碼如下:
// 首先,在viewDidLoad中添加以下兩行// 顯示我的位置點_mapView.showsUserLocation = YES;// 添加"location"的Observer[_mapView.userLocation addObserver:self forKeyPath:@"location" options:(NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld) context:nil];// 然後,使用 CLLocationManager 獲得使用者實際座標更新// 這裡就省略了
實現Observer
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{ // 這裡就是位移後的座標,與使用者實際座標相減,就是當前位置的座標位移值 CLLocation *fakeloc = _mapView.userLocation.location; }