最近仿照美团做了款应用,刚好用到百度地图,高德地图之前用的比较多,只是这个项目的后台服务器是另外一个公司做的,他们用的就是百度地图,现在网上用百度地图的还不算太多,博文也是断断续续的,主要是中间跳跃有点大,没有可运行的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. SQL注入的一些学习

    -------------------------------------- 这是我之前发布到的其他的一个网址,这里的话我重新总结 可能分很多,我也不是很清楚,只是皮毛的研究了一下 1,sql按数据库 ...

  2. 爬虫双色球所有的历史数据并保存到SQLite

    前言 上一篇介绍了双色球走势图是怎么实现的,这一篇介绍怎么实现爬虫所有的双色球历史数据,也可以同步分享怎么同步福彩3D数据.采用的C#来实现的. 同步双色球的地址:https://datachart. ...

  3. Java之HttpClient调用WebService接口发送短信源码实战

    摘要 Java之HttpClient调用WebService接口发送短信源码实战 一:接口文档 二:WSDL 三:HttpClient方法 HttpClient方法一 HttpClient方法二 Ht ...

  4. Spark性能调优的方法

    原则一:避免创建重复的RDD 通常来说,我们在开发一个Spark作业时,首先是基于某个数据源(比如Hive表或HDFS文件)创建一个初始的RDD:接着对这个RDD执行某个算子操作,然后得到下一个RDD ...

  5. C语言基础-C简介

    C语言简介  C 语言是一种通用的高级语言,最初是由丹尼斯·里奇在贝尔实验室为开发 UNIX 操作系统而设计的.C 语言最开始是于 1972 年在 DEC PDP-11 计算机上被首次实现. 在 19 ...

  6. 微信小程序授权页面

    这里也是比较简单的 直接复制粘贴就可以用,可能图片位置不对.. <template> <view id="imporwer"> <image src= ...

  7. CF1413C Perform Easily 题解

    毒瘤C题,考场卡我1个小时 首先,这道题难点在哪里?它的最大值与最小值都是浮动的. 怎么办?把最小/最大值固定! 以把最小值固定为例,我们枚举每个音符,并枚举它使用哪条琴弦,将它此时的位置强制其作为最 ...

  8. 转载-Java匿名内部类

    作者: chenssy 出处: http://www.cnblogs.com/chenssy/ 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接, ...

  9. day87:luffy:结算页面积分&支付宝接口

    目录 1.积分 2.支付 1.积分 1.关于积分的表结构 1.在user表中添加credit字段 + 设计一个积分的表结构 user/models.py class User(AbstractUser ...

  10. Pytest学习(六) - conftest.py结合接口自动化的举例使用

    一.conftest.py作用 可以理解成存放fixture的配置文件 二.conftest.py配置fixture注意事项 pytest会默认读取conftest.py里面的所有fixture co ...