文档章节

地图定位----百度地图Api

柚-子
 柚-子
发布于 2015/12/12 21:39
字数 848
阅读 91
收藏 0

行业解决方案、产品招募中!想赚钱就来传!>>>

      iOS系统内部的地图在国内使用的是高德地图,由于官方文档的限制百度地图其实也是对系统地图API的二次封装而已。由于公司的项目是一款与物流相关的APP,主界面是以地图为蓝本,所以就必须对百度地图十分熟悉(项目的老版本使用的百度地图)。

  第一步、 在appDelegate的didFinishLaunchingWithOptions:方法中进行百度地图的初始化操作:

   - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
   {
    
    mapManager = [[BMKMapManager alloc]init];
    BOOL ret = [mapManager start:BAIDU_MAP_KEY generalDelegate:self];//BAIDU_MAP_KEY为百度注册获取的Key
    if(!ret)
    {
        NSLog(@"manager start failed!");
    }
    
    }

 第二步、在展示地图view的controller中实例化BMKMapView对象并添加相关UI控件

    BDMapView=[[BMKMapView alloc] initWithFrame:CGRectMake(0,0,self.frame.size.width ,self.frame.size.height)];
    BDMapView.zoomEnabled=true;
    BDMapView.showMapScaleBar =true;
    BDMapView.mapScaleBarPosition = CGPointMake(10,BDMapView.frame.size.height - 45);
    BDMapView.zoomLevel=15;
    
    //自定义精度圈
    BMKLocationViewDisplayParam * param = [[BMKLocationViewDisplayParam alloc]init];
    param.isAccuracyCircleShow = NO;//去掉大圆圈
    param.locationViewImgName=@"icon_center_point";
    [BDMapView updateLocationViewWithParam:param];
    
    //定位按钮UI
    UIButton *btnLocation = [UIButton buttonWithType:UIButtonTypeCustom];
    btnLocation.frame=CGRectMake(self.frame.size.width-50,BDMapView.mapScaleBarPosition.y-40,35,35);
    btnLocation.backgroundColor = WhiteColor;
    [btnLocation.layer setMasksToBounds:YES];
    [btnLocation.layer setCornerRadius:AppCornerRadius];
    [btnLocation setBackgroundImage:[ColorUtils createImageWithColor:WhiteColor rect:btnLocation.frame]forState:UIControlStateNormal];
    [btnLocation addTarget:self action:@selector(locationOnDown:)forControlEvents:UIControlEventTouchDown];
    
    //添加控件在View上面
    [self addSubview:BDMapView];
    [self addSubview:btnLocation];
#pragma mark - 定位按钮按下
-(void)locationOnDown:(UIButton*)button
{
    [button setBackgroundColor:CheckColor];
    [self onStart];
}

至此,调用定位方法。在项目中为方便使用结合API对其进行了二次封装。如果我们只是定位的话比较简单只需要是使用初始化BMKLocationService类并调用其对象方法即可如下:

-(id)init
{
    locService = [[BMKLocationService alloc]init];
    return self;
}

#pragma mark 开始定位
-(void)onStartLocation
{
    [locService startUserLocationService];
}

#pragma mark 结束定位
-(void)onStopLocation
{
    [locService stopUserLocationService];
}

如果我们还需要获取详细的省市县三级地址或者经纬度的话稍微麻烦一点。需要遵守两个代理:

代理一:BMKLocationServiceDelegate

代理二:BMKGeoCodeSearchDelegate

遵守代理一 是因为需要用到其内部方法

/**
 *用户位置更新后,会调用此函数
 *@param userLocation 新的用户位置
 */
- (void)didUpdateBMKUserLocation:(BMKUserLocation *)userLocation;

遵守代理二 是因为需要用到其内部方法

/**
 *返回反地理编码搜索结果
 *@param searcher 搜索对象
 *@param result 搜索结果
 *@param error 错误号,@see BMKSearchErrorCode
 */
- (void)onGetReverseGeoCodeResult:(BMKGeoCodeSearch *)searcher result:(BMKReverseGeoCodeResult *)result errorCode:(BMKSearchErrorCode)error;

是不是到此就算结束了?错!

还有一些小问题需要解决:

问题1:

//在定位的方法里将定位获取的位置传给百度geo的位置这样才能定位成功并显示!!!
#pragma mark 定位成功返回(调用位置更新的方法)
- (void)didUpdateBMKUserLocation:(BMKUserLocation *)userLocation
{
    if(userLocation.location!=nil)
    {
        BMKUserLocation *bmkUserLocation = userLocation;
        CLLocationCoordinate2D position = userLocation.location.coordinate;
        
        BMKReverseGeoCodeOption *reverseGeocodeSearchOption = [[BMKReverseGeoCodeOption alloc]init];
        reverseGeocodeSearchOption.reverseGeoPoint = position;
        geocodesearch.delegate=self;
        [geocodesearch reverseGeoCode:reverseGeocodeSearchOption];
    }
    else
    {
        [delegate onLocationError:@"定位异常..." addressFlag:false];
    }
}

