您的位置:首页 > 移动开发 > IOS开发

iOS 开发 百度地图

2016-06-21 10:18 561 查看
手把手教你,百度地图

第一步,创建项目,自己动手。

第二步,拷贝你的 Bundle ID ,进百度API。百度地图需要先申请密钥(key) ,才可使用该套SDK接口。

附上网址:http://lbsyun.baidu.com/apiconsole/key/create

这里填上项目名称,勾选iOS SDk ,把复制的 Bundle ID 粘贴过来,就创建应用成功了。

成功以后复制你的AK,先放进项目,等待后续操作吧。



第三步,下载百度地图SDK,下载地址也留下:http://lbsyun.baidu.com/index.php?title=iossdk/sdkiosdev-download

接下来,配置开发环境,导入SDK

1、iOS 必须的 配置,这个就不详细说了

<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>




接着添加Bundle display name,不明所以,但是要求添加



2、手动配置 .framework 开发包

注意:BaiduMapAPI_Base.framework为基础包,使用SDK任何功能都需导入,其他分包可按需导入。

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

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

此时注意一个问题,资源包在下载的Demo里,拿出来,直接拷贝进工程就可以。



3、引入所需的系统库

需要在您的Xcode工程中引入CoreLocation.framework和QuartzCore.framework、OpenGLES.framework、SystemConfiguration.framework、CoreGraphics.framework、Security.framework、libsqlite3.0.tbd、CoreTelephony.framework 、libstdc++.6.0.9.tbd。



4、环境配置

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



5、引入头文件

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

建议放在pch文件下。

#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>//只引入所需的单个头文件


6、把项目中的一个 .m 改为 .mm

我习惯性改 AppDelegate.m —— AppDelegate.mm

这下,就可以进入代码世界了。

先build一下,确定没有错误,我们继续

第四步,接下来,全是代码

1、AppDelegate 中 ,.h 添加

@property (nonatomic, strong) BMKMapManager *mapManager;


.m 中呢,也添加一个,在didFinishLaunchingWithOptions中,加入以下代码块:

// 要使用百度地图,请先启动BaiduMapManager
_mapManager = [[BMKMapManager alloc]init];
// 如果要关注网络及授权验证事件,请设定     generalDelegate参数
BOOL ret = [_mapManager start:@"把你之前拷贝的AK拿过来"  generalDelegate:nil];

if (!ret)
{

NSLog(@"manager start failed!");

NSLog(@"_____________________授权失败");

}else{
NSLog(@"_____________________授权成功");
}


这个时候跑一下吧,看看是否授权成功。

2、进入地图显示界面了

先声明地图

@property(nonatomic,strong)BMKMapView *mapView;


懒加载地图

- (BMKMapView *)mapView
{
if (!_mapView) {
BMKMapView *mapView = [[BMKMapView alloc] initWithFrame:self.view.bounds];

_mapView = mapView;
}
return _mapView;
}


接着在viewDidLoad中写一句

[self.view addSubview:self.mapView];


这下地图就显示出来了。

地图是比较消耗内存的,BMKMapView用viewWillAppear、viewWillDisappear方法来控制BMKMapView的生命周期,并且在一个时刻只能有一个BMKMapView接受回调消息,因此在使用BMKMapView的viewController中需要在viewWillAppear、viewWillDisappear方法中调用BMKMapView的对应的方法,并处理delegate,代码如下:

//  协议名称  BMKMapViewDelegate
-(void)viewWillAppear:(BOOL)animated
{
[_mapView viewWillAppear];
_mapView.delegate = self; // 此处记得不用的时候需要置nil,否则影响内存的释放
}
-(void)viewWillDisappear:(BOOL)animated
{
[_mapView viewWillDisappear];
_mapView.delegate = nil; // 不用时,置nil
}


第四步、其他功能

这个时候,地图的功能,你想要的功能,都可以实现了。

先来一个定位吧。

1、在使用定位功能之前,需要在info.plist里添加(以下二选一,两个都添加默认使用NSLocationWhenInUseUsageDescription):

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

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

2、添加代码

