版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
【移动应用开发技术】iOS百度地图使用详解
最近仿照美团做了款应用,刚好用到百度地图,高德地图之前用的比较多,只是这个项目的后台服务器是另外一个公司做的,他们用的就是百度地图,现在网上用百度地图的还不算太多,博文也是断断续续的,主要是中间跳跃有点大,没有可运行的demo,看不到效果。纠结了好久,结合别人的总结和从百度官网上下载的demo,详细记录一下百度地图的使用过程,分享一下,也便于以后查阅使用。百度地图的使用和苹果一样,相对于高德地图来说规范了好多。直接将程序的bundleIdentity和appkey值绑定,虽然刚开始用感觉有点不习惯,相信规范严谨对于国内的程序开发也算是一种引导吧。闲言少絮,下面开始百度地图的使用说明。第一步:注册百度账号,申请appkey。直接上图片效果比较直接。,这里面有个小插曲,当初习惯性地将禁用服务ios地图sdk勾选上,做了无数次的测试一直不显示地图页面。纠结了好久,偶然间想到可能是appkey的问题,重新走了一遍,原来把禁用服务勾选上了,改过来就好了,做我们这行的严谨、认真还是很有必要地。第二步:将百度地图sdk包添加到程序,在AppDelegate导入#import<CoreLocation/CoreLocation.h>
#import"AGViewDelegate.h"
#import"BMapKit.h"上述文件,添加如下委托和对象@interfaceAppDelegate:UIResponder<UIApplicationDelegate,CLLocationManagerDelegate,BMKGeneralDelegate>{
AGViewDelegate*_viewDelegate;//
BMKMapManager*_mapManager;//百度地图管理器
}并在-(BOOL)application:(UIApplication*)applicationdidFinishLaunchingWithOptions:(NSDictionary*)launchOptions中调用开启百度地图定位的方法//地图-(void)configureAPIKey{
_mapManager=[[BMKMapManageralloc]init];
BOOLret=[_mapManagerstart:@"appkey"generalDelegate:self];
if(ret)
{
NSLog(@"百度地图开启定位:");
}}第三步:百度地图视图和百度位置服务的使用在使用地图的页面导入百度地图文件#import"BMapKit.h"添加BMKMapViewDelegate,BMKLocationServiceDelegate委托对象@property(nonatomic,retain)BMKMapView*baiduMapView;//地图视图@property(nonatomic,retain)BMKLocationService*locationService;//百度地图定位服务对象@synthesizebaiduMapView;@synthesizelocationService;当然不用的时候需要释放掉if(baiduMapView)
{
[baiduMapViewrelease];
baiduMapView=nil;
}
if(locationService)
{
[locationServicerelease];
locationService=nil;
}-(void)viewWillAppear:(BOOL)animated{
[superviewWillAppear:animated];
baiduMapView.delegate=self;
locationService.delegate=self;}-(void)viewWillDisappear:(BOOL)animated{
[baiduMapViewviewWillDisappear];baiduMapView.delegate=nil;
locationService.delegate=nil;
[superviewWillDisappear:animated];}当然在使用地图视图控件之前需要先开启百度地图的定位服务//初始化定位服务对象
self.locationService=[[[BMKLocationServicealloc]init]autorelease];
locationService.delegate=self;//显示定位的蓝点儿必须先开启定位服务
[locationServicestartUserLocationService];
接下来就是地图视图控件使用了
self.baiduMapView=[[[BMKMapViewalloc]initWithFrame:CGRectMake(0,0,320,480)]autorelease];
//初始化百度地图对象
baiduMapView.delegate=self;
[baiduMapViewsetMapType:BMKMapTypeStandard];
baiduMapView.zoomLevel=17;//地图级别
//显示定位的蓝点儿必须先开启定位服务
[locationServicestartUserLocationService];
[baiduMapViewsetShowsUserLocation:NO];
baiduMapView.userTrackingMode=BMKUserTrackingModeNone;//地图模式
[baiduMapViewsetShowsUserLocation:YES];//显示定位的蓝点儿
coordinate.latitude=[XtomFunctionxfuncGetAppdelegate].currentLocation.coordinate.latitude;//纬度
coordinate.longitude=[XtomFunctionxfuncGetAppdelegate].currentLocation.coordinate.longitude;//经度
BMKCoordinateRegionviewRegion=BMKCoordinateRegionMake(coordinate,BMKCoordinateSpanMake(0.3,0.3));
BMKCoordinateRegionadjustedRegion=[baiduMapViewregionThatFits:viewRegion];
[baiduMapViewsetRegion:adjustedRegionanimated:YES];到这里已经可以展示地图信息数据了,当然一些复杂的东西需要下面的委托实现第四步:百度地图中常用委托方法的使用/**
*用户方向更新后,会调用此函数
*@paramuserLocation新的用户位置
*/-(void)didUpdateUserHeading:(BMKUserLocation*)userLocation{
[baiduMapViewupdateLocationData:userLocation];
NSLog(@"headingis%@,%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=[XtomFunctionxfuncGetAppdelegate];
myDelegate.currentLocation=userLocation.location;
myDelegate.myCoordinate=CLLocationCoordinate2DMake(userLocation.location.coordinate.latitude,userLocation.location.coordinate.longitude);*/}//开始缩放委托-(void)mapView:(BMKMapView*)mapViewregionWillChangeAnimated:(BOOL)animated;{
NSString*showmeg=[NSStringstringWithFormat:@"地图区域发生了变化(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);
CLLocationCoordinate2DfirstLocation=[baiduMapViewconvertPoint:CGPointMake(0,0)toCoordinateFromView:baiduMapView];
CLLocationCoordinate2DsecondLocation=[baiduMapViewconvertPoint:CGPointMake(0,UI_View_Hieght+64)toCoordinateFromView:baiduMapView];
distance=[XtomFunctiondistanceBetweenOrderBy:firstLocation.latitude:firstLocation.longitude:secondLocation.latitude:secondLocation.longitude]/2;
//第一次获取数据的时候不加载
if(isFirstLoad)
{
localLatitude=baiduMapView.centerCoordinate.latitude;
localLongitude=baiduMapView.centerCoordinate.longitude;
//重新获取数据
[selfrequestGetLocationList];
}
}
//原理类似UITableView循环委托加载CellforRowWithIndexPath-(BMKAnnotationView*)mapView:(BMKMapView*)viewviewForAnnotation:(id<BMKAnnotation>)annotation{
//商家详情
if(isShangjia)
{
if([annotationisKindOfClass:[BMKPointAnnotationclass]])
{
//生成重用标示identifier
NSString*AnnotationViewID=@"shangjia";
//检查是否有重用的缓存
BMKAnnotationView*annotationView=[baiduMapViewdequeueReusableAnnotationViewWithIdentifier:AnnotationViewID];
//缓存没有命中,自己构造一个,一般首次添加annotation代码会运行到此处
if(annotationView==nil)
{
annotationView=[[BMKPinAnnotationViewalloc]initWithAnnotation:annotationreuseIdentifier: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([activityTypeisEqualToString:@"美食"])
{
annotationView.p_w_picpath=[UIImagep_w_picpathNamed:@"美食图标.png"];
}
//丽人
elseif([activityTypeisEqualToString:@"丽人"])
{
annotationView.p_w_picpath=[UIImagep_w_picpathNamed:@"丽人图标.png"];
}
//生活服务
elseif([activityTypeisEqualToString:@"生活服务"])
{
annotationView.p_w_picpath=[UIImagep_w_picpathNamed:@"生活服务图标.png"];
}
//休闲娱乐
elseif([activityTypeisEqualToString:@"休闲娱乐"])
{
annotationView.p_w_picpath=[UIImagep_w_picpathNamed:@"休闲娱乐图标.png"];
}
//旅游
elseif([activityTypeisEqualToString:@"旅游"])
{
annotationView.p_w_picpath=[UIImagep_w_picpathNamed:@"旅游图标.png"];
}
//购物
elseif([activityTypeisEqualToString:@"购物"])
{
annotationView.p_w_picpath=[UIImagep_w_picpathNamed:@"购物图标.png"];
}
//酒店
elseif([activityTypeisEqualToString:@"酒店"])
{
annotationView.p_w_picpath=[UIImagep_w_picpathNamed:@"酒店图标.png"];
}
//今日订单
elseif([activityTypeisEqualToString:@"今日订单"])
{
annotationView.p_w_picpath=[UIImagep_w_picpathNamed:@"今日订单图标.png"];
}
//annotationView.p_w_picpath=[UIImagep_w_picpathNamed:@"丽人图标.png"];
//设置是否可以拖拽
annotationView.draggable=NO;
returnannotationView;
/*
BMKPinAnnotationView*newAnnotationView=[[BMKPinAnnotationViewalloc]initWithAnnotation:annotationreuseIdentifier:@"myAnnotation"];
newAnnotationView.pinColor=BMKPinAnnotationColorPurple;
newAnnotationView.animatesDrop=YES;//设置该标注点动画显示
newAnnotationView.annotation=annotation;
newAnnotationView.p_w_picpath=[UIImagep_w_picpathNamed:@"丽人图标.png"];
//把大头针换成别的图片
returnnewAnnotationView;*/
}
}
elseif(isLuxian)
{
if([annotationisKindOfClass:[RouteAnnotationclass]])
{
return[selfgetRouteAnnotationView:viewviewForAnnotation:(RouteAnnotation*)annotation];
}
returnnil;
}}这里介绍一下百度地图中常见的两个点,花费了我好长的时间总结出来的,分享一下吧。比如获取百度地图中当前的位置,可以在开启百度位置服务,走完-(void)didUpdateUserHeading:(BMKUserLocation*)userLocation委托方法后,通过locationService.userLocation.location.coordinate获得
再比如想获取当前地图的中心点的经纬度可以这样获得baiduMapView.centerCoordinate还有百度地图中坐标点和地图中经纬度的转换CLLocationCoordinate2DfirstLocation=[baiduMapViewconvertPoint:CGPointMake(0,0)toCoordinateFromView:baiduMapView];这个是远点的经纬度第四步:自定义标注的添加//添加大头钉
BMKPointAnnotation*annotation=[[BMKPointAnnotationalloc]init];
CLLocationCoordinate2Dcoor;
coor.latitude=localLatitude;
coor.longitude=localLongitude;
annotation.coordinate=coor;
//annotation.title=@"这里是北京";
[baiduMapViewaddAnnotation:annotation];结合//原理类似UITableView循环委托加载CellforRowWithIndexPath-(BMKAnnotationView*)mapView:(BMKMapView*)viewviewForAnnotation:(id<BMKAnnotation>)annotation委托方法实现,当然还有个获取选中哪个大头钉或者标注点的委托方法//当选中一个annotationviews时,调用此接口-(void)mapView:(BMKMapView*)mapViewdidSelectAnnotationView:(CustomAnnotationView*)view{
//只展示首页的大头钉
if(isLuxian||isShangjia)
{
return;
}
//获取点击视图的区域
CLLocationCoordinate2DleftTopLocation=[baiduMapViewconvertPoint:CGPointMake(view.frame.origin.x,view.frame.origin.y)toCoordinateFromView:baiduMapView];
CLLocationCoordinate2DrightDownLocation=[baiduMapViewconvertPoint:CGPointMake(view.frame.origin.x+view.frame.size.width,view.frame.origin.y+view.frame.size.height)toCoordinateFromView:baiduMapView];
//临时数组
NSMutableArray*tempArray=[[[NSMutableArrayalloc]init]autorelease];
for(inti=0;i<detailData.count;i++)
{
NSMutableDictionary*dict=[[[NSMutableDictionaryalloc]init]autorelease];
NSDictionary*temDict=[detailDataobje
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 石油套管购销合同(2篇)
- 铝合金加工厂合同
- 《单层厂房基本构造》课件
- 中班秋收冬藏主题课程设计
- 2024企业管理资料范本船员聘用合同
- SED传输技术课程设计
- python打砖块小游戏课程设计
- 《课件岗位分析培训》课件
- 1立方 罐课程设计
- 吻合器术后护理方法
- 《第九课各异的风土人情》教学设计(湖南省县级优课)-美术教案
- 酒水厂家授权书范本
- 《形势与政策(春)》期末考试及答案
- 电梯安全风险管控清单表
- 课件数学北师大版一年级-《认识图形》说课
- 9.1-电荷-课件(共22张PPT新版高中物理教材)
- 《音乐治疗》课程教学大纲
- LED外延基础知识课件
- 采购需求调查报告
- 多能工管理办法
- 中医护理-知识考试试题及答案
评论
0/150
提交评论