如何开发一个简单的百度地图(一)

各位小伙伴们大家好,今天我向大家介绍一下苹果百度地图的使用方法,因为做过一些想关的APP,感觉百度地图还是挺方便的。

首先我们先创建一个工程,创建好了之后,我们继续来看一下百度地图的开放平台

点击上面个的开发,然后选择下面的ios地图SDK,进去之后我们会看到百度地图的概述:

地图

(地图都是一些简单的功能,只能进行一些查看的简单操作)

提供地图展示和地图操作功能

· 地图展示包括:普通地图(2D,3D)、卫星图和实时交通图;

· 地图操作:可通过接口或手势控制来实现地图的点击、双击、长按、缩放、旋转、改变视角等操作。


POI检索

(POI检索主要是对周边或者某个城市,还有一些商家商店,景点地址等搜索)

支持周边检索、区域检索、城市内检索和Place详情信息检索。

·周边检索:以某一点为中心,指定距离为半径,根据用户输入的关键词进行POI检索;

·区域检索:在指定的矩形区域内、根据关键词进行POI检索;

·城市内检索:在某一城市内,根据用户输入的关键字进行POI检索;

·Place详情检索:根据POI的ID信息,检索指定POI点的Place详情数据。

地理编码

(地理编码的功能就是根据已个地址名得到它的坐标,或者根据坐标得到地址的名称,比如我们定位之后,会获取到我们位置的坐标,然后根据坐标得到我们位置的一些信息,或者来获取周边的一些信息等)

提供地理坐标和地址之间相互转换的能力。

·正向地理编码:实现了将中文地址或地名描述转换为地球表面上相应位置的功能;

·反向地理编码:将地球表面的地址坐标转换为标准地址的过程。


线路规划

(线路规划就是当我们需要去某个地方,我们进行搜索之后就会在地图上显示出一条路线来指示我们)


支持公交信息查询、公交换乘查询、驾车线路规划和步行路径检索。

·公交信息查询:可对公交详细信息进行查询;

·公交换乘查询:根据起、终点,查询策略,进行线路规划方案;

·驾车线路规划:提供不同策略,规划驾车路线;(支持设置途经点)

·步行路径检索:支持步行路径的规划。


调启百度地图

(调起百度地图,就是在我们自己的App里直接跳到百度地图的App,如果我们安装了百度地图就会开启百度地图App,如果我们没安装百度地图App那么它就会在浏览器里打开百度地图)

利用SDK接口,直接在本地打开百度地图客户端或WebApp,实现地图功能。 目前支持调启的功能有:POI周边检索、POI详情页面、步行线路规划、驾车线路规划、公交线路规划、驾车导航。(具体请参考开发指南中,计算工具章节内的介绍)



定位

采用iOS系统定位,使用地图SDK中我的位置图层进行丰富的位置展示(包括普通态、跟随态和罗盘态)。

上面都是是我们开发中常用到的一些功能,下面的的功能用的不是特别多

覆盖物图层

支持多种覆盖物图层,便于显示POI检索结果、线路规划结果、自定义标绘等。 此外还提供特有的图片图层,用于显示用户传入的图片信息。开放热力图绘制能力,通过用户自有数据,绘制属于自己的热力图。 瓦片图层,支持开发者添加自有瓦片数据


离线地图

用户可以通过SDK在线下载离线包接口,下载离线地图包,使用离线地图可节省用户流量,提供更好的地图展示效果

周边雷达

周边雷达功能,是面向移动端开发者的一套SDK功能接口。同步支持Android和iOS端。它的本质是一个连接百度LBS开放平台前端SDK产品和后端LBS云的中间服务。开发者利用周边雷达功能,可以便捷的在自己的应用内,帮助用户实现查找周边跟“我”使同样一款App的人,这样一个功能。

LBS云

百度地图LBS云是百度地图针对LBS开发者全新推出的平台级服务,不仅适用PC应用开发,同时适用移动设备应用的开发。 使用LBS云,可以实现移动开发者存储海量位置数据的服务器零成本及维护压力,且支持高效检索用户数据,且实现地图展现。

