iOS 地图详解

地图定位应用场景:周边 导航


oc基于两个框架开发: CoreLocation框架 和 MapKit框架

     CoreLocation框架分为三部分:(开发)

                1.地理定位

               2.地理编码

                     地理编码: 地址转换成经纬度

                     反地理编码:经纬度转换成经纬度

              3.区域监听

       MapKit框架分为两部分:(展示)

              1.地图展示

              2.路线规划

note:    LBS:基于位置的服务

               SoLoMo(索罗门):社交化、本地化、移动化(分移动网和移动APP)

第一大部分:

使用CoreLocation框架进行定位(步骤):1.导入框架(Xcode5后可以省略) 2.导入头文件   3.使用CLLocationManager对象来做很多相关的位置服务

小经验:如果以后使用位置管理者这个对象,实现某个服务,那么可以以startXX 开始某个服务  以stopXX停止某个服务

//开始更新位置信息 ing,意味着,一旦调用了这个方法,就会不断的刷新用户位置,然后告诉外界

//从ios6以后,只要我们在app内部,使用了用户隐私(照片 通讯录等),系统就会要求用户授权

如果想后台运行,勾选后台模式如下:

iOS 地图详解_第1张图片
勾选后台模式

ios8.0以后的定位:

//如果是ios8.0以后,在想请求用户位置信息,需要主动的请求授权,系统不会再自动弹出一个窗口

1.用户授权前台定位步骤:

iOS 地图详解_第2张图片
第一步:授权配置


iOS 地图详解_第3张图片
第二步:授权代码

2.用户后台定位步骤:

//默认情况,只能在前台获取用户位置信息 如果想要在后台也获取用户位置 那么必须勾选后台模式location  updates

iOS 地图详解_第4张图片
后台授权配置(2)


iOS 地图详解_第5张图片
后台授权代码部分(2)ios9.0以下的情况
iOS 地图详解_第6张图片
后台授权代码部分(2)ios9.0以上的情况

3.用户前台后台定位授权操作步骤:(多用)

iOS 地图详解_第7张图片
前后台同时实现定位配置(3)


iOS 地图详解_第8张图片
前后台定位授权代码(3)

.判断用户是否开启定位

iOS 地图详解_第9张图片
授权状态发生变化时调用
iOS 地图详解_第10张图片
授权方法部分判断调整(1)
iOS 地图详解_第11张图片
授权方法部分调整(2)没开启定位的话引导用户开启

.获取用户当前所在的城市,切换到对应的城市

如果想要定位一次,那么可以在定位到之后,停止定位

但是导航的话要求每隔一段时间/每隔一段距离定位一次(建议每隔一段距离定位一次)

设置过滤距离

每隔100米定位一次

locationM.distanceFilter =100

//定位本身就非常耗电,定位的精准度越高,越耗电,定位时间越长

//为了省电,尽量在满足需求的情况下低准确度

iOS 地图详解_第12张图片
设置定位精度

定位分为:

1.标准定位服务:

      定位实现的方案:基于gprs(蓝牙/基站/wifi定位,具体使用哪种,苹果有自己规则

优点:定位精确度高

缺点:程序关闭,就没法获取位置,而且耗电

2.显著位置变化定位

     定位实现方案:(基于基站 定位,必须要求设备有电话模块)

优点:当App被完全关闭时,也可以接收到位置通知,并让app进入到后台处理

缺点:定位精度低


iOS 地图详解_第13张图片
定位的两种方案

所以:如果要求定位及时,精度较高,并且进行时间较短,可使用标准定位;如果长时间监控用户位置,用户移动速度比较快(例如:打车软件),可使用后者

3.自动获取定位

iOS 地图详解_第14张图片
第三种定位方案

第二大部分:

CLLocation对象

iOS 地图详解_第15张图片
CLLocation的几个属性


iOS 地图详解_第16张图片
计算位置之间直线距离的一个例子
iOS 地图详解_第17张图片
course航向(真北和磁北)

CLLocation演练场景:

iOS 地图详解_第18张图片
场景演练一部分
iOS 地图详解_第19张图片
场景演练二部分

 note: 1.千万不要忘记版本适配

                2.前后台定位模式(更好),但必须保证xcode7.0版本,9.0之后的版本

                 3.使用场景:采集用户信息,统计APP使用发布;查找周边好友,周边商家;导航;电商APP,获取用户所在城市

                  4.不需要使用用户位置时,一定要关闭定位服务;如果可以尽可能使用低精度的desiredAccuracy;如果是数据采集(一般是周期性的轮询用户位置),在轮询期间一定要关闭定位

第三大部分:

  1.指南针效果的实现

   思路:获取手机旋转的方向,然后再反转图片就可以了

1)创建位置管理者

