iOS 中手把手教你集成地图

俗话说,好记性不如烂笔头,关于集成地图 (这里以百度地图为例) 这一块,本人目前在一家代驾公司做了一年了,对这一块比较熟悉,现在总结一下常用方法,希望能帮到有需要的小伙伴。

1.集成地图环境
先去百度官方下载SDK,然后导入对应的文件到你的项目中,在这里杂乱的不说,提几个地方:mapapi.bundle别忘了导入; 除了导入百度提供的包,还要手动在程序中添加系统库; info.plist文件中几个操作:iOS9后http协议的设置;获取地理位置的设置;display name的设置; 最后一点,去百度申请的key要对应你项目中的buddle id 。xcode7.3中自动提示有时候挺让人无语的,不出来我们的结果,导入头文件的时候他提示的都不对,现在把所以头文件写在下面,根据需要复制粘贴即可。

好了,第一步结束。

2.基本地图的实现
在appdelegate中导入框架,并服从BMKGeneralDelegate代理,在didFinishLaunchingWithOptions方法中实现如下代码

在viewcontroller中,遵循BMKMapViewDelegate代理

在viewdidload中,

然后地图出来,到这一步算是刚开始

3.地图的定位

遵循BMKLocationServiceDelegate代理,定义BMKLocationService类
在position点击方法中

定位代理方法-(void)didUpdateBMKUserLocation:(BMKUserLocation *)userLocation,在这个方法中,定位时候能获取到经纬度 userLocation.location.coordinate
然后点击了,发现地图没有动静,这是为啥哩~
哦,原来我们忘记设置了地图的中心点

当然了,想要动画的话,我们还是这样设置:

然后定位吧,地图上就显示出一个蓝色小点,然后你高兴了吧,没等你高兴多久,产品跑来给你说,定位的图片我们需要用我们自己设计的图片,傻了吧。接下来就需要用到自定义标注了。

4.标注
讲标注之前,需要弄懂两个类的区别,BMKPointAnnotation和BMKAnnotationView,很多初入地图行的人都弄不清(我自己一开始也是),前者官方解释的是一个点的标注,后者则是标注视图,好像还是不清楚0.0。。。。按照我的理解就是:前者代表一个点,比如你地图上有很多红色大头针,大头针往那里一插,是不是有个点?这个点,就表示BMKPointAnnotation,具有地理的经纬度特性(其他的一些信息也可以写在这里,如果你的后台将一系列信息包括经纬度信息传给你的话,你就可以重写这个类)。BMKAnnotationView则代表这个红色大头针,什么?红色大头针不好看,我要换成德玛西亚巨剑,好的,直接在这个BMKAnnotationView内部添加image即可,怎么样,弄懂了吗?? 好,下面来代码,走起~
首先解决第一个问题,系统蓝色定位小圆点太丑,要换我们自己的,OK。
(1) 对BMKPointAnnotation操作,上面定位获取地理位置的代理方法中

[_mapView addAnnotation:_pointAnnotation];,运行的时候他会自动去寻找BMKAnnotationView,这个需要在标注代理方法中写。

(2) 对BMKAnnotationView操作,新建一个类继承于BMKAnnotationView,在.h中声明一个属性

在.m文件中重写init方法

(3) 生成对应气泡时候触发的方法

如下图:

111903176-ca2008a2e6227cf8

自定义的标注完成了,自定义气泡呢?这涉及到一个paopaoView,也就是BMKAnnotationView内部的一个属性,它就是点击触发的气泡视图。
在上面的(2)方法中,添加一段paopaoView代码

运行,如下

paopao.gif

还有我们什么时候重写BMKPointAnnotation呢,一般来说他只是传个地理位置信息,当我们在地图上想要显示多个地理位置信息的时候,比如后台返回来一个数组,里面每个元素都是一个字典,每个字典代表一个单位,除了地理位置信息,还有其他信息,比如名字,图片等,对应的是每个地理位置,这时候重写BMKPointAnnotation,并在其中定义一个model属性,用来接收后台返回来的model信息串。然后声明这个pointAnnotation类的对象,并给他赋值后台返回来的model信息串中的位置信息,并将整个model传给他,后面的操作和上面的步骤一样。
具体想怎么做,看你自己~~~

5.POI检索
我们先定义一个输入框,然后根据输入的文字来大概的地址

在返回的代理方法中,我们打印一下

效果图如下

是不是得到我们要的数据了呢。然后把这些数据显示到tableview上,是不是就像我们常见的搜索框搜索,得到对应的结果了~~~

6.地理反编码
地理反编码的应用一般是移动地图,然后显示附近的地理信息(我们常见的app上这个功能一般是和poi搜索配合使用的)
声明变量,遵循代理

移动地图的代理方法

移动地图,效果如下:


当然了,如果你想配合着poi使用,只需要把result.poiList数据源存储到数组中,然后在tableView中显示出来,你会了吗?~~~~

7.路径规划
将目的地和初始地点连接起来,通过百度内部API来告诉我们怎么去(也就是去一个地方查地图一样)
首先导入

这两个头文件,并遵循代理BMKRouteSearchDelegate。

在.m文件最上面,我们还要声明一个PointAnnotation类,代码如下

同时,我们定义一个属性

在button点击方法里实现下面的代码

在上面的代码中,我们用的是BMKTransitRoutePlanOption,也就是公交(地铁)方式,如果你想用别的(比如步行,或者骑乘,驾车等),可在这替换方法

由于上面我们用的是公交,所以下面我们要实现公交的代理方法(每种方式有每种方式的代理方法)

在上面结尾那里我们添加了路线overlay,所以我们要实现overlay的代理方法

在这里,你可以根据自己的需要改变线条的一些属性,不多说。
把下面这段代码复制到工程里,这是百度给我们写好的根据路径计算地图范围的,挺棒的,直接用他们的。

由于我们在公交的代理方法中添加了标注,所以我们要在标注的代理方法中实现我们自定义的标注

这里面调用了一个方法,我们用百度SDK中给我们写好的,由于他们写的较多,还涉及到其他文件,在这里我们就举个例子,所以有的我给注掉了,咱们就看个显示效果,好看点的效果到时候咱们再去百度SDK中把它的拿来。

好了,到这里就算结束了,根据公交进行路径规划,实现效果如下:

对了,如果你想算出开始到结束的距离(非直线距离,一般我们都算走过的里程),可以直接在公交的代理方法中,用BMKTransitRouteLine的distance属性,再除以1000,就可以算出公里数了,很简单吧??~~~

打印结果如下图:

1903176-a4ec0fc7bf3259cf

当然了,你项目中想实现别的种类,比如驾车(会有提示到哪拐弯之类的),你可以自己根据百度SDK中写的改一改(这个路径规划还是看一看百度SDK吧,我在这不多写了,毕竟方式都一样,只是种类多)。

断断续续写了好几天,挺多的,也希望能帮到不怎么会地图集成的小伙伴们~
更新:有的小伙伴需要demo,我上传了github上,地址:https://github.com/Feijunjie/BaiduMapDemo/tree/master
所以,如果你觉得我写的不错或者帮到您了,就给我点个赞吧

1 5 收藏 评论

可能感兴趣的话题



直接登录
跳到底部
返回顶部