特色功能

特色功能包括:短串分享、Place详情检索等。

·短串分享:将POI搜索结果或反地理编码结果生成短串,当其他用户点击短串即可打开手机上的百度地图客户端或者手机浏览器进行查看。

·热力图绘制:根据用户自有数据,提供相应绘制接口,实现热力图本地绘制;

·Place详情检索:根据POI的ID信息,检索指定POI点的Place详情数据。


个性化地图

自v2.10.0起,支持使用个性化地图模板,改变底图颜色和样式。

·使用个性化模板,实现地图元素的颜色设置,地图元素包含大地、水系、草地、高速、普通道路、铁路、地铁,poi等,以及poi和道路的文字颜色设置。

·通过可见属性,控制显示地图元素。


室内图

自v3.0版起,百度地图SDK室内图功能正式上线,辅助开发者实现全新的地理位置服务体验,室内地图与百度地图App同步更新。

·支持的公众建筑包含购物商场、机场和火车站等交通枢纽,医院等,覆盖全国约600个大型购物中心,覆盖类型和城市还在持续增加中。


这些都是一些常用的基本功能,下面我们继续看开发的过程:

首先我们先获取秘钥,获取秘钥我们就必须要登录百度账号,我们可以用QQ、微博、微信或者直接注册一个账号,登录之后呢直接点击获取秘钥,然后我们会看到,如图:

需要我们注册开发者,我们在这填写上姓名,手机号邮箱之后,就可以了,因为我有一个我就直接用我现在的了,直接登录进入到申请密钥的界面,可以看到我这里面

百度地图iOS SDK开发密钥的申请地址为:http://lbsyun.baidu.com/apiconsole/key


创建了有很多应用,然后我们点击左边上面的创建应用,创建一个新的应用方便我们演示;

我们先起个名字,百度地图Demo,然后点击下面的应用类型,选择ios SDK,然后继续选择下面的启用服务,一般用不到的我们会勾选掉,然后继续下面填写安全码,说一下可能第一次用百度地图的小伙伴不知道这个安全码在哪找,其实这个安全码是在我们创建的项目工程里的Bundle identifier,如图:

根据顺序选则,上面选中的就是我们的安全码,直接拷贝到我们的创建百度应用里面,最后直接提交,就可以了。

创建完应用之后我们会获取到一个访问应用的APK

如图:

这就是我们代码里所需要的,一会我们会把他粘贴到我们的工程项目里;


下面我们继续看,首先我们来先看一下简介:

主要介绍了什么是百度地图ios SDK,基本功能我们上面已经说过了,还有适用的对象,以及获取定制的的SDK和兼容性

什么是百度地图iOS SDK?

百度地图iOS SDK是一套基于armv7、armv7s、arm64(自v2.5.0版本)处理器设备的应用程序接口,不仅提供构建地图的基本接口,还提供POI搜索、地理编码、路线规划、定位、本地覆盖物绘制、周边雷达等服务,自v2.0.0开始为矢量渲染的3D地图,并新增了矢量离线地图下载功能接口。

自v2.7.0版本开始,iOS 地图SDK向广大开发者提供了 .framework形式的开发包,此种形式配置简单、使用方便,请广大开发者使用。自2.9.0版本起,iOS 地图SDK不再提供 .a形式的开发包!

您可以使用百度地图iOS SDK开发适用于移动设备的地图应用,通过接口,您可以轻松访问百度服务和数据,构建功能丰富、交互性强的地图应用程序。百度地图iOS SDK提供的功能如下:

地图:提供地图展示和地图操作功能;

室内图:提供展示公众建筑物室内地图的展示功能;

POI检索:支持周边检索、区域检索和城市内兴趣点检索;

室内POI检索:支持设置城市和当前建筑物的室内POI检索;

地理编码:提供经纬度和地址信息相互转化的功能接口;

线路规划:支持公交、驾车、步行、骑行,四种方式的线路规划;

