最简单的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;
    
}
原文地址:https://www.cnblogs.com/E7868A/p/2796785.html