iOS 百度地图拾遗(9.2更新 不同坐标系之间的转换.)

1.申请秘钥

前往 http://lbsyun.baidu.com/apiconsole/key 申请秘钥.
创建应用->填写应用名称、应用类型选择“iOS SDK”,安全码组成 : Bundle Identifier. 完成之后控制台列表中的“访问应用(ak)”就是您在开发过程中需要用到的开发密钥.

2 手动配置开发环境(Cocoapods自行百度)

  • http://lbsyun.baidu.com/index.php?title=iossdk/sdkiosdev-download 下载百度地图iOS SDK

  • 新建一个工程,导入需要 .framework包.其中BaiduMapAPI_Base.framework为基础包,使用SDK任何功能都需导入,其他分包可按需导入.
    保证您工程中至少有一个.mm后缀的源文件(您可以将任意一个.m后缀的文件改名为.mm),或者在工程属性中指定编译方式,即在Xcode的Project -> Edit Active Target -> Build Setting -> Compile Sources As,设置为"Objective-C++"

  • 引入系统库(直接复制,不分顺序) CoreLocation.frameworkQuartzCore.frameworkOpenGLES.frameworkSystemConfiguration.frameworkCoreGraphics.frameworkSecurity.frameworklibsqlite3.0.tbdCoreTelephony.frameworklibstdc++.6.0.9.tbd

    SystemFrameWork.png
  • 环境配置 在TARGETS->Build Settings->Other Linker Flags 中添加-ObjC (注意大小写)。
ObjC.png
  • 引入mapapi.bundle资源文件. BaiduMapAPI_Map.framework->Resources文件中选择mapapi.bundle文件,并勾选“Copy items if needed”复选框,单击“Add”按钮,将资源文件添加到工程.
mapBundle.png
  • 完成以上步骤后 TARGETS->info 添加一个key Bundle display name ,不然地图引擎会报下面的错误
Bundle display name.png

至此 ,百度地图环境集成完毕.


3 百度地图的基本功能

3.1 定位功能

导入头文件 <BaiduMapAPI_Location/BMKLocationService.h>

- (BMKLocationService *)locationService{//懒加载


    if (!_locationService) {
        
        
        BMKLocationService *locationService = [[BMKLocationService alloc] init];
        /// 设定定位的最小更新距离。默认为kCLDistanceFilterNone
        locationService.distanceFilter = 200.0f;
        
        /// 设定定位精度。默认为kCLLocationAccuracyBest。
        locationService.desiredAccuracy = kCLLocationAccuracyBest ;
        
        /// 设定最小更新角度。默认为1度,设定为kCLHeadingFilterNone会提示任何角度改变。
        locationService.headingFilter = 1;
        locationService.delegate = self;
        self.locationService = locationService;
    }

    return _locationService;


}

需要在info.plist文件中添加(以下二选一,两个都添加默认使用NSLocationWhenInUseUsageDescription):
 *NSLocationWhenInUseUsageDescription 允许在前台使用时获取GPS的描述
 *NSLocationAlwaysUsageDescription 允许永远可获取GPS的描述
 
 
[self.locationService startUserLocationService];//开始定位

常见套路,通过代理 BMKLocationServiceDelegate的一系列方法,知晓定位的成功失败与否,不在赘述,详见Demo

真机运行或者模拟器选择位置后,地图上出现一个蓝点

bluebBall.png

产品经理说了: 这个蓝色点太难看了,换~ ╮(╯▽╰)╭

    BMKLocationViewDisplayParam *userlocationStyle = [[BMKLocationViewDisplayParam alloc] init];
    userlocationStyle.accuracyCircleStrokeColor = [UIColor redColor];//精度圈 边框颜色
    userlocationStyle.accuracyCircleFillColor = [UIColor cyanColor];//精度圈 填充颜色
    userlocationStyle.locationViewImgName = @"bnavi_icon_location_fixed";//定位图标名称,需要将该图片放到 mapapi.bundle/images 目录下
    [_mapView updateLocationViewWithParam:userlocationStyle];

CustomBall.png

想换成什么样,换成什么样.

sanpang.gif

3.2 覆盖物功能 (画圆,画线,画多边形,画圆弧,添加图片图层)

导入头文件 <BaiduMapAPI_Map/BMKMapComponent.h>

3.2.1 画圆

BMKCircle *circle = [BMKCircle circleWithCenterCoordinate:coor radius:radius];//  coord 中心点的经纬度坐标..radius 半径,单位:米

3.2.2 画线