覆盖物图层:支持在地图上添加覆盖物(标注、几何图形、热力图、地形图图层等),展示更丰富的LBS信息;

定位:获取当前位置信息,并在地图上展示(支持普通、跟随、罗盘三种模式);

离线地图:使用离线地图可节省用户流量,提供更好的地图展示效果;

调启百度地图:利用SDK接口,直接在本地打开百度地图客户端或WebApp,实现地图功能;

周边雷达:利用周边雷达功能,开发者可在App内低成本、快速实现查找周边使用相同App的用户位置的功能;

LBS云检索:支持查询存储在LBS云内的自有数据;

瓦片图层: 支持在地图上添加自有瓦片数据。

特色功能:提供短串分享、Place详情检索、热力图等特色功能,帮助开发者搭建功能更加强大的应用;

获取定制的SDK

开发者可在百度地图iOS SDK的下载页面下载到最新版的地图SDK,下载地址为:http://developer.baidu.com/map/index.php?title=iossdk/sdkiosdev-download

为了给开发者带来更优质的地图服务、满足开发者灵活使用SDK的需求,百度地图SDK自v2.3.0起,采用了可定制的形式为用户提供开发包。百度地图SDK按功能可分为:基础地图、检索功能、LBS云检索、定位功能、计算工具、周边雷达六个部分,开发者可根据自身的实际需求,任意组合这六种功能,点击下载页面的“自定义下载”,即可下载相应的开发包来完成自己的应用开发。

基础地图:包括基本矢量地图、卫星图、实时路况图和各种地图覆盖物(POI搜索结果图层、路线图层、自定义图层、几何图形绘制图层、地形图图层、热力图、瓦片图层等),此外还包括各种与地图相关的操作和事件监听;

检索功能:包括POI检索(周边、区域、城市内),Place详情检索,行政区域检索,公交信息查询,路线规划(驾车、步行、公交、骑行),地理编码/反地理编码,在线建议查询,短串分享等;

LBS云检索:包括LBS云检索(周边、区域、城市内、详情);

定位功能:获取当前位置信息;

计算工具:包括计算两点之间距离、计算矩形面积、坐标转换、调启百度地图客户端、判断点和圆/多边形位置关系、本地收藏夹等功能;

周边雷达:包含位置信息上传和检索周边相同应用的用户位置信息功能;

注:本套开发指南是针对默认的全功能包编写,开发者在使用定制化的SDK进行开发时,请参考开发指南中相对应的章节或从相应开发包中的readme文档获取更多信息。

兼容性

百度地图iOS SDK支持iOS 5.0及以上操作系统,支持armv7、armv7s、arm64(自v2.5.0版本)处理器。


注意事项与配置开发环境

下面再来说一下关键的部分,注意事项跟开发环境的配置,我在第一次开发这个百度地图的时候出现了一些问题,大部分都是因为注意事项这里有的没有改,从而导致了项目没有跑起来。

注意事项

1、静态库中采用ObjectC++实现,因此需要您保证您工程中至少有一个.mm后缀的源文件(您可以将任意一个.m后缀的文件改名为.mm),或者在工程属性中指定编译方式,即在Xcode的Project -> Edit Active Target -> Build Setting 中找到 Compile Sources As,并将其设置为"Objective-C++"

2、如果您只在Xib文件中使用了BMKMapView,没有在代码中使用BMKMapView,编译器在链接时不会链接对应符号,需要在工程属性中显式设定:在Xcode的Project -> Edit Active Target -> Build Setting -> Other Linker Flags中添加-ObjC

3、授权Key的申请:新、旧Key之间不可通用,即新Key只可以使用在v2.0.2及后续版本的SDK中,旧的Key只适用于v2.0.1及之前版本的SDK;如果还没有授权Key,请 申请密钥

4、由于iOS9改用更安全的https,为了能够在iOS9中正常使用地图SDK,请在"Info.plist"中进行如下配置,否则影响SDK的使用。NSAppTransportSecurityNSAllowsArbitraryLoads

如图

