最近仿照美团做了款应用,刚好用到百度地图,高德地图之前用的比较多,只是这个项目的后台服务器是另外一个公司做的,他们用的就是百度地图,现在网上用百度地图的还不算太多,博文也是断断续续的,主要是中间跳跃有点大,没有可运行的demo,看不到效果。纠结了好久,结合别人的总结和从百度官网上下载的demo,详细记录一下百度地图的使用过程,分享一下,也便于以后查阅使用。

  百度地图的使用和苹果一样,相对于高德地图来说规范了好多。直接将程序的bundle Identity和appkey值绑定,虽然刚开始用感觉有点不习惯,相信规范严谨对于国内的程序开发也算是一种引导吧。闲言少絮,下面开始百度地图的使用说明。

第一步:注册百度账号,申请appkey。直接上图片效果比较直接。,这里面有个小插曲,当初习惯性地将禁用服务ios地图sdk勾选上,做了无数次的测试一直不显示地图页面。纠结了好久,偶然间想到可能是appkey的问题,重新走了一遍,原来把禁用服务勾选上了,改过来就好了,做我们这行的严谨、认真还是很有必要地。

第二步:将百度地图sdk包添加到程序,在AppDelegate导入

#import<CoreLocation/CoreLocation.h>

#import "AGViewDelegate.h"

#import "BMapKit.h"

上述文件,添加如下委托和对象

@interface AppDelegate : UIResponder <UIApplicationDelegate,CLLocationManagerDelegate,BMKGeneralDelegate>

{

AGViewDelegate *_viewDelegate;//

BMKMapManager* _mapManager;//百度地图管理器

}

并在

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions中调用开启百度地图定位的方法

//地图

- (void)configureAPIKey

{

_mapManager = [[BMKMapManager alloc] init];

BOOL ret = [_mapManager start:@"appkey"generalDelegate:self];

if (ret)

{

NSLog(@"百度地图开启定位:");

}

}

第三步:百度地图视图和百度位置服务的使用

在使用地图的页面导入百度地图文件

#import "BMapKit.h"

添加

BMKMapViewDelegate,BMKLocationServiceDelegate委托对象

@property(nonatomic,retain)BMKMapView* baiduMapView;//地图视图

@property(nonatomic,retain)BMKLocationService* locationService;//百度地图定位服务对象

@synthesize baiduMapView;

@synthesize locationService;

当然不用的时候需要释放掉

if (baiduMapView)

{

[baiduMapView release];

baiduMapView = nil;

}

if (locationService)

{

[locationService release];

locationService = nil;

}

- (void)viewWillAppear:(BOOL)animated

{

[super viewWillAppear:animated];

baiduMapView.delegate = self;

locationService.delegate = self;

}

-(void)viewWillDisappear:(BOOL)animated

{

[baiduMapView viewWillDisappear];

baiduMapView.delegate = nil;

locationService.delegate = nil;

[super viewWillDisappear:animated];

}

当然在使用地图视图控件之前需要先开启百度地图的定位服务

//初始化定位服务对象

self.locationService = [[[BMKLocationService alloc]init]autorelease];

locationService.delegate=self;

//显示定位的蓝点儿必须先开启定位服务

[locationService startUserLocationService];

接下来就是地图视图控件使用了

self.baiduMapView = [[[BMKMapView alloc]initWithFrame:CGRectMake(0, 0, 320, 480)]autorelease];

//初始化百度地图对象

baiduMapView.delegate = self;

[baiduMapView setMapType:BMKMapTypeStandard];

baiduMapView.zoomLevel=17;//地图级别

//显示定位的蓝点儿必须先开启定位服务

[locationService startUserLocationService];

[baiduMapView setShowsUserLocation:NO];

baiduMapView.userTrackingMode=BMKUserTrackingModeNone;//地图模式

[baiduMapView setShowsUserLocation:YES];//显示定位的蓝点儿

