由于客户需求和我们的代码方便,把软件里的全部地图都使用百度地图;
随着百度SDK的升级,无论是地图的精确性还是信息的详细度几乎都能达到我们需求;
准备工作:需要申请密匙;百度地图iOS SDK开发密钥的申请地址为:http://lbsyun.baidu.com/apiconsole/key
加载百度地图SDK;下载地址为:http://developer.baidu.com/map/index.php?title=iossdk/sdkiosdev-download
下面开始使用地图:在appdelegate类里添加
- (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;
}
1.定位:
定位功能可以和地图功能分离使用,单独的定位功能使用方式如下:
-(void)viewDidLoad
{
//初始化BMKLocationService
_locService = [[BMKLocationService alloc]init];
_locService.delegate = self;
//启动LocationService
[_locService startUserLocationService];
}
//实现相关delegate 处理位置信息更新
//处理方向变更信息
- (void)didUpdateUserHeading:(BMKUserLocation *)userLocation
{
// NSLog(@"heading is %@",userLocation.heading);
}
//处理位置坐标更新
- (void)didUpdateUserLocation:(BMKUserLocation *)userLocation
{
// NSLog(@"didUpdateUserLocation lat %f,long %f",userLocation.location.coordinate.latitude,userLocation.location.coordinate.longitude);
}
展示定位信息
展示定位信息的功能位于“地图和覆盖物”这个功能模块,开发者在使用时要注意选择。核心代码如下:(完整信息请参考Demo)
//普通态
//以下_mapView为BMKMapView对象
_mapView.showsUserLocation = YES;//显示定位图层
[_mapView updateLocationData:userLocation];
2.地理编码
-(void)viewDidLoad
{
//初始化检索对象
_searcher =[[BMKGeoCodeSearch alloc]init];
_searcher.delegate = self;
BMKGeoCodeSearchOption *geoCodeSearchOption = [[BMKGeoCodeSearchOption alloc]init];
geoCodeSearchOption.city= @"北京市";
geocodeSearchOption.address = @"海淀区上地10街10号";
BOOL flag = [_searcher geoCode:geoCodeSearchOption];
[geoCodeSearchOption release];
if(flag)
{
NSLog(@"geo检索发送成功");
}
else
{
NSLog(@"geo检索发送失败");
}
//发起反向地理编码检索
//CLLocationCoordinate2D pt = (CLLocationCoordinate2D){39.915, 116.404};
//BMKReverseGeoCodeOption *reverseGeoCodeSearchOption = [[
//BMKReverseGeoCodeOption alloc]init];
//reverseGeoCodeSearchOption.reverseGeoPoint = pt;
//BOOL flag = [_searcher reverseGeoCode:reverseGeoCodeSearchOption];
//[reverseGeoCodeSearchOption release];
//if(flag)
//{
// NSLog(@"反geo检索发送成功");
//}
//else
//{
// NSLog(@"反geo检索发送失败");
//}
}
//实现Deleage处理回调结果
//接收正向编码结果
- (void)onGetGeoCodeResult:(BMKGeoCodeSearch *)searcher result:(BMKGeoCodeResult *)result errorCode:(BMKSearchErrorCode)error{
if (error == BMK_SEARCH_NO_ERROR) {
//在此处理正常结果
}
else {
NSLog(@"抱歉,未找到结果");
}
}
//接收反向地理编码结果
//-(void) onGetReverseGeoCodeResult:(BMKGeoCodeSearch *)searcher result:
//(BMKReverseGeoCodeResult *)result
//errorCode:(BMKSearchErrorCode)error{
// if (error == BMK_SEARCH_NO_ERROR) {
// 在此处理正常结果
// }
// else {
// NSLog(@"抱歉,未找到结果");
// }
//}
//不使用时将delegate设置为 nil
-(void)viewWillDisappear:(BOOL)animated
{
_searcher.delegate = nil;
}
3.POI检索 (兴趣点查询)
百度地图SDK提供三种类型的POI检索:周边检索、区域检索和城市内检索。下面将以周边检索为例,向大家介绍如何使用检索服务。
-(void)viewDidLoad
{
//初始化检索对象
_searcher =[[BMKPoiSearch alloc]init];
_searcher.delegate = self;
//发起检索
BMKNearbySearchOption *option = [[BMKNearbySearchOption alloc]init];
option.pageIndex = curPage;
option.pageCapacity = 10;
option.location = CLLocationCoordinate2D{39.915, 116.404};
option.keyword = @"小吃";
BOOL flag = [_searcher poiSearchNearBy:option];
[option release];
if(flag)
{
NSLog(@"周边检索发送成功");
}
else
{
NSLog(@"周边检索发送失败");
}
}
//实现PoiSearchDeleage处理回调结果
- (void)onGetPoiResult:(BMKPoiSearch*)searcher result:(BMKPoiResult*)poiResultList errorCode:(BMKSearchErrorCode)error
{
if (error == BMK_SEARCH_NO_ERROR) {
//在此处理正常结果
}
else if (error == BMK_SEARCH_AMBIGUOUS_KEYWORD){
//当在设置城市未找到结果,但在其他城市找到结果时,回调建议检索城市列表
// result.cityList;
NSLog(@"起始点有歧义");
} else {
NSLog(@"抱歉,未找到结果");
}
}
//不使用时将delegate设置为 nil
-(void)viewWillDisappear:(BOOL)animated
{
_searcher.delegate = nil;
}
以上向大家介绍了POI检索功能的使用方法,百度地图SDK,还向广大开发者开放了POI详情信息的检索,为开发者提供更多的LBS数据支持。
POI详情检索的实现方式如下:
第一步,发起检索:
//初始化检索服务
_poisearch = [[BMKPoiSearch alloc] init];
_poisearch.delegate = self;
//POI详情检索
BMKPoiDetailSearchOption* option = [[BMKPoiDetailSearchOption alloc] init];
option.poiUid = @”此处为POI的uid”;//POI搜索结果中获取的uid
BOOL flag = [_poisearch poiDetailSearch:option];
[option release];
if(flag)
{
//详情检索发起成功
}
else
{
//详情检索发送失败
}
第二步,设置结果监听:
-(void)onGetPoiDetailResult:(BMKPoiSearch *)searcher result:(BMKPoiDetailResult *)poiDetailResult errorCode:(BMKSearchErrorCode)errorCode
{
if(errorCode == BMK_SEARCH_NO_ERROR){
//在此处理正常结果
}
}
4.路径规划
百度地图iOS SDK为开发者提供了公交换乘、驾车和步行三种类型的线路规划方案,同时根据不同的方案还可以选择“时间最短”、“距离最短”等策略来完成最终的线路规划。开发者可根据自己实际的业务需求来自由使用。
公交换乘的线路规范实现方式如下:
-(void)viewDidLoad
{
//初始化检索对象
_searcher = [[BMKRouteSearch alloc]init];
_searcher.delegate = self;
//发起检索
BMKPlanNode* start = [[[BMKPlanNode alloc]init] autorelease];
start.name = @"龙泽";
BMKPlanNode* end = [[[BMKPlanNode alloc]init] autorelease];
end.name = "西单";
BMKTransitRoutePlanOption *transitRouteSearchOption = [[BMKTransitRoutePlanOption alloc]init];
transitRouteSearchOption.city= @"北京市";
transitRouteSearchOption.startNode = start;
transitRouteSearchOption.endNode = end;
BOOL flag = [_searcher transitSearch:transitRouteSearchOption];
[transitRouteSearchOption release];
if(flag)
{
NSLog(@"bus检索发送成功");
}
else
{
NSLog(@"bus检索发送失败");
}
}
//实现Deleage处理回调结果
-(void)onGetTransitRouteResult:(BMKRouteSearch*)searcher result: (BMKTransitRouteResult*)result
errorCode:(BMKSearchErrorCode)error
{
if (error == BMK_SEARCH_NO_ERROR) {
//在此处理正常结果
}
else if (error == BMK_SEARCH_AMBIGUOUS_ROURE_ADDR){
//当路线起终点有歧义时通,获取建议检索起终点
//result.routeAddrResult
}
else {
NSLog(@"抱歉,未找到结果");
}
}
//不使用时将delegate设置为 nil
-(void)viewWillDisappear:(BOOL)animated
{
_searcher.delegate = nil;
}
5.调启导航:
百度地图iOS SDK自v2.1.1版本起,为用户提供调启百度导航的能力。调启导航,分为两种:调启百度地图客户端导航和调启百度地图Web导航,用户只需很小的工作量,就可实现驾车路线导航的全套功能。
导航的核心代码如下,详细使用方法请参考Demo:
//调启百度地图客户端导航
- (IBAction)nativeNavi
{
//初始化调启导航时的参数管理类
BMKNaviPara* para = [[BMKNaviPara alloc]init];
//指定导航类型
para.naviType = BMK_NAVI_TYPE_NATIVE;
//初始化终点节点
BMKPlanNode* end = [[[BMKPlanNode alloc]init] autorelease];
//指定终点经纬度
CLLocationCoordinate2D coor2;
coor2.latitude = _nativeEndLatitude.text.floatValue;
coor2.longitude = _nativeEndLongitude.text.floatValue;
end.pt = coor2;
//指定终点名称
end.name = _nativeEndName.text;
//指定终点
para.endPoint = end;
//指定返回自定义scheme,具体定义方法请参考常见问题
para.appScheme = @"baidumapsdk://mapsdk.baidu.com";
//调启百度地图客户端导航
[BMKNavigation openBaiduMapNavigation:para];
[para release];
}
//调启web导航
- (IBAction)webNavi
{
//初始化调启导航时的参数管理类
BMKNaviPara* para = [[BMKNaviPara alloc]init];
//指定导航类型
para.naviType = BMK_NAVI_TYPE_WEB;
//初始化起点节点
BMKPlanNode* start = [[[BMKPlanNode alloc]init] autorelease];
//指定起点经纬度
CLLocationCoordinate2D coor1;
coor1.latitude = _webStartLatitude.text.floatValue;
coor1.longitude = _webStartLongitude.text.floatValue;
start.pt = coor1;
//指定起点名称
start.name = _webStartName.text;
//指定起点
para.startPoint = start;
//初始化终点节点
BMKPlanNode* end = [[[BMKPlanNode alloc]init] autorelease];
CLLocationCoordinate2D coor2;
coor2.latitude = _webEndLatitude.text.floatValue;
coor2.longitude = _webEndLongitude.text.floatValue;;
end.pt = coor2;
para.endPoint = end;
//指定终点名称
end.name = _webEndName.text;
//指定调启导航的app名称
para.appName = [NSString stringWithFormat:@"%@", @"testAppName"];
//调启web导航
[BMKNavigation openBaiduMapNavigation:para];
[para release];
}
效果图如下:
![]()
这些是我们常用的一些功能,大家可以参考百度地图demo;相关下载:http://developer.baidu.com/map/index.php?title=iossdk/sdkiosdev-download