5、如果在iOS9中使用了调起百度地图客户端功能,必须在"Info.plist"中进行如下配置,否则不能调起百度地图客户端。

<key>LSApplicationQueriesSchemesbaidumap</key>

        <array>

         <string> baidumap</string>

        </array>

如图(我这里是添加了两个方便大家看,大家可以根据需要来添加)


6、管理地图的生命周期:自2.0.0起,BMKMapView新增viewWillAppear、viewWillDisappear方法来控制BMKMapView的生命周期,并且在一个时刻只能有一个BMKMapView接受回调消息,因此在使用BMKMapView的viewController中需要在viewWillAppear、viewWillDisappear方法中调用BMKMapView的对应的方法,并处理delegate,代码如下:

(void)viewWillAppear:(BOOL)animated

{

[_mapView viewWillAppear];

_mapView.delegate = self; // 此处记得不用的时候需要置nil,否则影响内存的释放

}

-(void)viewWillDisappear:(BOOL)animated

{

[_mapView viewWillDisappear];

_mapView.delegate = nil; // 不用时,置nil

}

7、自iOS SDK v2.5.0起,为了对iOS8的定位能力做兼容,做了相应的修改,开发者在使用过程中注意事项如下: 需要在info.plist里添加(以下二选一,两个都添加默认使用NSLocationWhenInUseUsageDescription):

NSLocationWhenInUseUsageDescription ,允许在前台使用时获取GPS的描述

NSLocationAlwaysUsageDescription ,允许永久使用GPS的描述

如图

8、在使用Xcode6进行SDK开发过程中,需要在info.plist中添加:Bundle display name ,且其值不能为空(Xcode6新建的项目没有此配置,若没有会造成manager start failed)

9、百度地图iOS SDK v2.5.0起,对arm64进行了支持适配,开发包体积有所增加。但根据开发者在研发过程中的选择,最终生成的APP体积并不会发生较大的变化。

10、确认项目中添加mapapi.bundle文件以及添加方法正确,不能删除或随意更改其中files文件夹下的内容:

注:mapapi.bundle中存储了定位、默认大头针标注View及路线关键点的资源图片,还存储了矢量地图绘制必需的资源文件。如果您不需要使用内置的图片显示功能,则可以删除bundle文件中的image文件夹。您也可以根据具体需求任意替换或删除该bundle中image文件夹的图片文件。添加方式:将mapapi.bundle拷贝到您的工程目录,直接将该bundle文件托拽至Xcode工程左侧的Groups&Files中即可。若您需要替换定位、指南针的图标,请保留原文件名称,否则不显示替换的新图片,默认大头针标注与路线关键点的新图片名称可自定义名称。

11、注意BMKManager对象的生命周期管理,在使用地图SDK期间不能释放该对象,尤其在arc情况下注意避免提前被自动释放,否则,该对象一旦被释放,网络模块将不可用,地图无法加载,检索失败。

12、app在前后台切换时,需要使用下面的代码停止地图的渲染和openGL的绘制(V2.10.0后不需要再调用):

- (void)applicationWillResignActive:(UIApplication *)application {

[BMKMapView willBackGround];//当应用即将后台时调用,停止一切调用opengl相关的操作

}

- (void)applicationDidBecomeActive:(UIApplication *)application {

[BMKMapView didForeGround];//当应用恢复前台状态时调用,回复地图的渲染和opengl相关的操作

}


配置开发环境

概述

百度地图iOS SDK自v2.7.0版本起,向广大开发者提供了 .framework形式的SDK开发包,这种形式的开发包配置简单,使用方便,推荐大家使用

如图,如果我们对百度地图还不太熟悉的话,我建议全部下载,我们可以看一下人家的源码,方便我们开发


自动配置.framework形式开发包(使用CocoaPods)

注:此种方式只支持导入全量包的SDK,包含百度地图iOS SDK所有功能

一、前提:安装CocoaPods

在终端输入

sudo gem install cocoapods

如果安装成功,会有一个提示

Successfully installed cocoaPods