coordinate.latitude = [XtomFunction xfuncGetAppdelegate].currentLocation.coordinate.latitude;//纬度

coordinate.longitude = [XtomFunction xfuncGetAppdelegate].currentLocation.coordinate.longitude;//经度

BMKCoordinateRegion viewRegion = BMKCoordinateRegionMake(coordinate, BMKCoordinateSpanMake(0.3,0.3));

BMKCoordinateRegion adjustedRegion = [baiduMapView regionThatFits:viewRegion];

[baiduMapView setRegion:adjustedRegion animated:YES];

到这里已经可以展示地图信息数据了,当然一些复杂的东西需要下面的委托实现

第四步:百度地图中常用委托方法的使用

/**

*用户方向更新后,会调用此函数

*@param userLocation 新的用户位置

*/

- (void)didUpdateUserHeading:(BMKUserLocation *)userLocation

{

[baiduMapView updateLocationData:userLocation];

NSLog(@"heading is %@,%f,%f,%f,%f,%f,%f",userLocation.heading,userLocation.location.coordinate.latitude,userLocation.location.coordinate.longitude,localLatitude,localLongitude,coordinate.latitude,coordinate.longitude);

NSLog(@"dingweifuwu:%f,%f",locationService.userLocation.location.coordinate.latitude,locationService.userLocation.location.coordinate.longitude);

NSLog(@"dangqian:%f,%f",locationService.userLocation.location.coordinate.latitude,locationService.userLocation.location.coordinate.longitude);

/*

//改变成百度经纬度

AppDelegate *myDelegate = [XtomFunction xfuncGetAppdelegate];

myDelegate.currentLocation = userLocation.location;

myDelegate.myCoordinate=CLLocationCoordinate2DMake(userLocation.location.coordinate.latitude, userLocation.location.coordinate.longitude);*/

}

//开始缩放委托

- (void)mapView:(BMKMapView *)mapView regionWillChangeAnimated:(BOOL)animated;

{

NSString* showmeg = [NSString stringWithFormat:@"地图区域发生了变化(x=%d,y=%d,\r\nwidth=%d,height=%d).\r\nZoomLevel=%d;RotateAngle=%d;OverlookAngle=%d",(int)baiduMapView.visibleMapRect.origin.x,(int)baiduMapView.visibleMapRect.origin.y,(int)baiduMapView.visibleMapRect.size.width,(int)baiduMapView.visibleMapRect.size.height,(int)baiduMapView.zoomLevel,baiduMapView.rotation,baiduMapView.overlooking];

NSLog(@"gesturescale:%@",showmeg);

CLLocationCoordinate2D firstLocation=[baiduMapView convertPoint:CGPointMake(0, 0) toCoordinateFromView:baiduMapView];

CLLocationCoordinate2D secondLocation=[baiduMapView convertPoint:CGPointMake(0, UI_View_Hieght+64) toCoordinateFromView:baiduMapView];

distance=[XtomFunction distanceBetweenOrderBy:firstLocation.latitude :firstLocation.longitude :secondLocation.latitude :secondLocation.longitude]/2;

//第一次获取数据的时候不加载

if (isFirstLoad)

{

localLatitude=baiduMapView.centerCoordinate.latitude;

localLongitude=baiduMapView.centerCoordinate.longitude;

//重新获取数据

[self requestGetLocationList];

}

}

//原理类似 UITableView 循环委托加载 CellforRowWithIndexPath

- (BMKAnnotationView *)mapView:(BMKMapView *)view viewForAnnotation:(id <BMKAnnotation>)annotation

