iOS 关于定位你该注意的那些事
其实,对于苹果用户而言,定位的方案只有一种,那就苹果自己的定位服务CoreLocation,因为苹果定位不允许接入第三方,百度地图和高德地图只是对苹果定位服务的二次封装,方便我们使用。
1.定位方式和定位原理
移动端定位就是三种:基站定位、WiFi定位、GPS定位。其实无论哪种定位,都是根据已知点位置信息来定位当前位置,原理都是一样的,只是精度、定位速度和耗电的差别。第一代iPhone只支持基站定位,从iPhone3G开始支持GPS定位,准确点说是AGPS,是GPS的加强版。
基站定位的特点就是速度快,误差太大了,在几百米到几公里之间。如果手机没连WiFi,初次定位返回的位置信息基本上都是基站定位。因为每个基站都有唯一标识符,苹果手机可以收集到附近所有基站和他们的标识符,把这些信息传给苹果云端服务器,返回给手机,所以这种定位方式需要网络。另外苹果针对这个做了优化,苹果手机提前将一些重要的基站信息存储在本地,以便支持无网定位,当然精度肯定不能保证了,完全看你所在的区域苹果是否存储基站了。虽然这个很方便,但是对我们这个项目就很坑了。我们的App需要室内的定位精度非常高,使用联通、电信卡的用户有些时候信号不好(是信号不好,不是没有),苹果自动执行无网定位,定位出来的坐标误差特别大, 能达到一两公里,而且我们还没有办法自己改变定位方式,这就比较坑了。
WiFi定位和基站定位原理是相同的,苹果手机可以获得周围路由器或者AP的Mac地址,然后去苹果的后台根据Mac地址查询路由器或者AP信息,通过计算得出当前位置,返回给用户,这说明了你的路由器或者AP的信息是存储在苹果后台的,他们每天都收集这些信息。这个最早是由Skyhook公司发明的,一开始苹果也用他们的服务,后来开始自己干了。WiFi定位速度很快,耗电介于基站定位和GPS之前,定位几十米,很靠谱。而且苹果做了优化,等你连了一个WiFi热点之后,苹果会把周围的热点信息都下载下来,至于下载热点的范围就看你周围热点密集度了,如果在市内也就下载一条街的,去热点不密集的地方,范围就会大一点。这有什么用?用处大了。只要用户打开WiFi,即使不连,也会提高定位精度,但是这有一个前提,就是用户的手机在附近上过网,手机里已经存储了周围WiFi的信息。
GPS定位是苹果最后支持的,定位精度肯定是最高了,我自己测试了一下应该在5米以内,但是耗时最长,耗电最厉害,需要联网,需要在室外。苹果是先利用WiFi定位或者基站定位得出一个大概位置信息,上传苹果服务器,苹果服务器获根据这个位置反馈给手机周围卫星的信息,手机在算出自己的位置。这是苹果的优化,如果不是这样,就需要手机自己去扫描分析周围卫星信息了,可能需要10几分钟,现在只要1-2秒了。
2.高德地图的多次定位
即使执行了停止定位的方法:
- (void)stopUpdatingLocation;
高德地图仍然会继续定位,一般会定位4次。他先给返回一个大致的位置,之后再进行校正,所以后面返回的坐标精度比前面的高。如果你只想让他定位一次,可以自己做一个标记,定位过了就不要走代理方法。
- (void)amapLocationManager:(AMapLocationManager *)manager didUpdateLocation:(CLLocation *)location {
if (_isFirst) {
return;
}
_isFirst = YES;
[self.locationManager stopUpdatingLocation];
}
如果需要很高的精度就不需要管它,只需执行停止定位的方法,让高德地图进行反复校验。这四次定位时间间隔很短,就是瞬间的事情。说瞬间有点不专业了,小伙伴们可以自己去测一下,我只能保证没超过1分钟。
[CLLocationManager locationServicesEnabled]
注意:这个方法是用来判断用户是否打开了导航,或者导航否可用,检测的是硬件信息。iOS调用系统功能之前,例如照相、录音等,都会检测一下硬件信息,是否这个功能可用。
3.地图定位的原理
地图定位其实就是三边测量定位,已知三个点的坐标,和未知点到这三个点的距离,求未知点的坐标。下面的图片引用自Trilateration三边测量定位算法。
已知(x1,y1),(x2,y2),(x3,y3),和三个圆的半径,求(x0,y0)。但实际情况是三个圆往往不能相交于一个点,因为三个圆的半径有误差,所以最后得到的是一个圆,而不是点,那个圆的半径其实就是精度。为了增加精度,也就是缩小圆的半径,我们需要更多的已知点和未知点到已知点的距离,来相互校验。天上的导航卫星就是已知点,GPS有21颗,备用三颗。
现在科技非常发达, GPS精度非常高,军用GPS精度都在1m以内,,据说是0.3m,真是太恐怖了。不过室内定位的精度就一般了,现在很多项目都是受限于室内定位精度不准而发展缓慢。