二、使用CocoaPods导入地图SDK

在当前工程文件(.xcodeproj)所在文件夹下,打开terminal

1.创建Podfile:

touch Podfile

2.编辑Podfile内容如下:

pod 'BaiduMapKit' #百度地图SDK

3.在Podfile所在的文件夹下输入命令:

pod install (这个可能比较慢,请耐心等待……)

成功以后,会出现如下记录:

Analyzing dependencies

Downloading dependencies

Installing BaiduMapKit (2.9.1)

Generating Pods project

Integrating client project

[!] Please close any current Xcode sessions and use `***.xcworkspace` for this project from now on.

Sending stats

恭喜你已成功导入百度地图iOS SDK,现在就可以打开xcworkspace文件,在你的项目中使用百度地图SDK了

手动配置.framework形式开发包

第一步、根据需要导入 .framework包

百度地图 iOS SDK 采用分包的形式提供 .framework包,请广大开发者使用时确保各分包的版本保持一致。其中BaiduMapAPI_Base.framework为基础包,使用SDK任何功能都需导入,其他分包可按需导入。

将所需的BaiduMapAPI_**.framework拷贝到工程所在文件夹下。

在 TARGETS->Build Phases-> Link Binary With Libaries中点击“+”按钮,在弹出的窗口中点击“Add Other”按钮,选择BaiduMapAPI_**.framework添加到工程中。

注: 静态库中采用Objective-C++实现,因此需要您保证您工程中至少有一个.mm后缀的源文件(您可以将任意一个.m后缀的文件改名为.mm),或者在工程属性中指定编译方式,即在Xcode的Project -> Edit Active Target -> Build Setting 中找到 Compile Sources As,并将其设置为"Objective-C++"

第二步、引入所需的系统库

百度地图SDK中提供了定位功能和动画效果,v2.0.0版本开始使用OpenGL渲染,因此您需要在您的Xcode工程中引入CoreLocation.framework和QuartzCore.framework、OpenGLES.framework、SystemConfiguration.framework、CoreGraphics.framework、Security.framework、libsqlite3.0.tbd(xcode7以前为 libsqlite3.0.dylib)、CoreTelephony.framework 、libstdc++.6.0.9.tbd(xcode7以前为libstdc++.6.0.9.dylib)。

(注:红色标识的系统库为v2.9.0新增的系统库,使用v2.9.0及以上版本的地图SDK,务必增加导入这3个系统库。)

添加方式:在Xcode的Project -> Active Target ->Build Phases ->Link Binary With Libraries,添加这几个系统库即可。


第三步、环境配置

在TARGETS->Build Settings->Other Linker Flags 中添加-ObjC。

如图

第四步、引入mapapi.bundle资源文件

如果使用了基础地图功能,需要添加该资源,否则地图不能正常显示mapapi.bundle中存储了定位、默认大头针标注View及路线关键点的资源图片,还存储了矢量地图绘制必需的资源文件。如果您不需要使用内置的图片显示功能,则可以删除bundle文件中的image文件夹。您也可以根据具体需求任意替换或删除该bundle中image文件夹的图片文件。

方法:选中工程名,在右键菜单中选择Add Files to “工程名”…,从BaiduMapAPI_Map.framework||Resources文件中选择mapapi.bundle文件,并勾选“Copy items if needed”复选框,单击“Add”按钮,将资源文件添加到工程中。

第五步、引入头文件

在使用SDK的类 按需 引入下边的头文件:

#import<BaiduMapAPI_Base/BMKBaseComponent.h>//引入base相关所有的头文件

#import<BaiduMapAPI_Map/BMKMapComponent.h>//引入地图功能所有的头文件

#import<BaiduMapAPI_Search/BMKSearchComponent.h>//引入检索功能所有的头文件

#import<BaiduMapAPI_Cloud/BMKCloudSearchComponent.h>//引入云检索功能所有的头文件

#import<BaiduMapAPI_Location/BMKLocationComponent.h>//引入定位功能所有的头文件