{

//商家详情

if (isShangjia)

{

if ([annotation isKindOfClass:[BMKPointAnnotation class]])

{

// 生成重用标示identifier

NSString *AnnotationViewID = @"shangjia";

// 检查是否有重用的缓存

BMKAnnotationView* annotationView = [baiduMapView dequeueReusableAnnotationViewWithIdentifier:AnnotationViewID];

// 缓存没有命中,自己构造一个,一般首次添加annotation代码会运行到此处

if (annotationView == nil)

{ annotationView = [[BMKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:AnnotationViewID]; ((BMKPinAnnotationView*)annotationView).pinColor = BMKPinAnnotationColorRed;

// 设置重天上掉下的效果(annotation)

((BMKPinAnnotationView*)annotationView).animatesDrop = YES; }

// 设置位置

annotationView.centerOffset = CGPointMake(0, -(annotationView.frame.size.height * 0.5)); annotationView.annotation = annotation;

// 单击弹出泡泡,弹出泡泡前提annotation必须实现title属性

annotationView.canShowCallout = YES;

//美食

if ([activityType isEqualToString:@"美食"])

{

annotationView.image=[UIImage imageNamed:@"美食图标.png"];

}

//丽人

else if ([activityType isEqualToString:@"丽人"])

{

annotationView.image=[UIImage imageNamed:@"丽人图标.png"];

}

//生活服务

else if ([activityType isEqualToString:@"生活服务"])

{

annotationView.image=[UIImage imageNamed:@"生活服务图标.png"];

}

//休闲娱乐

else if ([activityType isEqualToString:@"休闲娱乐"])

{

annotationView.image=[UIImage imageNamed:@"休闲娱乐图标.png"];

}

//旅游

else if ([activityType isEqualToString:@"旅游"])

{

annotationView.image=[UIImage imageNamed:@"旅游图标.png"];

}

//购物

else if ([activityType isEqualToString:@"购物"])

{

annotationView.image=[UIImage imageNamed:@"购物图标.png"];

}

//酒店

else if ([activityType isEqualToString:@"酒店"])

{

annotationView.image=[UIImage imageNamed:@"酒店图标.png"];

}

//今日订单

else if ([activityType isEqualToString:@"今日订单"])

{

annotationView.image=[UIImage imageNamed:@"今日订单图标.png"];

}

//annotationView.image=[UIImage imageNamed:@"丽人图标.png"];

// 设置是否可以拖拽

annotationView.draggable = NO;

return annotationView;

/*

BMKPinAnnotationView *newAnnotationView = [[BMKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"myAnnotation"];

newAnnotationView.pinColor = BMKPinAnnotationColorPurple;

newAnnotationView.animatesDrop = YES;// 设置该标注点动画显示

newAnnotationView.annotation=annotation;

newAnnotationView.image = [UIImage imageNamed:@"丽人图标.png"];   //把大头针换成别的图片

return newAnnotationView;*/

}

}

else if (isLuxian)

{

if ([annotation isKindOfClass:[RouteAnnotation class]])

{

return [self getRouteAnnotationView:view viewForAnnotation:(RouteAnnotation*)annotation];

}

return nil;

}

}

这里介绍一下百度地图中常见的两个点,花费了我好长的时间总结出来的,分享一下吧。比如获取百度地图中当前的位置,可以在开启百度位置服务,走完

- (void)didUpdateUserHeading:(BMKUserLocation *)userLocation委托方法后,通过

locationService.userLocation.location.coordinate获得

再比如 想获取当前地图的中心点的经纬度 可以这样获得baiduMapView.centerCoordinate 还有百度地图中坐标点和地图中经纬度的转换

CLLocationCoordinate2D firstLocation=[baiduMapView convertPoint:CGPointMake(0, 0) toCoordinateFromView:baiduMapView];这个是远点的经纬度

第四步:自定义标注的添加

//添加大头钉

BMKPointAnnotation* annotation = [[BMKPointAnnotation alloc]init];

CLLocationCoordinate2D coor;

coor.latitude = localLatitude;

coor.longitude = localLongitude;

annotation.coordinate = coor;

//annotation.title = @"这里是北京";

[baiduMapView addAnnotation:annotation];

结合

//原理类似 UITableView 循环委托加载 CellforRowWithIndexPath

- (BMKAnnotationView *)mapView:(BMKMapView *)view viewForAnnotation:(id <BMKAnnotation>)annotation委托方法实现,当然还有个获取选中哪个大头钉或者标注点的委托方法

//当选中一个annotation views时,调用此接口

- (void)mapView:(BMKMapView *)mapView didSelectAnnotationView:(CustomAnnotationView *)view

{

//只展示首页的大头钉

if (isLuxian||isShangjia)

{

return;

}

//获取点击视图的区域

CLLocationCoordinate2D leftTopLocation=[baiduMapView convertPoint:CGPointMake(view.frame.origin.x, view.frame.origin.y) toCoordinateFromView:baiduMapView];

CLLocationCoordinate2D rightDownLocation=[baiduMapView convertPoint:CGPointMake(view.frame.origin.x+view.frame.size.width, view.frame.origin.y+view.frame.size.height) toCoordinateFromView:baiduMapView];

//临时数组

NSMutableArray *tempArray=[[[NSMutableArray alloc]init]autorelease];

for (int i = 0; i<detailData.count; i++)

{

NSMutableDictionary *dict = [[[NSMutableDictionary alloc] init] autorelease];

NSDictionary *temDict = [detailData objectAtIndex:i];

for(NSString *key in temDict.allKeys)

{

NSString *value = [temDict objectForKey:key];

if(![XtomFunction xfunc_check_strEmpty:value])

{

[dict setObject:value forKey:key];

}

}

//纬度

float tempLat=[[temDict objectForKey:@"lat"]floatValue];

//经度

float tempLng=[[temDict objectForKey:@"lng"]floatValue];

NSLog(@"jingweidu:%f,%f,%f,%f,%f,%f",leftTopLocation.latitude,leftTopLocation.longitude,rightDownLocation.latitude,rightDownLocation.longitude,tempLat,tempLng);

//获取该区域下的数据

if (tempLat >=rightDownLocation.latitude&&tempLat <=leftTopLocation.latitude&&tempLng >=leftTopLocation.longitude&&tempLng <=rightDownLocation.longitude)

{

[tempArray addObject:temDict];

}

}

NSLog(@"shuzu:%@",tempArray);

[view.superview insertSubview:view atIndex:1000];

view.temArr=tempArray;

view.biaozhu.dataSource=tempArray;

[view loadTableData];

[view retain];

}也一并分享一下吧。

第五步:百度地图中公交线路信息的获取和公交路线的绘制

公交、地铁、汽车、步行这几个是常见的东西这个比较麻烦一些,感兴趣的可以去百度地图的demo中查询,我给出链接吧。http://download.csdn.net/detail/kuuailetianzi/7907889 至此,百度地图的使用介绍的差不多了,我也该休息休息了。

iOS 百度地图使用详解的更多相关文章

  1. iOS原生地图开发详解

    在上一篇博客中:http://my.oschina.net/u/2340880/blog/414760.对iOS中的定位服务进行了详细的介绍与参数说明,在开发中,地位服务往往与地图框架结合使用,这篇博 ...

  2. 百度地图API详解之事件机制,function“闭包”解决for循环和监听器冲突的问题:

    原文:百度地图API详解之事件机制,function"闭包"解决for循环和监听器冲突的问题: 百度地图API详解之事件机制 2011年07月26日 星期二 下午 04:06 和D ...

  3. [转]百度地图API详解之地图坐标系统

    博客原文地址:http://www.jiazhengblog.com/blog/2011/07/02/289/ 我们都知道地球是圆的,电脑显示器是平的,要想让位于球面的形状显示在平面的显示器上就必然需 ...

  4. 百度地图API详解之自定义地图类型

    http://blog.csdn.net/sup_heaven/article/details/8461586 今天的文章主要介绍如何利用地图API实现自定义地图. 百度地图API目前默认支持两种地图 ...

  5. 百度地图Api详解之地图标注

    标注概述 标注(Marker)是用来表示一个点位置的可见元素,每个标注自身都包含地理信息.比如你在西单商场位置添加了一个标注,不论地图移动.缩放,标注都会跟随一起移动,保证其始终指向正确的地理位置. ...

  6. iOS百度地图简单使用详解

    iOS百度地图简单使用详解 百度地图 iOS SDK是一套基于iOS 5.0及以上版本设备的应用程序接口,不仅提供展示地图的基本接口,还提供POI检索.路径规划.地图标注.离线地图.定位.周边雷达等丰 ...

  7. iOS百度地图SDK集成详细步骤

    1.iOS百度地图下载地址 http://developer.baidu.com/map/index.php?title=iossdk/sdkiosdev-download 根据需要选择不同的版本  ...

  8. iOS 单元测试之XCTest详解(一)

    iOS 单元测试之XCTest详解(一) http://blog.csdn.net/hello_hwc/article/details/46671053 原创blog,转载请注明出处 blog.csd ...

  9. iOS学习之UINavigationController详解与使用(一)添加UIBarButtonItem

    http://blog.csdn.net/totogo2010/article/details/7681879 1.UINavigationController导航控制器如何使用 UINavigati ...

随机推荐

  1. 【5】TensorFlow光速入门-图片分类完整代码

    本文地址:https://www.cnblogs.com/tujia/p/13862364.html 系列文章: [0]TensorFlow光速入门-序 [1]TensorFlow光速入门-tenso ...

  2. MySQL全面瓦解2:常用命令和系统管理

    常用命令 打开CMD命令窗口(记住使用管理员身份运行),我们就可以在命令窗口中做一些MySQL的命令操作了: 服务启动和关闭 这个我们上一个章节使用过了:net start mysql,这是服务命令, ...

  3. js 小数点失精度

    解决方法思路:将小数化成整数后再作运算.具体代码如下:  /*** 加法运算,避免数据相加小数点后产生多位数和计算精度损失.** @param num1加数1 | num2加数2*/function ...

  4. D. Road to Post Office 解析(思維)

    Codeforce 702 D. Road to Post Office 解析(思維) 今天我們來看看CF702D 題目連結 題目 略,請直接看原題. 前言 原本想說會不會也是要列式子解或者二分搜,沒 ...

  5. 10万用户一年365天的登录情况如何用redis存储,并快速检索任意时间窗内的活跃用户

    1.redsi的bitmap数据结构介绍 bitmap本质上是一个string类型,只是他操作的是string的某个位是0还是1. setbit和getbit 两条命令是对字符串的位操作.每个位只能是 ...

  6. MySQL日期函数与日期转换格式化函数大全

    Mysql作为一款开元的免费关系型数据库,用户基础非常庞大,本文列出了MYSQL常用日期函数与日期转换格式化函数 1.DAYOFWEEK(date) 1 2 SELECT DAYOFWEEK('201 ...

  7. 【SpringBoot】03.SpringBoot整合Servlet的两种方式

    SpringBoot整合Servlet的两种方式: 1. 通过注解扫描完成Servlet组件注册 新建Servlet类继承HttpServlet 重写超类doGet方法 在该类使用注解@WebServ ...

  8. Java--关于cpu占用解决方案

    关于cpu占用高的解决方案--java篇 通俗一点:找到进程,找到下面的线程,找到线程正在做的事,分析线程正在做的事. 一.查看cpu占用高的进程 top命令可以查看(假设%cpu已经属于很高了,我们 ...

  9. 腾讯云--对象存储cos绑定自定义域名

    1.登录腾讯云控制台,找到对象存储一栏 2.选择一个你想绑定域名的存储桶 3.进入你选择的存储桶,点击域名管理 4.选择自定义源站域名.在域名处填写你要设置的自定义域名,在源站类型处选择静态网站源站, ...

  10. 执行 yarn init报错,如何解决?

    安装yarn以后执行yarn init 命令来初始化项目 报错如下所示: 解决方法: 1.先用npm init初始化项目 在初始化的最后一步 is this ok(yes)? 输入yes回车后,可能会 ...