其实,对于苹果用户而言,定位的方案只有一种,那就苹果自己的定位服务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 关于定位你该注意的那些事的更多相关文章

  1. iOS地图 -- 定位初使用

    iOS的定位服务用到的框架是#import <CoreLocation/CoreLocation.h> 定位中用到的类是CLLocationManager 一.iOS8.0之前的定位 向用 ...

  2. iOS后台定位实现

    iOS后台定位实现 (2013-01-24 16:43:12)     工作中碰到一个定位的应用场景:app需要在后台运行,实时上传用户地理位置.   苹果对iOS的规范性在提升了app的品质的同时也 ...

  3. iOS 后台定位被拒注意事项

    iOS 后台定位被拒的原因很简单就是没有达到苹果对后台定位的要求. 本地要求: 1.在plist文件中添加字段 "Privacy - Location Always Usage Descri ...

  4. iOS开发笔记15:地图坐标转换那些事、block引用循环/weak–strong dance、UICollectionviewLayout及瀑布流、图层混合

    1.地图坐标转换那些事 (1)投影坐标系与地理坐标系 地理坐标系使用三维球面来定义地球上的位置,单位即经纬度.但经纬度无法精确测量距离戒面积,也难以在平面地图戒计算机屏幕上显示数据.通过投影的方式可以 ...

  5. 聊聊iOS中网络编程长连接的那些事

    1.长连接在iOS开发中的应用 常见的短连接应用场景:一般的App的网络请求都是基于Http1.0进行的,使用的是NSURLConnection.NSURLSession或者是AFNetworking ...

  6. iOS 地图定位及大头针的基本使用

    地图 Part1 - 定位及大头针的基本使用 一.MapKit 作用 : 用于地图展示 如大头针,路线,覆盖层展示等(着重界面展示) 使用步骤 导入头文件 #import <MapKit/Map ...

  7. 简易的IOS位置定位服务

    有时一些小的需求,其实只是需要得知当前IOS APP使用的地点,有些只是想精确到城市级别,并不需要任何地图. 有了以下的简易实现: @interface MainViewController ()&l ...

  8. ios 客户端定位的3种方法

    1.客户端通过IP地址定位 http://int.dpool.sina.com.cn/iplookup/iplookup.php 输出:城市 1 -1 -1 中国 广东 深圳 2.客户端获取经纬度,调 ...

  9. iOS后台定位,实时向服务器发送最新位置

    第一步,开启后台模式,选中定位,选择project --> capabilities-->Backgorund Modes --> Location updates 如图: Past ...

随机推荐

  1. maven项目发布不成功的问题

    MyEclipes   里面有好多的项目,有些项目是插件有些是组件,  就是有些项目是被依赖的项目,有些事项目的主体,被依赖的项目需要打成jar 包放在maven的中央仓库里面,也是所说的maven的 ...

  2. solr笔记之solr下载及安装

    在学习solr过程中,磕磕碰碰,遇到过许多问题,所以特写下笔记,以供需要的时候时常翻阅,也给能看到该博文的博友提供一个不全面的参考. 一.solr简介: Solr是一个独立的企业及搜索应用服务器,它对 ...

  3. Java面试01|JVM相关

    1.JVM内存查看与分析,编写内存泄露实例 堆区.栈区.方法区.本机内存都有可能内存溢出.在这里编写堆区内存溢出实例.如下(来自<深入理解Java虚拟机>一书. // -Xms20m -X ...

  4. Bootstrap学习-排版

    1.标题 <h1>~<h6>,所有标题的行高都是1.1(也就是font-size的1.1倍). 2.副标题 <small>,行高都是1,灰色(#999) <h ...

  5. Flume-ng源码解析之Source组件

    如果你还没看过Flume-ng源码解析系列中的启动流程.Channel组件和Sink组件,可以点击下面链接: Flume-ng源码解析之启动流程 Flume-ng源码解析之Channel组件 Flum ...

  6. 二叉堆 C++实现

    #ifndef __BINARY_HEAP_H__ #define __BINARY_HEAP_H__ #include <iostream> #include <vector> ...

  7. 2764: [JLOI2011]基因补全

    2764: [JLOI2011]基因补全 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 570  Solved: 187[Submit][Status ...

  8. 1934: [Shoi2007]Vote 善意的投票

    1934: [Shoi2007]Vote 善意的投票 Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 1174  Solved: 723[Submit][S ...

  9. C# 在PDF中创建和填充域

    C# 在PDF中创建和填充域 众所周知,PDF文档通常是不能编辑和修改的.如果用户需要在PDF文档中签名或者填写其他内容时,就需要PDF文档中有可编辑的域.开发者也经常会遇到将数据以编程的方式填充到P ...

  10. mybatis与spring整合时读取properties问题的解决

    在学习mybatis与spring整合是,想从外部引用一个db.properties数据库配置文件,在配置文件中使用占位符进行引用,如下: <context:property-placehold ...