BMKPolyline *polyline = [BMKPolyline polylineWithCoordinates:coors count:count]; //coors 经纬度坐标点数组 count 坐标点的个数

3.2.3 画多边形

BMKPolygon *polygon = [BMKPolygon polygonWithCoordinates:coords count:count];//coords 经纬度坐标点数组,这些点将被拷贝到生成的多边形对象中   count 点的个数

3.2.4 画圆弧


BMKArcline *arcline = [BMKArcline arclineWithCoordinates:coords];// coords 指定的经纬度坐标点数组(需传入3个点)

3.2.4 添加图片图层

BMKCoordinateBounds bound;
bound.southWest = coords[0]; //西南角点经纬度坐标
bound.northEast = coords[1]; //东北角点经纬度坐标

BMKGroundOverlay *ground = [BMKGroundOverlay groundOverlayWithBounds:bound icon:[UIImage imageNamed:@"test.png"]];

[_mapView addOverlay:Overlay]; //添加覆盖物

[_mapView addOverlay:removeOverlay];//移除覆盖物

以上只是添加了覆盖物到地图上 ,但是具体覆盖物长什么样子,还有一些个性化定制,需要通过代理 BMKMapViewDelegate方法来实现

- (BMKOverlayView *)mapView:(BMKMapView *)mapView viewForOverlay:(id <BMKOverlay>)overlay//overlay生成对应的View

3.3 自定义大头针

3.3.1 自定义标注

BMKPointAnnotation就代表地图上的一个点,但是具体这个点长什么样子则是由BMKAnnotationView来决定.
又是套路,首先往地图上添加若干BMKPointAnnotation对象([_mapView addAnnotation:annotation];),然后通过BMKMapViewDelegate的代理方法 - (BMKAnnotationView *)mapView:(BMKMapView *)view viewForAnnotation:(id <BMKAnnotation>)annotation来具体展示. Demo里的 MeiTuanViewController 请求的是美团店家的数据,如下:

data.png

产品经理: 这红色的大头针太丑了,换!

我 : 好嘞.

但是大头针的颜色只有,,(BMKPinAnnotationColorRed ,BMKPinAnnotationColorGreen,BMKPinAnnotationColorPurple)三种颜色可以选择..

产品经理: 不行,换成图片显示.

annotationView.image = [UIImage imageNamed:@"category_1"];

customImage.png

我: 满意嘛?

产品经理: 要根据店家类型显示不同的图片..

我: ....

但是BMKPointAnnotation没有标识来区分不同的店家类型..所以我们就只能自定义 MeiTuanAnnotation 继承 BMKPointAnnotation,并增加一个type属性来区分.

normalPao.png

我: 产品 你看行不行?

产品经理: 差不多了,但是这个大头针上面的气泡太丑了,换

我:....

3.3.2 自定义气泡

annotationView.paopaoView = [[BMKActionPaopaoView alloc] initWithCustomView:paopaoView];

这个paopaoView 我们就可以单独定制了.

CustomPao.png

别问我产品经理怎么不说话了,已经被我拖出去打死了.


3.4 地理编码(Geo).反地理编码(ReGeo)

    地理编码 : 将中文地址或地名描述转换为地球表面上相应位置的功能.
    反地理编码 : 将地球表面的地址坐标转换为标准地址的过程.   

导入头文件 #import <BaiduMapAPI_Search/BMKSearchComponent.h>, 关键的类 BMKGeoCodeSearch


- (BMKGeoCodeSearch *)geocodesearch{ //懒加载


    if (!_geocodesearch) {
        
        _geocodesearch = [[BMKGeoCodeSearch alloc] init];
        _geocodesearch.delegate = self;
    }
    return _geocodesearch;

}


套路来了.. 通过BMKGeoCodeSearchDelegate代理得到Geo和ReGeo的相关信息.

/**
 *
 *  @param result   地理编码结果
 *  @param error    错误信息
 */
- (void)onGetGeoCodeResult:(BMKGeoCodeSearch *)searcher result:(BMKGeoCodeResult *)result errorCode:(BMKSearchErrorCode)error
- 

/**
 *
 *  @param result   反地理编码结果
 *  @param error    错误信息
 */
- (void)onGetReverseGeoCodeResult:(BMKGeoCodeSearch *)searcher result:(BMKReverseGeoCodeResult *)result errorCode:(BMKSearchErrorCode)error

封装了一个工具类 Demo效果如下:

GeoReGeo.gif

3.5 不同坐标系之间的转换.

