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,真是太恐怖了。不过室内定位的精度就一般了,现在很多项目都是受限于室内定位精度不准而发展缓慢。
iOS 关于定位你该注意的那些事的更多相关文章
- iOS地图 -- 定位初使用
iOS的定位服务用到的框架是#import <CoreLocation/CoreLocation.h> 定位中用到的类是CLLocationManager 一.iOS8.0之前的定位 向用 ...
- iOS后台定位实现
iOS后台定位实现 (2013-01-24 16:43:12) 工作中碰到一个定位的应用场景:app需要在后台运行,实时上传用户地理位置. 苹果对iOS的规范性在提升了app的品质的同时也 ...
- iOS 后台定位被拒注意事项
iOS 后台定位被拒的原因很简单就是没有达到苹果对后台定位的要求. 本地要求: 1.在plist文件中添加字段 "Privacy - Location Always Usage Descri ...
- iOS开发笔记15:地图坐标转换那些事、block引用循环/weak–strong dance、UICollectionviewLayout及瀑布流、图层混合
1.地图坐标转换那些事 (1)投影坐标系与地理坐标系 地理坐标系使用三维球面来定义地球上的位置,单位即经纬度.但经纬度无法精确测量距离戒面积,也难以在平面地图戒计算机屏幕上显示数据.通过投影的方式可以 ...
- 聊聊iOS中网络编程长连接的那些事
1.长连接在iOS开发中的应用 常见的短连接应用场景:一般的App的网络请求都是基于Http1.0进行的,使用的是NSURLConnection.NSURLSession或者是AFNetworking ...
- iOS 地图定位及大头针的基本使用
地图 Part1 - 定位及大头针的基本使用 一.MapKit 作用 : 用于地图展示 如大头针,路线,覆盖层展示等(着重界面展示) 使用步骤 导入头文件 #import <MapKit/Map ...
- 简易的IOS位置定位服务
有时一些小的需求,其实只是需要得知当前IOS APP使用的地点,有些只是想精确到城市级别,并不需要任何地图. 有了以下的简易实现: @interface MainViewController ()&l ...
- ios 客户端定位的3种方法
1.客户端通过IP地址定位 http://int.dpool.sina.com.cn/iplookup/iplookup.php 输出:城市 1 -1 -1 中国 广东 深圳 2.客户端获取经纬度,调 ...
- iOS后台定位,实时向服务器发送最新位置
第一步,开启后台模式,选中定位,选择project --> capabilities-->Backgorund Modes --> Location updates 如图: Past ...
随机推荐
- “幸福企业”定义-参观“MES项目”有感
作为公司的员工,总是想在一个自己满意的企业里面发展.作为企业主,虽不能天天将“回报社会”挂在嘴上,但凡是有抱负的,还是希望自己的部下“以厂为家的”.然而劳资双方的矛盾总是让双方感觉互有亏欠.这种不信任 ...
- php 与redis 结合 使用predis
分为2步骤 1.下载predis 2.使用predis,让php与redis进行通信 <?php require('autoload.php'); $redis = new Predis\Cli ...
- BOM基础(二)
跟DOM一样,BOM其实也是由很多的API组成. 不过对于BOM来说,最痛苦的不是不记得API,而是明明记得这个这个API,却没有考虑到它的兼容性. 之前的文章中讲到了offset系列的属性,他的宽高 ...
- JavaScript中冒泡排序
在我大学的时候,就已经接触到过很多的排序方式,只是那时候听得还很懵懂,大概知道这么个东西,也对冒泡排序有点印象,但真要我写,我是写不出来的.最近,在回顾js基础的时候,又接触到了冒泡排序.于是,就把冒 ...
- Visual Studio 2017 通过SSH 调试Linux 上.NET Core
Visual Studio 2017 通过SSH 调试Linux 上.NET Core 应用程序. 本文环境 开发环境:Win10 x64 Visual Studio 2017 部署环境:Ubuntu ...
- 在LaTeX 与 LyX 中设置“Contents”为“目录”
在 LaTeX 中,目录一般被显示为英文"Contents",因此需要设置成"目录". 通常在 Preamble 按照如下方式设置: \renewcommand ...
- angularJS之ng-repeat
<p>使用 ng-repeat 来循环数组</p> <ul> <li data-ng-repeat="x in numArray&quo ...
- 列表总结Canvas和SVG的区别
参考链接: 菜鸟教程 HTML5 内联SVG 经典面试题(讨论canvas与svg的区别) Canvas | SVG ---|--- 通过 JavaScript 来绘制 2D 图形|是一种使用 XML ...
- PHP数据访问增删查(20161028)
注:预定义数组 $_POST[ ]; <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" &qu ...
- C++ Primer 5 CH2 变量和基本类型
C++ 是一种静态数据类型语言,它的类型检查发生在编译时.因此,编译器需要知道每一个变量对应的数据类型. 2.1 基本内置类型 算术类型 C++ 标准并没有规定带符号类型应如何表示,但是约定了在表示范 ...