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内部,使用了用户隐私(照片 通讯录等),系统就会要求用户授权

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

勾选后台模式

ios8.0以后的定位:

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

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

第一步:授权配置


第二步:授权代码

2.用户后台定位步骤:

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

后台授权配置(2)


后台授权代码部分(2)ios9.0以下的情况
后台授权代码部分(2)ios9.0以上的情况

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

前后台同时实现定位配置(3)


前后台定位授权代码(3)

.判断用户是否开启定位

授权状态发生变化时调用
授权方法部分判断调整(1)
授权方法部分调整(2)没开启定位的话引导用户开启

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

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

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

设置过滤距离

每隔100米定位一次

locationM.distanceFilter =100

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

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

设置定位精度

定位分为:

1.标准定位服务:

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

优点:定位精确度高

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

2.显著位置变化定位

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

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

缺点:定位精度低


定位的两种方案

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

3.自动获取定位

第三种定位方案

第二大部分:

CLLocation对象

CLLocation的几个属性


计算位置之间直线距离的一个例子
course航向(真北和磁北)

CLLocation演练场景:

场景演练一部分
场景演练二部分

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

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

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

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

第三大部分:

  1.指南针效果的实现

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

1)创建位置管理者

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

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

1
2

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

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

1)创建区域

2)监听区域

3)进入区域时调用

4)离开区域时调用

1
2
3

3.地理编码 反地理编码

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

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

需要联网!!

CLPlacemark:地标对象

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

//name:地址详情

//。。。。。


1
2
3
4

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

1
2
3

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

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

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

1
2

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


第四大部分:

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

1)MapKit框架的基本用法

     使用步骤:1.导入主头文件  #import<Mapkit/Mapkit.h>

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

1
2
3

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

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

4

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

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

5

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

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

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

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

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

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

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

4.大头针的基本使用

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

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

//协议里不能创建对象

1.封装 annotation数据模型
2.对大头针进行操作

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

3.1
3.2

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

5.自定义大头针

1)模拟系统实现方案

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

-parameter mapView :  地图

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

-returns:大头针“视图”

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

4
4.1接上一张

2)自定义大头针和弹框

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

1
2
3

3)代理方法补充(MKMapViewDelegate)

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

1

4)切换追踪模式的按钮

1
2

6  地图使用总结

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容