2)使用位置管理者,获取当前设备朝向

         //"磁力计"传感器(trueHeading真北方向,magneticHeading磁北方向,一般用磁北方向)

iOS 地图详解_第20张图片
1
iOS 地图详解_第21张图片
2

2.区域监听-监听进入、离开区域动作

//如果想要进行区域监听,在iOS8.0之后,必须要请求用户的位置授权

1)创建区域

2)监听区域

3)进入区域时调用

4)离开区域时调用

iOS 地图详解_第22张图片
1
iOS 地图详解_第23张图片
2
iOS 地图详解_第24张图片
3

3.地理编码 反地理编码

地理编码:把地址文字转化成经纬度 gecode

反地理编码:把经纬度转化成文字地址 reverseGecode

需要联网!!

CLPlacemark:地标对象

//location:地标对象对应的位置对象

//name:地址详情

//。。。。。


iOS 地图详解_第25张图片
1
iOS 地图详解_第26张图片
2
iOS 地图详解_第27张图片
3
4

4.获取当前城市的名称(定位+反地理编码)

iOS 地图详解_第28张图片
1
iOS 地图详解_第29张图片
2
iOS 地图详解_第30张图片
3

5.使用第三方框架进行定位

原因:因为使用CoreLocation框架获取用户位置信息,是通过代理进行回调;而第三方框架将“代理模式”转换成“block模式”,而且额外增加了超时时间等功能

框架名称:LocationManager(可以在gitHub上搜索到)

iOS 地图详解_第31张图片
1
iOS 地图详解_第32张图片
2

6.定位工具类的封装(代理模式到bolck模式的转换)


第四大部分:

1.MapKit框架(用于地图展示,例如大头针、路线、覆盖层展示等等)

1)MapKit框架的基本用法

     使用步骤:1.导入主头文件  #import

                             2.Mapkit有一个比较重要的UI控件:MKMapView,专门用于地图展示

iOS 地图详解_第33张图片
1
iOS 地图详解_第34张图片
2
iOS 地图详解_第35张图片
3

注意:有的状态只有在特定模式下可以用,或者在iOS几以上才能用

2.模拟器追踪显示用户位置-查看当前用户位置(MKUserLocation)

iOS 地图详解_第36张图片
4

3.模拟追踪显示用户位置-调整地图显示区域

地图有个宽和高,经度跨度越大显示内容越小,跨度越小显示内容越大(span),span分为经度跨度(longitudeDelta)和纬度跨度(latitudeDelta);

iOS 地图详解_第37张图片
5

常见问题总结:1.地图上的蓝点为啥不显示?

                           第一:确定代码是否有误(例如:是否显示了用户位置)

                           第二:确定模拟器是否设置位置

                           第三:看看位置在哪,是不是不在当前地图显示区域

                         2.地图跨度设置之后始终显示地图跨度和位置数值不一致?

                            当前看到的地图是一个矩形,实际上地图是个椭圆形,所以移动时跨度一直在变。

测试环境:1.加载地图数据需要联网  2.苹果自带的是高德地图

4.大头针的基本使用

//在地图上操作大头针,实际上操作的是大头针“数据模型”

//删除、添加大头针:移除/添加一个大头针数据模型

//协议里不能创建对象

iOS 地图详解_第38张图片
1.封装 annotation数据模型
iOS 地图详解_第39张图片
2.对大头针进行操作

上面“2”的操作是让点击屏幕时,在当前地图展示的中心位置添加一个大头针,移动地图时移除所有大头针。

iOS 地图详解_第40张图片
3.1
iOS 地图详解_第41张图片
3.2

上面“3”的操作是点击屏幕时在鼠标点击的位置插入一个标签,标签的标题和副标题显示大头针所对应的地理位置

5.自定义大头针

1)模拟系统实现方案

如果当我们添加一个大头针数据模型到地图上,那么地图上就会自动调用一个代理方法,来查找对应的大头针“视图!!”

-parameter mapView :  地图

-parameter annotation: 大头针“数据模型”

-returns:大头针“视图”

//注意事项:如果这个方法没有实现,或者返回nil,那么就会使用系统默认的大头针视图来显示

iOS 地图详解_第42张图片
4
4.1接上一张

2)自定义大头针和弹框

可以设置大头针的图片,弹框的位置,弹框左侧的view、右侧的view和下部弹框,设置大头针可以拖动(移动时会自动更新位置数据)

iOS 地图详解_第43张图片
1
iOS 地图详解_第44张图片
2
iOS 地图详解_第45张图片
3

3)代理方法补充(MKMapViewDelegate)

下面“1”图展示了MKMapViewDelegate中的两个代理方法:

iOS 地图详解_第46张图片
1

4)切换追踪模式的按钮

iOS 地图详解_第47张图片
1
iOS 地图详解_第48张图片
2

6  地图使用总结

你可能感兴趣的:(iOS 地图详解)