iOS 百度地图使用详解
最近仿照美团做了款应用,刚好用到百度地图,高德地图之前用的比较多,只是这个项目的后台服务器是另外一个公司做的,他们用的就是百度地图,现在网上用百度地图的还不算太多,博文也是断断续续的,主要是中间跳跃有点大,没有可运行的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 百度地图使用详解的更多相关文章
- iOS原生地图开发详解
在上一篇博客中:http://my.oschina.net/u/2340880/blog/414760.对iOS中的定位服务进行了详细的介绍与参数说明,在开发中,地位服务往往与地图框架结合使用,这篇博 ...
- 百度地图API详解之事件机制,function“闭包”解决for循环和监听器冲突的问题:
原文:百度地图API详解之事件机制,function"闭包"解决for循环和监听器冲突的问题: 百度地图API详解之事件机制 2011年07月26日 星期二 下午 04:06 和D ...
- [转]百度地图API详解之地图坐标系统
博客原文地址:http://www.jiazhengblog.com/blog/2011/07/02/289/ 我们都知道地球是圆的,电脑显示器是平的,要想让位于球面的形状显示在平面的显示器上就必然需 ...
- 百度地图API详解之自定义地图类型
http://blog.csdn.net/sup_heaven/article/details/8461586 今天的文章主要介绍如何利用地图API实现自定义地图. 百度地图API目前默认支持两种地图 ...
- 百度地图Api详解之地图标注
标注概述 标注(Marker)是用来表示一个点位置的可见元素,每个标注自身都包含地理信息.比如你在西单商场位置添加了一个标注,不论地图移动.缩放,标注都会跟随一起移动,保证其始终指向正确的地理位置. ...
- iOS百度地图简单使用详解
iOS百度地图简单使用详解 百度地图 iOS SDK是一套基于iOS 5.0及以上版本设备的应用程序接口,不仅提供展示地图的基本接口,还提供POI检索.路径规划.地图标注.离线地图.定位.周边雷达等丰 ...
- iOS百度地图SDK集成详细步骤
1.iOS百度地图下载地址 http://developer.baidu.com/map/index.php?title=iossdk/sdkiosdev-download 根据需要选择不同的版本 ...
- iOS 单元测试之XCTest详解(一)
iOS 单元测试之XCTest详解(一) http://blog.csdn.net/hello_hwc/article/details/46671053 原创blog,转载请注明出处 blog.csd ...
- iOS学习之UINavigationController详解与使用(一)添加UIBarButtonItem
http://blog.csdn.net/totogo2010/article/details/7681879 1.UINavigationController导航控制器如何使用 UINavigati ...
随机推荐
- Redis学习笔记(六)——数据结构之Set
一.介绍 Redis的Set是string类型的无序集合.集合成员是唯一的,这就意味着集合中不能出现重复的数据. Redis中集合是通过哈希表实现的,所以添加.删除.查找的复杂度都是O(1). 集合中 ...
- mysql自动化建表脚本
主脚本 配置文件 执行结果 主脚本内容 由于在awk中用常规方法无法转译单引号,所以用了单引号的八进制编码进行转译代替\047 等价于 ' [root@hadoop01 data]# cat crea ...
- 【应用服务 App Service】App Service证书导入,使用Key Vault中的证书
问题描述 正常情况下,如果需要为应用服务安装SSL证书,可以在证书准备好的情况,通过门户上传即可,详细步骤可以参考微软官方文档(在 Azure 应用服务中添加 TLS/SSL 证书:https://d ...
- 【转】Setting up SDL 2 on Visual Studio 2019 Community
FROM: http://lazyfoo.net/tutorials/SDL/01_hello_SDL/windows/msvc2019/index.php Setting up SDL 2 on V ...
- 配置kuernetes集群pod拉取私有镜像仓库中的镜像
目录 1 背景说明 2 实现方法 3 具体实现 配置镜像仓库项目为公开类型(任何人可以访问) 配置docker-registry类型的secret(pod使用secret获取镜像认证) 通过账户名密码 ...
- APIO2008免费道路
题目大意 给定一张n个点m条边的图,图上有两种边,求保证有k条第一种边的情况下的最小生成树 传送门 题解 考虑最小生成树kruskal算法 先找到不含限制的最小生成树,然后就可以知道哪些第一种边是必选 ...
- 华为hcip学习备考心得
大家好我是林中鸟,经过几个月的学习终于顺利拿下了华为的hcip:写这篇文章主要目的是想和大家分享一下我学习备考中的一些经历. 2020年由于疫情影响,社会各行各业都遭受重创,同时也打乱的我的生活规划: ...
- Linux 网络编程的5种IO模型:信号驱动IO模型
Linux 网络编程的5种IO模型:信号驱动IO模型 背景 上一讲 Linux 网络编程的5种IO模型:多路复用(select/poll/epoll) 我们讲解了多路复用等方面的知识,以及有关例程. ...
- LWJGL3的内存管理,简介及目录
LWJGL3的内存管理,简介及目录 LWJGL3 (Lightweight Java Game Library 3),是一个支持OpenGL,OpenAl,Opengl ES,Vulkan等的Java ...
- CF957D Riverside Curio
dp+预处理 dp[i]表示第i天时的水位线有多少条, 然后你会发现这个dp是有后效性的,当第i天的m[i]>dp[i-1]时就要修改之前的dp值 因此我们预处理出每一天的至少要多少条水位线,记 ...