最简单的iOS MapView标记点纠偏的方法
由于我国国情,在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; }