为题2:

#pragma mark 反向地理编码,经纬度转地址
-(void) onGetReverseGeoCodeResult:(BMKGeoCodeSearch *)searcher result:(BMKReverseGeoCodeResult *)result errorCode:(BMKSearchErrorCode)error
{
    //检索结果正常返回
    if (error == 0)
    {
        BMKAddressComponent *address = result.addressDetail;
        [delegate onLocationAddress:address.province city:address.city town:address.district street:[address.streetName stringByAppendingString:address.streetNumber]];
        
        //显示经纬度
        [delegate onLocationAngle:bmkUserLocation];
    }
    else
    {
        [delegate onLocationError:@"经纬度转地址-地址编码未实现..." addressFlag:true];
    }
}

备注:代码中所涉及到的delegate为二次封装的代理。针对百度地图二次封装的源码待我百度网盘弄好之后会以超链接的形式共享出来。



柚-子
粉丝 1
博文 18
码字总数 4494
作品 0
郑州
私信 提问
加载中
请先登录后再评论。
beego API开发以及自动化文档

beego API开发以及自动化文档 beego1.3版本已经在上个星期发布了,但是还是有很多人不了解如何来进行开发,也是在一步一步的测试中开发,期间QQ群里面很多人都问我如何开发,我的业余时间实在...

astaxie
2014/06/25
2.7W
22
C++模板库--C++ B-tree

这是一个google开源的C++模板库,实现了基于B-tree数据结构的有序内存容器。类似于STL的map、set、multimap和multiset模板,C++ B-tree也提供了btreemap、btreeset、btreemultimap和btreemu...

匿名
2013/02/05
3.2K
1
工作流管理系统--Pegasus WMS

Pegasus (飞马座)工作流管理系统包括一套技术标准工作流程应用程序中执行帮助许多不同的环境中,包括桌面、校园集群、网格、云。它弥补了科学领域和执行环境通过自 动映射到分布式资源的高层工...

匿名
2013/02/24
5.2K
0
Swing界面分析和调试工具--Swing Inspector

Swing Inspector是一个Java Swing/AWT用户界面分析和调试工具,功能与firebug类似,具有强大的Swing/AWT用户界面分析和调试相关功能。 适用于从java swing初级到高级的所有开发人员,能够快速...

匿名
2013/03/06
3.3K
0
Android 设备管理工具--androrat

androrat 是一个对 Android 设备进行远程管理的工具。 功能包括: 获取通讯录信息 获取呼叫记录 获取短信和彩信 通过 GPS 获取定位 实时监控接收到的短信 监控手机的呼叫状态 拍照 获取来自麦...

匿名
2013/03/28
2.7W
11

没有更多内容

加载失败,请刷新页面

加载更多

如何在Android中以像素为单位获取屏幕尺寸 - How to get screen dimensions as pixels in Android

问题: I created some custom elements, and I want to programmatically place them to the upper right corner ( n pixels from the top edge and m pixels from the right edge). 我创建......

javail
28分钟前
7
0
如何在不安装Microsoft Office的情况下用C#创建Excel(.XLS和.XLSX)文件?

问题: 如何在不使用运行代码的计算机上安装Excel的情况下使用C#创建Excel电子表格? 解决方案: 参考一: https://stackoom.com/question/dHZ/如何在不安装Microsoft-Office的情况下用C-创...

技术盛宴
58分钟前
7
0
如何使用pip升级所有Python软件包? - How to upgrade all Python packages with pip?

问题: Is it possible to upgrade all Python packages at one time with pip ? 是否可以通过pip一次升级所有Python软件包? Note : that there is a feature request for this on the off......

法国红酒甜
今天
9
0
活体检测+合成图鉴别面前,人脸“照片活化”黑产攻击一秒被擒

本文作者:y****n 如今,随着人脸技术的日趋成熟,新兴娱乐文化得到了极大的推动,尤其是随着 DeepFake、FaceSwap 等人脸编辑及生成技术的发展,虚拟主播、人脸合成带给人们全新的体验,但同...

百度开发者中心
昨天
12
0
如何在SQL Server中将多行文本合并为单个文本字符串?

问题: Consider a database table holding names, with three rows: 考虑一个包含名称的数据库表,该表具有三行: PeterPaulMary Is there an easy way to turn this into a single str......

富含淀粉
今天
19
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部