3.5.1 先扫个盲.

 WGS84: 即地图坐标,美国GPS使用的是WGS84的坐标系统。GPS系统获得的坐标系统,基本为标准的国际通用的WGS84坐标系统.
 
 GCJ-02: 即火星坐标,是由中国国家测绘局制订的地理信息系统的坐标系统。它是一种对经纬度数据的加密算法,即加入随机的偏差。国内出版的各种地图系统(包括电子形式),出于国家安全考虑,必须至少采用GCJ-02对地理位置进行首次加密.
 
 BD-09: 即百度坐标: 在GCJ02基础上,进行了BD-09二次加密措施,API支持从WGS/GCJ转换成百度坐标,不支持反转.

国内常用地图的坐标系:

地图 坐标系
百度地图 百度坐标(BD-09)
腾讯搜搜地图 火星坐标
图吧MapBar地图 图吧坐标
高德MapABC地图API 火星坐标
凯立德地图 火星坐标(转为K码)

3.5.1 WGS84.GCJ-02转换为BD-09 (百度公开API)

导入头文件 #import <BaiduMapAPI_Utils/BMKUtilsComponent.h>

  /**
 *坐标转换函数,从原始GPS坐标,mapbar坐标,google坐标,51地图坐标,mapabc坐标转换为百度坐标(51地图坐标需要显出10000)
 *@param coordinate 待转换的坐标
 *@param type 待转换的坐标系类型,GPS为原始GPS坐标,COMMON为google坐标,51地图坐标,mapabc坐标
 *@return 返回的NSDictionry中包含“x”,“y”字段,各自对应经过base64加密之后的x,y坐标
 */
 UIKIT_EXTERN NSDictionary* BMKConvertBaiduCoorFrom(CLLocationCoordinate2D coordinate,BMK_COORD_TYPE type);

举个🌰


    CLLocationCoordinate2D originLocationCoordinate2D = CLLocationCoordinate2DMake(lat, lng);
    //转换GPS坐标至百度坐标
    NSDictionary* baiDudic = BMKConvertBaiduCoorFrom(test,BMK_COORDTYPE_GPS);
    CLLocationCoordinate2D baiduCoor = BMKCoorDictionaryDecode(baiDudic);//转换后的百度坐标

3.5.2 BD-09 转换为 WGS84.GCJ-02(百度没公开API,只能google了)

在Github 找到这个转换算法 https://github.com/TinyQ/TQLocationConverter

 *  将WGS-84转为GCJ-02(火星坐标)
+(CLLocationCoordinate2D)transformFromWGSToGCJ:(CLLocationCoordinate2D)wgsLoc;


 *  将GCJ-02(火星坐标)转为百度坐标
+ (CLLocationCoordinate2D)transformFromGCJToBaidu:(CLLocationCoordinate2D)p;

 *  将百度坐标转为GCJ-02(火星坐标)
+ (CLLocationCoordinate2D)transformFromBaiduToGCJ:(CLLocationCoordinate2D)p;


 *  将GCJ-02(火星坐标)转为WGS-84
+ (CLLocationCoordinate2D)transformFromGCJToWGS:(CLLocationCoordinate2D)p;

Demo下载地址 https://github.com/zzBelieve/BaiduMapDemo.git(如果帮到您,请给个Star吧...)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,056评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,842评论 2 378
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,938评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,296评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,292评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,413评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,824评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,493评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,686评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,502评论 2 318
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,553评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,281评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,820评论 3 305
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,873评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,109评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,699评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,257评论 2 341

推荐阅读更多精彩内容

  • 各位小伙伴们大家好,今天我向大家介绍一下苹果百度地图的使用方法,因为做过一些想关的APP,感觉百度地图还是挺方便的...
    Lee0528阅读 14,648评论 18 46
  • 标签 : 运动轨迹 百度地图SDK http://orchan.github.io/2016/02/22/基于百度...
    BLSTUDIO阅读 41,048评论 29 90
  • 一、概述 百度地图 iOS SDK是一套基于iOS 5.0及以上版本设备的应用程序接口,不仅提供展示地图的基本接口...
    DestinyFighter_阅读 3,012评论 0 11
  • *初学地图时,觉得地图是个很高深的玩意儿,导航、定位、检索这得运用多少算法和核心动画的知识点啊,于是一直排斥 * ...
    柳骏阅读 3,690评论 11 22
  • 我想我有些阴郁了。莫名其妙的。 是秋意?是经济?是工作? 我在关注它来临的脚步, 我在思考它到访的因由, 我在防备...
    Ruby_450e阅读 239评论 0 0