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

    Codeforce 613 A. Peter and Snow Blower 解析(思維.幾何) 今天我們來看看CF613A 題目連結 題目 給你一個點\(P\)和\(n\)個點形成的多邊形(照順或逆 ...

  2. drf 视图使用及源码分析

    前言 drf视图的源码非常的绕,但是实现的功能却非常的神奇. 它能够帮你快速的解决ORM增删改查的重复代码,非常的方便好用. 下面是它源码中的一句话: class ViewSetMixin: &quo ...

  3. 跟我一起学.NetCore之MediatR好像有点火

    前言 随着微服务的流行,而DDD(领域驱动设计)也光速般兴起,CRQS(Command Query Responsibility Seperation--命令查询职责分离).领域事件名词是不是经常在耳 ...

  4. jdk1.8特性2

    public class User { private Long id; private String userName; private String roleName; private Strin ...

  5. 4G DTU在使用时有哪些注意事项?

    4G DTU是用来帮助工业设备快速连接4G网络的设备.众山物联网研发.生产的LTE660正是这样一款功能强大的4G联网"利器". DTU是英文Data Transfer unit的 ...

  6. 使用 IDEA 查看 JDK8 源码

    使用 idea 查看 oracle jdk 8 源码时发现 Unsafe 没有源码. 解决方法: 到 openjdk-8 下载页面:http://jdk.java.net/java-se-ri/8-M ...

  7. STM32移植FreeRTOS(1)

    "STM32F103VET6<_>FreeRTOS" 1.项目功能实现 1)LED灯定时闪烁 2)KEY按键检测 3)FreeRTOS任务创建 4)串口输出程序运行状态 ...

  8. 01 . Go语言的SSH远程终端及WebSocket

    Crypto/ssh简介 使用 下载 go get "github.com/mitchellh/go-homedir" go get "golang.org/x/cryp ...

  9. 想学 iOS 开发高阶一点的东西,从何开始?

    前言 如果你正在学习 iOS, 或者正在从事IOS开发? 还是一个一个迷茫的待就业大学生,或是公司的到一个半老员工? 现在到了开发的一个阶段了,基本的东西很熟了,想着提高技术? 学习难一点的东西,不知 ...

  10. CentOS7下一键小白搭建seafile pro云盘

    搭建前准备工作 vps或者云服务器,个人搭建使用建议腾讯云,公司搭建使用建议阿里云. 没有服务器的小伙伴可以下面链接进入看下,腾讯云的配置带宽会比阿里云的好点. 阿里云新人优惠服务器 腾讯云云上特惠 ...