文档章节

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

柚-子
 柚-子
发布于 2015/12/12 21:39
字数 848
阅读 33
收藏 0
点赞 0
评论 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
博文 15
码字总数 4522
作品 0
郑州
前端 - 百度地图 API 基础入门

1.前言 最近想完成一个网站,里面需要使用地图相关的内容。 经过多方考虑,决定使用百度地图来完成,所以将整个学习历程进行简单的整理,方便朋友们来快速入门。 本文系作者 李鹏(MR_LP)原...

mr_lp ⋅ 2017/02/20 ⋅ 0

web端定位:获取当前地理位置

方法一:html5原生提供的定位: 讲解:在支持HTML5的浏览器下,navigator对象下有一个属性----geolocation,而geolocation属性又有个方法getCurrentPosition(回调函数1,回调函数2)可以通过浏...

zwjjap ⋅ 2016/05/11 ⋅ 0

百度地图SDK初步学习——环境配置

最近想在手机上开发地图,做一个TraceMe的应用。主要实现的功能是定位和追踪。 使用IDE是Intellij IDEA 12,和eclipse略有不同。 经过2天的学习,已经实现了定位的功能。 一开始想使用谷歌地...

HenryHsu ⋅ 2013/12/02 ⋅ 0

php利用百度地图API进行IP定位和GPS定位

最近在做一个手机端的webapp地图应用,而核心内容当然是定位了,但是定位的话有几种方式,IP定位,GPS定位,基站定位(这个貌似webapp用不了), 那么剩下核心的gps定位和ip定位了,我们知道,...

xialeistudio ⋅ 2015/01/12 ⋅ 3

一、android集成百度地图(android百度地图SDK系列)

总所周知,百度地图SDK是出了名的X,他的隔壁邻居高德简直就是良心。但是很多时候用哪个并不是我们自己能左右的。这不,新项目必须使用百度地图(我:老板,能用高德吗?老板:不能。我:一万...

猫儿不吃鱼鱼 ⋅ 2017/10/09 ⋅ 0

百度地图api 获取当前位置并设置为地图中心点

百度地图api android sdk将地图和定位进行了分离,如果要定位到当前位置就要通过设置监听,内部应该就是监听gps,所以没办法直接通过一个函数获取到 LocationClient mLocationClient = Locat...

mygrsun ⋅ 2016/03/23 ⋅ 0

iOS经纬度偏移解决

正在进行的项目中有这样的需求:定位获得当前经纬度,再用百度Place API使用经纬度查询周边信息。这里不需要显示地图,只需要定位。看似思路很顺畅,做起来却不容易。 iPhone的GPS定位(CLLo...

dmzhangsir ⋅ 2013/07/30 ⋅ 0

Cordova/PhoneGap导航解决方案——在浏览器中调用百度地图APP进行导航

有时候,我们在Cordova/PhoneGap APP中实现导航,如果使用百度SDK开发,工作量是很大的。值得兴奋的是百度地图APP提供了URI API帮我们来实现这个功能。简单的说:如果用户手机中安装了百度地...

crazymus ⋅ 2015/11/18 ⋅ 0

百度地图开发

BMapManager:地图引擎管理类,负责初始化,开启地图API,终止百度地图API等工作 MKSearch:搜索服务.用于位置检索、周边检索、范围检索、公交检索、驾乘检索、步行检索 MKSearchListener搜索结...

jacky_123 ⋅ 2015/02/07 ⋅ 0

iOS-定位服务与地图应用开发

iOS-定位服务与地图应用开发 Harries Blog™2017-12-192 阅读 maptaripAppIOScatAPIIOAndroid 一,定位服务 iOS设备能提供3种不同的定位途径: 1,WiFi定位,通过查询一个WiFi路由器的地理位...

Harries Blog™ ⋅ 2017/12/19 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

解决CentOS6、7,/etc/sysconfig/下没有iptables的问题

一、Centos 6版本解决办法: 1.任意运行一条iptables防火墙规则配置命令: iptables -P OUTPUT ACCEPT 2.对iptables服务进行保存: service iptables save 3.重启iptables服务: service ...

寰宇01 ⋅ 20分钟前 ⋅ 2

数据库备份和恢复

备份:mysqldump -u root -p 数据库>磁盘路径 恢复:mysql -u root -p 数据库<sql脚本的磁盘路径

anlve ⋅ 今天 ⋅ 0

发生了什么?Linus 又发怒了?

在一个 Linux 内核 4.18-rc1 的 Pull Request 中,开发者 Andy Shevchenko 表示其在对设备属性框架进行更新时,移除了 union 别名,这引发了 Linus 的暴怒。 这一次 Linus Torvalds 发怒的原...

问题终结者 ⋅ 今天 ⋅ 0

在树莓派上搭建一个maven仓库

在树莓派上搭建一个maven仓库 20180618 lambo init 项目说明 家里有台树莓派性能太慢。想搭建一个maven私服, 使用nexus或者 jfrog-artifactory 运行的够呛。怎么办呢,手写一个吧.所在这个...

林小宝 ⋅ 今天 ⋅ 0

Spring发展历程总结

转自与 https://www.cnblogs.com/RunForLove/p/4641672.html 目前很多公司的架构,从Struts2迁移到了SpringMVC。你有想过为什么不使用Servlet+JSP来构建Java web项目,而是采用SpringMVC呢?...

onedotdot ⋅ 今天 ⋅ 0

Python模块/包/库安装(6种方法)

Python模块/包/库安装(6种方法) 冰颖机器人 2016-11-29 21:33:26 一、方法1: 单文件模块 直接把文件拷贝到 $python_dir/Lib 二、方法2: 多文件模块,带setup.py 下载模块包(压缩文件zip...

cswangyx ⋅ 今天 ⋅ 0

零基础学习大数据人工智能,学习路线篇!系统规划大数据之路?

大数据处理技术怎么学习呢?首先我们要学习Python语言和Linux操作系统,这两个是学习大数据的基础,学习的顺序不分前后。 Python:Python 的排名从去年开始就借助人工智能持续上升,现在它已经...

董黎明 ⋅ 今天 ⋅ 0

openJdk和sun jdk的区别

使用过LINUX的人都应该知道,在大多数LINUX发行版本里,内置或者通过软件源安装JDK的话,都是安装的OpenJDK, 那么到底什么是OpenJDK,它与SUN JDK有什么关系和区别呢? 历史上的原因是,Ope...

jason_kiss ⋅ 今天 ⋅ 0

梳理

Redux 是 JavaScript 状态容器,提供可预测化的状态管理。 它是JS的状态容器,是一种解决问题的方式,所以即可以用于 react 也可以用于 vue。 需要理解其思想及实现方式。 应用中所有的 stat...

分秒 ⋅ 今天 ⋅ 0

Java 后台判断是否为ajax请求

/** * 是否是Ajax请求 * @param request * @return */public static boolean isAjax(ServletRequest request){return "XMLHttpRequest".equalsIgnoreCase(((HttpServletReques......

JavaSon712 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部