@implementation ViewController
{
BMKLocationService* _locService;
}


#pragma mark - ___________定位_______
//实现相关delegate 处理位置信息更新
//处理方向变更信息
- (void)userLocation
{
//    _mapView.showsUserLocation = YES;

_locService = [[BMKLocationService alloc]init];

_locService.delegate = self;

_mapView.userTrackingMode = BMKUserTrackingModeFollow;

[self startUserLocationService];
}

/// 开始定位
- (void)startUserLocationService
{
[_locService startUserLocationService];
}

//实现相关delegate 处理位置信息更新
//处理方向变更信息
- (void)didUpdateUserHeading:(BMKUserLocation *)userLocation
{
//NSLog(@"heading is %@",userLocation.heading);
}
//处理位置坐标更新
- (void)didUpdateBMKUserLocation:(BMKUserLocation *)userLocation
{
NSLog(@"didUpdateUserLocation lat %f,long %f",userLocation.location.coordinate.latitude,userLocation.location.coordinate.longitude);

//  设置屏幕中心
[_mapView setCenterCoordinate:userLocation.location.coordinate animated:YES];

//  设置显示比例尺
_mapView.zoomLevel = 18;

//  更新我的位置数据
[_mapView updateLocationData:userLocation];

//  显示用户中心
_mapView.showsUserLocation = YES;
}


这个时候,就可以定位到自己的位置了。

再来一个 poi 检索

POI(Point of Interest),中文可以翻译为“兴趣点”。在地理信息系统中,一个POI可以是一栋房子、一个商铺、一个邮筒、一个公交站等。

百度地图SDK提供三种类型的POI检索:周边检索、区域检索和城市内检索。下面将以周边检索为例,向大家介绍如何使用检索服务。

这是一个poi检索周围停车场的例子,检索成功后,还会添加大头针,这样才能看得见停车场。

#pragma mark ____________poi检索_______
- (void)initNearbySearchOption
{
{
//初始化检索对象
_searcher =[[BMKPoiSearch alloc]init];
_searcher.delegate = self;//不同时记得置空
//发起检索
BMKNearbySearchOption *option = [[BMKNearbySearchOption alloc]init];
//检索分页页码
option.pageIndex = 0;
//检索分页每页多少个
option.pageCapacity = 16;
//检索半径
option.radius = 500;
//检索中心    这种直接给坐标的写法,有助于封装
option.location = CLLocationCoordinate2DMake(_myUserLocation.location.coordinate.latitude, _myUserLocation.location.coordinate.longitude);
//检索关键字
option.keyword = @"停车场";
//发起检索
BOOL flag = [_searcher poiSearchNearBy:option];

if(flag)
{
NSLog(@"周边检索发送成功");
}
else
{
NSLog(@"周边检索发送失败");
}
}
}

//实现PoiSearchDeleage处理回调结果
- (void)onGetPoiResult:(BMKPoiSearch*)searcher result:(BMKPoiResult*)poiResultList errorCode:(BMKSearchErrorCode)error
{
if (error == BMK_SEARCH_NO_ERROR) {
//在此处理正常结果
NSLog(@"%@",poiResultList.poiInfoList);
for (BMKPoiDetailResult *result in poiResultList.poiInfoList)
{
//  创建一个大头针
BMKPointAnnotation* annotation = [[BMKPointAnnotation alloc]init];
//  大头针坐标
annotation.coordinate = CLLocationCoordinate2DMake(result.pt.latitude,result.pt.longitude);
//  添加大头针
[_mapView addAnnotation:annotation];
}

}
else if (error == BMK_SEARCH_AMBIGUOUS_KEYWORD){
//当在设置城市未找到结果,但在其他城市找到结果时,回调建议检索城市列表
// result.cityList;
NSLog(@"起始点有歧义");
} else {
NSLog(@"抱歉,未找到结果");
}
}


好了,地图其他的功能,自己研究去吧,再附上一个百度地图开发文档地址:

http://lbsyun.baidu.com/index.php?title=iossdk/guide/introduction

这是我的源码github地址:

https://github.com/wangjianchao1990/baidumap.git
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息