#import<BaiduMapAPI_Utils/BMKUtilsComponent.h>//引入计算工具所有的头文件

#import<BaiduMapAPI_Radar/BMKRadarComponent.h>//引入周边雷达功能所有的头文件

#import<BaiduMapAPI_Map/BMKMapView.h>//只引入所需的单个头文件


下面我们就来创建一个地图

初始化BMKMapManager

在您的AppDelegate.h文件中添加BMKMapManager的定义

@interface BaiduMapApiDemoAppDelegate : NSObject <UIApplicationDelegate>{

UIWindow *window;

UINavigationController *navigationController;

BMKMapManager* _mapManager;

}

在您的AppDelegate.m文件中添加对BMKMapManager的初始化,并填入您申请的授权Key,示例如下

- (BOOL)application:(UIApplication *)application

didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {       // 要使用百度地图,请先启动BaiduMapManager

_mapManager = [[BMKMapManager alloc]init];

// 如果要关注网络及授权验证事件,请设定     generalDelegate参数

BOOL ret = [_mapManager start:@"在此处输入您的授权Key"  generalDelegate:nil];

if (!ret) {

NSLog(@"manager start failed!");

}

// Add the navigation controller's view to the window and display.

[self.window addSubview:navigationController.view];

[self.window makeKeyAndVisible];

return YES;

}

创建BMKMapView

在您的ViewController.m文件中添加BMKMapView的创建代码,示例如下

- (void)viewDidLoad {

[super viewDidLoad];

BMKMapView* mapView = [[BMKMapView alloc]initWithFrame:CGRectMake(0, 0, 320, 480)];

self.view = mapView;

}

自2.0.0起,BMKMapView新增viewWillAppear、viewWillDisappear方法来控制BMKMapView的生命周期,并且在一个时刻只能有一个BMKMapView接受回调消息,因此在使用BMKMapView的viewController中需要在viewWillAppear、viewWillDisappear方法中调用BMKMapView的对应的方法,并处理delegate,代码如下:

(void)viewWillAppear:(BOOL)animated

{

    [_mapView viewWillAppear];

     _mapView.delegate = self; // 此处记得不用的时候需要置nil,否则影响内存的释放

}

-(void)viewWillDisappear:(BOOL)animated

{

      [_mapView viewWillDisappear];

      _mapView.delegate = nil; // 不用时,置nil

}

编译,运行,效果如下图所示:


然后我运行出现了报错


然后我们看一下出错的的原因


如果我们不知道这是什么原因的话我们可以吧报错复制粘贴到百度搜索一下会出现很多解决的方法;

我们先来看一下我这里,跟我们导入的API有关系,我看了一下原来是我那会吧真机测试的API导入了进去,我们重新换掉它来看一下

如图

然后就可以运行起来了,就是一个简单的百度地图;

然后我们也会看到下面提示一个


然后我们在info.plist中添加上就可以了




好了这个就是我们一个简单的百度开发的流程,我们来总结一下这篇文章:

一:开发流程

1.需要一个百度开发账号

2.注册一个新的应用

3.下载百度地图SDK,添加到项目里

4.配置开发环境

5.调试代码,能运行起来

二:注意事项

1.首先需要注意上面提到的注意事项,以及开发流程,一定要一步一步来操作,如果有一步出错就可能会导致我们的项目运行不起来(http://lbsyun.baidu.com/index.php?title=iossdk/guide/attention

2.还有就是我刚才遇到的,我们导入的API,如果是模拟器的就用模拟器运行,如果是真机的就用真机运行;

另外还有一个有时候会报错,需要我们修改

如图

一个简单的百度地图开发流程就是这样的,如果想详细了解其他的功能,请继续关注我后期的更新,后期我会继续把一些其他的功能,如定位,poi检索,导航等功能给大家写出来方便大家编写。

项目源码地址:https://github.com/Lee0924/BaiDuMap.git

我写这篇文章希望能帮到大家,如果有写的不好的地方,希望各位大牛大神给指出来,谢谢!!!

推荐阅读更多精彩内容