一、成为百度的开发者、创建应用
http://developer.baidu.com/map/index.php?title=首页
(鼠标移向
然后选择你的项目需要的功能
你可以在里面了解到你想要使用的功能的一些调用方法。
(这个适合项目中已经配置了SDK但是不知道调用什么方法去实现功能的))
二、下载SDK
1.首先需要在百度地图下载最新SDK:地址: http://developer.baidu.com/map/index.php?title=iossdk/sdkiosdev-download
百度地图iOS SDK自v2.7.0版本起,向广大开发者提供了 .framework形式的SDK开发包,这种形式的开发包配置简单,使用方便,推荐大家使用。
注:由于iOS9改用更安全的https,为了能够在iOS9中正常使用地图SDK,请在”Info.plist”中进行如下配置,否则影响SDK的使用。
<key>NSAppTransportSecurity</key>
<dict> <key>NSAllowsArbitraryLoads</key> <true/> </dict>
配置.framework形式开发包
第一步、引入BaiduMapAPI.framework
百度地图SDK提供了模拟器和真机两种环境所使用的framework,分别存放在libs/Release-iphonesimulator和libs/Release-iphoneos文件夹下,开发者可根据需要使用真机或模拟器的包,如果需同时使用真机和模拟器的包,可以使用lipo命令将设备和模拟器framwork包中的BaiduMapAPI文件合并成一个通用的文件,命令如下:lipo -create Release-iphoneos/BaiduMapAPI.framework/BaiduMapAPI Release-iphonesimulator/BaiduMapAPI.framework/BaiduMapAPI -output Release-iphoneos/BaiduMapAPI.framework/BaiduMapAPI
此时Release-iphoneos文件夹下的BaiduMapAPI.framework即可同时用于真机和模拟器(可以使用lipo–info 命令检查framework所支持的架构)。
将所需的BaiduMapAPI.framework拷贝到工程所在文件夹下。在 TARGETS->Build Phases-> Link Binary With Libaries中点击“+”按钮,在弹出的窗口中点击“Add Other”按钮,选择BaiduMapAPI.framework文件添加到工程中。
注:静态库中采用ObjectC++实现,因此需要您保证您工程中至少有一个.mm后缀的源文件(您可以将任意一个.m后缀的文件改名为.mm),或者在工程属性中指定编译方式,即将Xcode的Project -> Edit Active Target -> Build -> GCC4.2 – Language -> Compile Sources As设置为”Objective-C++”
第二步、引入所需的系统库
百度地图SDK中提供了定位功能和动画效果,v2.0.0版本开始使用OpenGL渲染,因此您需要在您的Xcode工程中引入CoreLocation.framework和QuartzCore.framework、OpenGLES.framework、SystemConfiguration.framework、CoreGraphics.framework、Security.framework。添加方式:在Xcode的Project -> Active Target ->Build Phases ->Link Binary With Libraries,添加这几个framework即可。
第三步、环境配置
在TARGETS->Build Settings->Other Linker Flags 中添加-ObjC。
第四步、引入mapapi.bundle资源文件
如果使用了基础地图功能,需要添加该资源,否则地图不能正常显示
mapapi.bundle中存储了定位、默认大头针标注View及路线关键点的资源图片,还存储了矢量地图绘制必需的资源文件。如果您不需要使用内置的图片显示功能,则可以删除bundle文件中的image文件夹。您也可以根据具体需求任意替换或删除该bundle中image文件夹的图片文件。
方法:选中工程名,在右键菜单中选择Add Files to “工程名”…,从BaiduMapAPI.framework||Resources文件中选择mapapi.bundle文件,并勾选“Copy items if needed”复选框,单击“Add”按钮,将资源文件添加到工程中。
第五步、引入头文件
在使用SDK的类引入头文件:
#import <BaiduMapAPI/BMapKit.h>//引入所有的头文件
#import <BaiduMapAPI/BMKMapView.h>//只引入所需的单个头文件
配置.a形式开发包
第一步、引入头文件
首先将百度MapAPI提供的头文件和静态库(.a)文件拷贝到您的工程目录下,在Xcode中添加新的文件Group,引入百度MapAPI提供的头文件(请使用Xcode 4.X以上平台)。
在您需要使用百度MapAPI的文件中添加以下代码
#import "BMapKit.h"
第二步、引入静态库文件
百度地图SDK提供了模拟器和真机两中环境所使用的静态库文件,分别存放在libs/Release-iphonesimulator和libs/Release-iphoneos文件夹下。有三种方式可以引入静态库文件:
第一种方式:直接将对应平台的.a文件拖拽至Xcode工程左侧的Groups&Files中,缺点是每次在真机和模拟器编译时都需要重新添加.a文件;
第二种方式:使用lipo命令将设备和模拟器的.a合并成一个通用的.a文件,将合并后的通用.a文件拖拽至工程中即可,具体命令如下: lipo -create Release-iphoneos/libbaidumapapi.a Release-iphonesimulator/libbaidumapapi.a -output libbaidumapapi.a
第三种方式:
1. 将API的libs文件夹拷贝到您的Application工程根目录下
2. 在Xcode的Project -> Edit Active Target -> Build -> Linking -> Other Linker Flags中添加-ObjC
3. 设置静态库的链接路径,在Xcode的Project -> Edit Active Target -> Build -> Search Path -> Library Search Paths中添加您的静态库目录,比如“$(SRCROOT)/../libs/Release$(EFFECTIVE_PLATFORM_NAME)”,$(SRCROOT)宏代表您的工程文件目录,$(EFFECTIVE_PLATFORM_NAME)宏代表当前配置是OS还是simulator
注:静态库中采用ObjectC++实现,因此需要您保证您工程中至少有一个.mm后缀的源文件(您可以将任意一个.m后缀的文件改名为.mm),或者在工程属性中指定编译方式,即将Xcode的Project -> Edit Active Target -> Build -> GCC4.2 – Language -> Compile Sources As设置为”Objective-C++”
第三步、引入系统framework
百度地图SDK中提供了定位功能和动画效果,v2.0.0版本开始使用OpenGL渲染,因此您需要在您的Xcode工程中引入CoreLocation.framework和QuartzCore.framework、OpenGLES.framework、SystemConfiguration.framework、CoreGraphics.framework、Security.framework。 添加方式:在Xcode的Project -> Active Target ->Build Phases ->Link Binary With Libraries,添加这几个framework即可。
第四步、引入mapapi.bundle资源文件
mapapi.bundle中存储了定位、默认大头针标注View及路线关键点的资源图片,还存储了矢量地图绘制必需的资源文件。如果您不需要使用内置的图片显示功能,则可以删除bundle文件中的image文件夹。您也可以根据具体需求任意替换或删除该bundle中image文件夹的图片文件。 添加方式:将mapapi.bundle拷贝到您的工程目录,直接将该bundle文件托拽至Xcode工程左侧的Groups&Files中即可。若您需要替换定位、指南针的图标,请保留原文件名称,否则不显示替换的新图片,默认大头针标注与路线关键点的新图片名称可自定义名称。
四、调用你想要的方法实现功能
0.
初始化BMKMapManager
在您的AppDelegate.h文件中添加BMKMapManager的定义
@interface BaiduMapApiDemoAppDelegate : NSObject <UIApplicationDelegate> {
UIWindow *window; UINavigationController *navigationController; BMKMapManager* _mapManager; }
在您的AppDelegate.m文件中添加对BMKMapManager的初始化,并填入您申请的授权Key,示例如下
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // 要使用百度地图,请先启动BaiduMapManager _mapManager = [[BMKMapManager alloc]init]; // 如果要关注网络及授权验证事件,请设定 generalDelegate参数 BOOL ret = [_mapManager start:@"在此处输入您的授权Key" generalDelegate:nil]; if (!ret) { NSLog(@"manager start failed!"); } // Add the navigation controller's view to the window and display. [self.window addSubview:navigationController.view]; [self.window makeKeyAndVisible]; return YES; }
创建BMKMapView
在您的ViewController.m文件中添加BMKMapView的创建代码,示例如下
- (void)viewDidLoad {
[super viewDidLoad]; BMKMapView* mapView = [[BMKMapView alloc]initWithFrame:CGRectMake(0, 0, 320, 480)]; self.view = mapView; }
自2.0.0起,BMKMapView新增viewWillAppear、viewWillDisappear方法来控制BMKMapView的生命周期,并且在一个时刻只能有一个BMKMapView接受回调消息,因此在使用BMKMapView的viewController中需要在viewWillAppear、viewWillDisappear方法中调用BMKMapView的对应的方法,并处理delegate,代码如下:
(void)viewWillAppear:(BOOL)animated { [_mapView viewWillAppear]; _mapView.delegate = self; // 此处记得不用的时候需要置nil,否则影响内存的释放 } -(void)viewWillDisappear:(BOOL)animated { [_mapView viewWillDisappear]; _mapView.delegate = nil; // 不用时,置nil }
编译,运行,效果如下图所示:
百度地图支持多点触摸、双击放大、多点单击缩小、旋转等手势操作,此外自2.2.0版本起,支持相应的控制接口来开启/关闭这些手势操作。
注:百度地图iOS SDK自v2.2.0起,全面实现地图多实例,即开发者可以在一个页面中建立多个地图对象,并且针对这些对象分别操作且不会产生相互干扰。具体使用方法请参考MultiMapViewDemo的介绍。
2.基础地图
简介
开发者可利用SDK提供的接口,使用百度为您提供的基础地图数据。目前百度地图SDK所提供的地图等级为19级,所包含的信息有建筑物、道路、河流、学校、公园等内容。
百度地图支持多点触摸、双击放大、多点单击缩小、旋转等手势操作,此外自2.2.0版本起,支持相应的控制接口来开启/关闭这些手势操作;此外,在该版本地图对象实现了多实例特性,即开发者可以在一个页面中建立多个地图对象,并且针对这些对象分别操作且不会产生相互干扰。具体使用方法请参考MultiMapViewDemo的介绍。
地图上自定义的标注点和覆盖物我们统称为地图覆盖物。您可以通过定制BMKAnnotation和BMKOverlay来添加对应的标注点和覆盖物。地图覆盖物的设计遵循数据与View分离的原则,BMKAnnotation和BMKOverlay系列的类主要用来存放覆盖物相关的数据,BMKAnnotaionView和BMKOverlayView系列类为覆盖物对应的View。
SDK支持画点、折线、圆、多边形(包括凹凸两种)、图片图层和自定义覆盖物。从2.0.0开始矢量地图采用OpenGL绘制,新增支持OpenGL绘制的基本线绘制、面绘制接口。详见AnnotationDemo,SDK内置的BMKPolylineOverlay、BMKPolygonOverlay,BMKCircleOverlay均采用OpenGL绘制。
卫星图
百度地图SDK为您提供基础矢量图和卫星图两种类型的地图,开启卫星图的方法如下:
//切换为卫星图
[_mapView setMapType:BMKMapTypeSatellite];
运行后效果如下:
由卫星图切换为普通矢量图的核心代码如下:
//切换为普通地图
[_mapView setMapType:BMKMapTypeStandard];
实时交通图
利用地图SDK所提供的接口,开发者可显示当前地图城市内的实时路况信息(点击查看支持实时路况的城市)。此外,自2.0.0版本起,SDK还支持城际(城市之间,如高速)路况。
开启实时路况的核心代码如下:
//打开实时路况图层
[_mapView setTrafficEnabled:YES];
运行后效果如下:
关闭实时路况的核心代码如下:
//关闭实时路况图层
[_mapView setTrafficEnabled:NO];
百度城市热力图
百度地图SDK继为广大开发者开放热力图本地绘制能力之后,再次进一步开放百度自有数据的城市热力图层,帮助开发者构建形式更加多样的移动端应用。
百度城市热力图的性质及使用与实时交通图类似,只需要简单的接口调用,即可在地图上展现样式丰富的百度城市热力图。
在地图上使用百度城市热力图的核心代码如下:
//打开百度城市热力图图层(百度自有数据)
[_mapView setBaiduHeatMapEnabled:YES];
//关闭百度城市热力图图层(百度自有数据) [_mapView setBaiduHeatMapEnabled:NO];
地图标注
BMKAnnotation为标注对应的protocal,您可以自定义标注类实现该protocal。百度地图SDK也预置了基本的标注点(BMKPointAnnotation)和一个大头针标注View(BMKPinAnnotationView),您可以直接使用来显示标注。方法如下:
第一步,修改您的ViewController.h文件,添加以下代码,使您的ViewController实现BMKMapViewDelegate协议:
#import <UIKit/UIKit.h>
#import "BMapKit.h"
@interface AnnotationDemoViewController : UIViewController <bmkmapviewdelegate> { IBOutlet BMKMapView* _mapView; } @end
第二步,修改您的ViewController.m文件,实现BMKMapViewDelegate的_mapView:viewForAnnotation:函数,并在viewDidAppear添加标注数据对象,核心代码如下:
- (void) viewDidAppear:(BOOL)animated { // 添加一个PointAnnotation BMKPointAnnotation* annotation = [[BMKPointAnnotation alloc]init]; CLLocationCoordinate2D coor; coor.latitude = 39.915; coor.longitude = 116.404; annotation.coordinate = coor; annotation.title = @"这里是北京"; [_mapView addAnnotation:annotation]; } // Override - (BMKAnnotationView *)mapView:(BMKMapView *)mapView viewForAnnotation:(id <BMKAnnotation>)annotation { if ([annotation isKindOfClass:[BMKPointAnnotation class]]) { BMKPinAnnotationView *newAnnotationView = [[BMKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"myAnnotation"]; newAnnotationView.pinColor = BMKPinAnnotationColorPurple; newAnnotationView.animatesDrop = YES;// 设置该标注点动画显示 return newAnnotationView; } return nil; }
运行后,会在地图显示对应的标注点,点击会弹出气泡,效果如图:
通过以上几步简单的操作,您就可以实现在地图上添加标注了,相应的删除标注方法如下:
if (annotation != nil) {
[_mapView removeAnnotation:annotation]; }
几何图形
百度地图SDK支持的几何图形有:折线、弧线、多边形和圆,折线、弧线及其他几何图形的边框自v2.6.0版本起支持使用虚线或者纹理图片进行绘制(具体使用方法请参考官方Demo,覆盖物章节的介绍)。开发者可利用相应的接口,在地图上快速绘制这些图形,满足相应的业务需求。
折线
在地图上添加折线的方法如下:
第一步,修改您的ViewController.h文件,添加以下代码,使您的ViewController实现BMKMapViewDelegate协议:
#import <UIKit/UIKit.h>
#import "BMapKit.h"
@interface OverlayDemoViewController : UIViewController <BMKMapViewDelegate>{ IBOutlet BMKMapView* _mapView; } @end
第二步,修改您的ViewController.m文件,实现BMKMapViewDelegate的mapView:viewForOverlay:函数,并在viewDidLoad添加折线数据对象:
- (void)viewDidLoad {
[super viewDidLoad]; // 添加折线覆盖物 CLLocationCoordinate2D coors[2] = {0}; coors[0].latitude = 39.315; coors[0].longitude = 116.304; coors[1].latitude = 39.515; coors[1].longitude = 116.504; BMKPolyline* polyline = [BMKPolyline polylineWithCoordinates:coors count:2]; [_mapView addOverlay:polyline]; } // Override - (BMKOverlayView *)mapView:(BMKMapView *)mapView viewForOverlay:(id <BMKOverlay>)overlay{ if ([overlay isKindOfClass:[BMKPolyline class]]){ BMKPolylineView* polylineView = [[[BMKPolylineView alloc] initWithOverlay:overlay] autorelease]; polylineView.strokeColor = [[UIColor purpleColor] colorWithAlphaComponent:1]; polylineView.lineWidth = 5.0; return polylineView; } return nil; }
第三步,运行结果:
iOS地图SDK自v2.8.0版本起,新增了折线多段颜色绘制能力,实现的核心代码如下:
第一步,BMKMapView对象,添加分段纹理绘制折线覆盖物,核心代码如下:
//构建顶点数组
CLLocationCoordinate2Dcoords[5] = {0}; coords[0].latitude = 39.965; coords[0].longitude = 116.404; coords[1].latitude = 39.925; coords[1].longitude = 116.454; coords[2].latitude = 39.955; coords[2].longitude = 116.494; coords[3].latitude = 39.905; coords[3].longitude = 116.654; coords[4].latitude = 39.965; coords[4].longitude = 116.704; //构建分段纹理索引数组 NSArray *textureIndex = [NSArrayarrayWithObjects: [NSNumbernumberWithInt:0], [NSNumbernumberWithInt:1], [NSNumbernumberWithInt:2], [NSNumbernumberWithInt:1], nil]; //构建BMKPolyline,使用分段纹理 BMKPolyline* polyLine = [BMKPolylinepolylineWithCoordinates:coordscount:5textureIndex:textureIndex]; //添加分段纹理绘制折线覆盖物 [_mapViewaddOverlay:polyLine];
第二步,实现BMKMapViewDelegate的mapView:viewForOverlay:回调,核心代码如下:
- (BMKOverlayView*)mapView:(BMKMapView *)map viewForOverlay:(id<BMKOverlay>)overlay { if ([overlay isKindOfClass:[BMKPolylineclass]]) { BMKPolylineView* polylineView = [[BMKPolylineViewalloc] initWithOverlay:overlay]; polylineView.lineWidth = 5; polylineView.isFocus = YES;// 是否分段纹理绘制(突出显示),默认YES //加载分段纹理图片,必须否则不能进行分段纹理绘制 [polylineView loadStrokeTextureImages: [NSArrayarrayWithObjects:[UIImageimageNamed:@"road_blue_arrow.png"], [UIImageimageNamed:@"road_green_arrow.png"], [UIImageimageNamed:@"road_red_arrow.png"],nil]]; returnpolylineView; } returnnil; }
第三步,运行结果:
弧线
百度地图iOS SDK自v2.1.1本起,新增了绘制弧线的方法。用户可以根据三个有序点唯一确定一条弧线,满足您的业务需求。首先,修改您的.m文件,实现BMKMapViewDelegate的_mapView:viewForOverlay:函数,并在viewDidLoad添加弧线数据对象,核心代码如下
- (void)viewDidLoad {
[super viewDidLoad]; //添加弧线覆盖物 //传入的坐标顺序为起点、途经点、终点 CLLocationCoordinate2D coords[3] = {0}; coords[0].latitude = 39.9374; coords[0].longitude = 116.350; coords[1].latitude = 39.9170; coords[1].longitude = 116.360; coords[2].latitude = 39.9479; coords[2].longitude = 116.373; BMKArcline *arcline = [BMKArcline arclineWithCoordinates:coords]; [_mapView addOverlay:arcline]; } //根据overlay生成对应的View - (BMKOverlayView *)mapView:(BMKMapView *)mapView viewForOverlay:(id<bmkoverlay>)overlay { if ([overlay isKindOfClass:[BMKArcline class]]) { BMKArclineView* arclineView = [[[BMKArclineView alloc] initWithOverlay:overlay] autorelease]; arclineView.strokeColor = [[UIColor blueColor] colorWithAlphaComponent:0.5]; arclineView.lineWidth = 5.0; return arclineView; } return nil; }
运行后,效果如图:
多边形
修改ViewController.h文件,使其实现BMKMapViewDelegate;同时修改ViewController.m文件,实现BMKMapViewDelegate的_mapView:viewForOverlay:函数,并在viewDidLoad添加多边形数据对象。核心代码如下:
- (void)viewDidLoad {
[super viewDidLoad]; // 添加多边形覆盖物 CLLocationCoordinate2D coords[3] = {0}; coords[0].latitude = 39; coords[0].longitude = 116; coords[1].latitude = 38; coords[1].longitude = 115; coords[2].latitude = 38; coords[2].longitude = 117; BMKPolygon* polygon = [BMKPolygon polygonWithCoordinates:coords count:3]; [_mapView addOverlay:polygon]; } // Override - (BMKOverlayView *)mapView:(BMKMapView *)mapView viewForOverlay:(id <BMKOverlay>)overlay{ if ([overlay isKindOfClass:[BMKPolygon class]]){ BMKPolygonView* polygonView = [[[BMKPolygonView alloc] initWithOverlay:overlay] autorelease]; polygonView.strokeColor = [[UIColor purpleColor] colorWithAlphaComponent:1]; polygonView.fillColor = [[UIColor cyanColor] colorWithAlphaComponent:0.2]; polygonView.lineWidth = 5.0; return polygonView; } return nil; }
运行后的显示效果如下图所示:
圆
与多边形实现的方式类似,首先要修改ViewController.h文件,实现BMKMapViewDelegate协议;然后修改ViewController.m文件,实现BMKMapViewDelegate的_mapView:viewForOverlay:函数,并在viewDidLoad添加圆数据对象。核心代码如下:
- (void)viewDidLoad {
[super viewDidLoad]; // 添加圆形覆盖物 CLLocationCoordinate2D coor; coor.latitude = 39.915; coor.longitude = 116.404; BMKCircle* circle = [BMKCircle circleWithCenterCoordinate:coor radius:5000]; [_mapView addOverlay:circle]; } // Override - (BMKOverlayView *)mapView:(BMKMapView *)mapView viewForOverlay:(id <BMKOverlay>)overlay{ if ([overlay isKindOfClass:[BMKCircle class]]){ BMKCircleView* circleView = [[[BMKCircleView alloc] initWithOverlay:overlay] autorelease]; circleView.fillColor = [[UIColor cyanColor] colorWithAlphaComponent:0.5]; circleView.strokeColor = [[UIColor blueColor] colorWithAlphaComponent:0.5]; circleView.lineWidth = 10.0; return circleView; } return nil; }
运行效果如下图所示:
地形图图层
自V2.1.0开始,新增图片图层,开发者可在地图的指定位置上添加图片。该图片可随地图的平移、缩放、旋转等操作做相应的变换。图片图层是一种特殊的Overlay, 它位于底图和底图标注层之间(即图片图层不会遮挡地图标注信息), 此外,图片图层的添加顺序不会影响其他图层(例如:POI搜索图层、我的位置图层等)的叠加关系。
图片图层对象初始化的方法有两种:(1)根据指定经纬度坐标生成 (2)根据指定区域生成。下面举例分步说明添加图片图层的步骤:
第一步,修改您的ViewController.h文件,添加以下代码,使您的ViewController实现BMKMapViewDelegate协议:
@interface AnnotationDemoViewController : UIViewController<BMKMapViewDelegate>{
IBOutlet BMKMapView* _mapView; } end
第二步,修改您的ViewController.m文件,在viewDidLoad添加图片图层对象:
- (void)viewDidLoad {
[super viewDidLoad]; //添加图片图层覆盖物(第一种:根据指定经纬度坐标生成) CLLocationCoordinate2D coors; coors.latitude = 39.800; coors.longitude = 116.404; BMKGroundOverlay* ground = [BMKGroundOverlay groundOverlayWithPosition:coors zoomLevel:11 anchor:CGPointMake(0.0f,0.0f) icon:[UIImage imageWithName:@"test.png"]]; [_mapView addOverlay:ground]; //添加图片图层覆盖物(第二种:根据指定区域生成) CLLocationCoordinate2Dcoords[2] = {0}; coords[0].latitude = 39.815; coords[0].longitude = 116.404; coords[1].latitude = 39.915; coords[1].longitude = 116.504; BMKCoordinateBounds bound; bound.southWest = coords[0]; bound.northEast = coords[1]; BMKGroundOverlay* ground2 = [BMKGroundOverlay groundOverlayWithBounds: bound icon:[UIImage imageWithName:@"test.png"]]; [_mapView addOverlay:ground2]; }
第三步,修改您的ViewController.m文件,实现BMKMapViewDelegate的_mapView:viewForOverlay:函数:
- (BMKOverlayView *)mapView:(BMKMapView *)mapView viewForOverlay:(id<BMKOverlay>)overlay{ if ([overlay isKindOfClass:[BMKGroundOverlay class]]){ BMKGroundOverlayView* groundView = [[[BMKGroundOverlayView alloc] initWithOverlay:overlay] autorelease]; return groundView; } return nil; }
运行效果如下图所示:
热力图功能
热力图是用不同颜色的区块叠加在地图上描述人群分布、密度和变化趋势的一个产品,百度地图SDK将绘制热力图的能力为广大开发者开放,帮助开发者利用自有数据,构建属于自己的热力图,提供丰富的展示效果。
注意:此处的“热力图功能”不同于“百度城市热力图”。百度城市热力图通过简单的接口调用,开发者可展示百度数据的热力图层。而此处的热力图功能,需要开发者传入自己的位置数据,然后SDK会根据热力图绘制规则为开发者做本地的热力图渲染绘制。
利用热力图功能构建自有数据热力图的方式如下:
//添加热力图
-(void)addHeatMap{ //创建热力图数据类 BMKHeatMap* heatMap = [[BMKHeatMapalloc]init]; //创建渐变色类 UIColor* color1 = [UIColorblueColor]; UIColor* color2 = [UIColoryellowColor]; UIColor* color3 = [UIColorredColor]; NSArray*colorInitialArray = [[NSArrayalloc]initWithObjects:color1,color2,color3, nil]; BMKGradient* gradient = [[BMKGradientalloc]initWithColors:colorInitialArraystartPoints:@[@"0.08f", @"0.4f", @"1f"]]; [colorInitialArrayrelease]; //如果用户自定义了渐变色则按自定义的渐变色进行绘制否则按默认渐变色进行绘制 heatMap.mGradient = gradient; //创建热力图数据数组 NSMutableArray* data = [NSMutableArrayarray]; int num = 1000; for(int i = 0; i<num; i++) { //创建BMKHeatMapNode BMKHeatMapNode* heapmapnode_test = [[BMKHeatMapNodealloc]init]; //此处示例为随机生成的坐标点序列,开发者使用自有数据即可 CLLocationCoordinate2D coor; float random = (arc4random()%1000)*0.001; float random2 = (arc4random()%1000)*0.003; float random3 = (arc4random()%1000)*0.015; float random4 = (arc4random()%1000)*0.016; if(i%2==0){ coor.latitude = 39.915+random; coor.longitude = 116.403+random2; }else{ coor.latitude = 39.915-random3; coor.longitude = 116.403-random4; } heapmapnode_test.pt = coor; //随机生成点强度 heapmapnode_test.intensity = arc4random()*900; //添加BMKHeatMapNode到数组 [data addObject:heapmapnode_test]; [heapmapnode_test release]; } //将点数据赋值到热力图数据类 heatMap.mData = data; //调用mapView中的方法根据热力图数据添加热力图 [_mapView addHeatMap:heatMap]; } //删除热力图 -(void)removeHeatMap{ [_mapView removeHeatMap]; }
自定义覆盖物
从2.0.0开始,地图渲染采用OpenGL方式实现,因此覆盖物基类BMKOverlayView新增glRender接口,以及绘制基本线renderLinesWithPoints、面renderRegionWithPoints的接口来实现对覆盖物的OpenGL渲染。绘制自定义overlay时,继承BMKOverlayView的子类需实现glRender接口,在glRender中通过调用renderLinesWithPoints、renderRegionWithPoints来组合自己想要实现的图形。
CustomOverlayView继承BMKOverlayPathView,在CustomOverlayView中实现glRender。核心代码如下所示:
- (void)glRender {
//自定义overlay绘制 CustomOverlay *customOverlay = [self customOverlay]; if (customOverlay.pointCount >= 3) { [self renderRegionWithPoints:customOverlay.points pointCount:customOverlay.pointCount fillColor:self.fillColor usingTriangleFan:YES];//绘制多边形 }else { [self renderLinesWithPoints:customOverlay.points pointCount:customOverlay.pointCount strokeColor:self.strokeColor lineWidth:self.lineWidth looped:NO];//绘制线 } }
如果不实现glRender,则需实现drawMapRect默认使用系统GDI绘制,GDI绘制方式在overlayView尺寸较大时可能有效率问题,因此建议使用glRender来实现自定义overlay绘制。
针对已添加的自定义覆盖物,您可以通过一下方式进行删除操作:
if (overlay != nil) {
[_mapView removeOverlay:overlay]; }
OpenGL绘制功能
自v2.6.0起,iOS地图SDK为广大开发者开放了OpenGL绘制功能,开发者可利用OpenGL的绘制来实现更多复杂的覆盖物绘制。
v2.6.0新增BMKMapViewDelegate中新增-mapView:onDrawMapFrame:,地图渲染每一帧画面过程中,以及每次需要重绘地图时(例如添加覆盖物)都会调用此接口。开发者可以在这个接口中进行opengl的绘制。不需要用户自己创建context和buffer,步骤如下(具体代码请参考BaiduMap_IOSSDK_SampleOpenGL绘制功能 部分):
1、转换坐标(坐标系原点为地图中心点);
2、根据地图的状态,设置旋转和缩放比例;
3、绘制;
4.周边雷达
简介
1. 什么是周边雷达功能?
周边雷达功能,是面向移动端开发者的一套SDK功能接口。同步支持Android和iOS端。它的本质是一个连接百度LBS开放平台前端SDK产品和后端LBS云的中间服务。
2. 利用周边雷达能够实现什么?
开发者利用周边雷达功能,可以便捷的在自己的应用内,帮助用户实现查找周边跟“我”使同样一款App的人,这样一个功能。
3. 周边雷达功能的典型使用场景
(1)查看周边都有谁跟“我”使用同一个App,分布在哪里?
(2)查看周边用户在听什么歌、看什么文章、有什么新动态?
(3)查看周边有什么最新发生的新闻、资讯?
4. 使用周边雷达功能的流程
第一步 注册周边雷达
在使用周边雷达功能之前,需要对应用的密钥(Key)做相应的注册操作。周边雷达支持应用位置信息上传,及一个或多个应用之间实现相互的位置信息查看功能。
第二步 集成SDK
周边雷达是地图SDK产品的一个功能模块,需要使用周边雷达功能的开发者,需在官网下载包含周边雷达功能的地图SDK,并将其集成到自己的开发环境中即可。 具体SDK集成方式请参考《开发指南 – 配置开发环境》章节的介绍。
第三步 开发
完成周边雷达注册和SDK集成后,即可开始具体功能的开发工作。 具体使用方法请参考后文的详细介绍及官方Demo示例。
注册周边雷达功能
注册周边雷达是使用其相应功能的基础前提。通过注册可实现一个或多个应用之间的关系绑定,实现相互之间的位置信息查看。
点击如下按钮,进入我的周边雷达管理及新建页面。
初始化周边雷达功能
在使用位置信息上传和检索周边位置信息之前,需要对周边雷达功能模块进行初始化操作。初始化的核心代码如下:
1、周边雷达管理类使用了单例模式,并且通过引用计数的方式管理这个实例。可以使用使用下边的方法获取实例(引用计数加1):
BMKRadarManager *_radarManager = [BMKRadarManagergetRadarManagerInstance];
在不需要时,通过下边的方法使引用计数减1 [BMKRadarManagerreleaseRadarManagerInstance];
2、在上传和拉取位置信息前,需要设置userid,否则会自动生成.设置userid的代码如下:
[_radarManager.userId = @"baidu_mapsdk_radarid"];
3、通过添加radar delegate获取自动上传时的位置信息,以及获得雷达操作结果,代码如下:
[_radarManageraddRadarManagerDelegate:self];//添加radar delegate
在不需要时,需要移除radar delegate,否则会影响内存的释放。代码如下:
[_radarManagerremoveRadarManagerDelegate:self];//不用需移除,否则影响内存释放
位置信息上传
周边雷达功能模块,支持将用户的位置等信息上传到百度LBS云服务,从而实现应用内部及应用之间的位置信息查看。
目前支持单次位置信息上传和位置信息连续自动上传两种模式。
单次位置信息上传的核心代码如下:
//构造我的位置信息
BMKRadarUploadInfo *myinfo = [[BMKRadarUploadInfoalloc] init]; myinfo.extInfo = @"hello,world";//扩展信息 myinfo.pt = CLLocationCoordinate2DMake(39.916, 116.404);//我的地理坐标 //上传我的位置信息 BOOL res = [_radarManageruploadInfoRequest:myinfo]; if (res) { NSLog(@"upload 成功"); } else { NSLog(@"upload 失败"); }
位置信息连续自动上传的核心代码如下:
//启动自动上传用户位置信息,需要实现getRadarAutoUploadInfo获取我的位置信息
[_radarManagerstartAutoUpload:5];
周边位置检索
利用周边雷达功能,可实现周边(处于同一个周边雷达关系内)用户位置信息检索的能力。 检索过程支持距离、时间等约束条件;返回结果支持按照距离、时间远近的排序。
第一步,发起检索请求,核心代码如下:
BMKRadarNearbySearchOption *option = [[BMKRadarNearbySearchOptionalloc] init] ; option.radius = 8000;//检索半径 option.sortType = BMK_RADAR_SORT_TYPE_DISTANCE_FROM_NEAR_TO_FAR;//排序方式 option.centerPt = _CLLocationCoordinate2DMake(39.916, 116.404);//检索中心点 //发起检索 BOOL res = [_radarManagergetRadarNearbySearchRequest:option]; if (res) { NSLog(@"get 成功"); } else { NSLog(@"get 失败"); }
第二步,实现BMKRadarManagerDelegate回调方法获取结果,核心代码如下:
- (void)onGetRadarNearbySearchResult:(BMKRadarNearbyResult *)result error:(BMKRadarErrorCode)error { NSLog(@"onGetRadarNearbySearchResult %d", error); if (error == BMK_RADAR_NO_ERROR) { } }
5.
离线地图
百度地图iOS SDK开始支持矢量离线地图数据的导入,下载、更新,导入时需到官网下载对应的离线地图包,网址: http://shouji.baidu.com/map/map.html?from=3052 (具体参见iOS SDK关于离线地图下载说明及指导),通过itunes导入对应程序的共享目录,对于越狱的手机可以通过91助手拷到对应程序目录下的document目录:
//示例代码
_offlineMap = [[BMKOfflineMap alloc] init]; _offlineMap.delegate = self;
新增离线地图下载接口start,更新接口update等来实现离线地图在线下载和更新,接口参数为cityID,cityID表示城市的数字标识,每个城市唯一,示例代码如下:
NSArray* records = [_offlineMap searchCity:@"北京"]; BMKOLSearchRecord* oneRecord = [records objectAtIndex:0]; [_offlineMap start:oneRecord.cityID];
在下载或更新过程中会通过BMKOfflineMapDelegate来回调信息,还提供getOfflineCityList接口来查询支持离线地图数据的所有城市,以及getHotCityList接口来查询热点城市
注意:
1、离线地图功能属于“基础地图”这个功能模块,开发者使用时请注意选择;
2、完整的示例代码请参考相关下载demo工程中的OfflineDemoViewController.m文件;
6检索功能
简介
百度地图SDK提供的检索服务包括以下功能模块:POI检索,公交方案检索,驾车路线检索,步行路线检索,地理编码,反地理编码,公交详情检索,在线建议查询,短串分享。
每个检索功能模块都包括一个主检索对象,一个用于构造检索参数的Option结构体,和一个用于接收检索结果回调的Delegate,所有检索服务都使用异步回调模式。使用检索服务时,需要先初始化主检索对象,然后通过主检索对象以包含检索参数的Option做为参数发起检索,最后实现相应的检索功能模块的Delegate处理返回结果 。
POI检索
POI(Point of Interest),中文可以翻译为“兴趣点”。在地理信息系统中,一个POI可以是一栋房子、一个商铺、一个邮筒、一个公交站等。
百度地图SDK提供三种类型的POI检索:周边检索、区域检索和城市内检索。下面将以周边检索为例,向大家介绍如何使用检索服务。
-(void)viewDidLoad
{
//初始化检索对象 _searcher =[[BMKPoiSearch alloc]init]; _searcher.delegate = self; //发起检索 BMKNearbySearchOption *option = [[BMKNearbySearchOption alloc]init]; option.pageIndex = curPage; option.pageCapacity = 10; option.location = CLLocationCoordinate2D{39.915, 116.404}; option.keyword = @"小吃"; BOOL flag = [_searcher poiSearchNearBy:option]; [option release]; if(flag) { NSLog(@"周边检索发送成功"); } else { NSLog(@"周边检索发送失败"); } } //实现PoiSearchDeleage处理回调结果 - (void)onGetPoiResult:(BMKPoiSearch*)searcher result:(BMKPoiResult*)poiResultList errorCode:(BMKSearchErrorCode)error { if (error == BMK_SEARCH_NO_ERROR) { //在此处理正常结果 } else if (error == BMK_SEARCH_AMBIGUOUS_KEYWORD){ //当在设置城市未找到结果,但在其他城市找到结果时,回调建议检索城市列表 // result.cityList; NSLog(@"起始点有歧义"); } else { NSLog(@"抱歉,未找到结果"); } } //不使用时将delegate设置为 nil -(void)viewWillDisappear:(BOOL)animated { _searcher.delegate = nil; }
以上向大家介绍了POI检索功能的使用方法,百度地图SDK,还向广大开发者开放了POI详情信息的检索,为开发者提供更多的LBS数据支持。
POI详情检索的实现方式如下:
第一步,发起检索:
//初始化检索服务
_poisearch = [[BMKPoiSearch alloc] init]; _poisearch.delegate = self; //POI详情检索 BMKPoiDetailSearchOption* option = [[BMKPoiDetailSearchOption alloc] init]; option.poiUid = @”此处为POI的uid”;//POI搜索结果中获取的uid BOOL flag = [_poisearch poiDetailSearch:option]; [option release]; if(flag) { //详情检索发起成功 } else { //详情检索发送失败 }
第二步,设置结果监听:
-(void)onGetPoiDetailResult:(BMKPoiSearch *)searcher result:(BMKPoiDetailResult *)poiDetailResult errorCode:(BMKSearchErrorCode)errorCode { if(errorCode == BMK_SEARCH_NO_ERROR){ //在此处理正常结果 } }
公交详情信息检索
上一节POI检索返回的POI结果中,epoitype字段表示POI类型,epoitype字段值为2标示公交路线,4表示地铁路线,把这两种类型的POI的uid传给公交信息检索接口,可以得到该POI所代表的路线的详细信息(如:该公交线有多少个站点,每个站点的名称,位置等)。
公交详情信息检索接口使用示例如下:
- (void)viewDidLoad {
//初始化检索对象 _searcher =[[BMKBusLineSearch alloc]init] _searcher.delegate = self; //发起检索 BMKBusLineSearchOption *buslineSearchOption = [[BMKBusLineSearchOption alloc]init]; buslineSearchOption.city= @"北京"; buslineSearchOption.busLineUid= @"your bus line UID"; BOOL flag = [_searcher busLineSearch:buslineSearchOption]; [buslineSearchOption release]; if(flag) { NSLog(@"busline检索发送成功"); } else { NSLog(@"busline检索"); } //实现PoiSearchDeleage处理回调结果 - (void)onGetBusDetailResult:(BMKBusLineSearch*)searcher result:(BMKBusLineResult*)busLineResult errorCode:(BMKSearchErrorCode)error { if (error == BMK_SEARCH_NO_ERROR) { //在此处理正常结果 } else { NSLog(@"抱歉,未找到结果"); } } //不使用时将delegate设置为 nil -(void)viewWillDisappear:(BOOL)animated { _searcher.delegate = nil; }
路径规划
百度地图iOS SDK为开发者提供了公交换乘、驾车和步行三种类型的线路规划方案,同时根据不同的方案还可以选择“时间最短”、“距离最短”等策略来完成最终的线路规划。开发者可根据自己实际的业务需求来自由使用。自v2.7.0版本起,我们针对驾车线路规划,增加了返回多条线路结果的能力,具体使用方法,可参考我们的官网Demo。
公交换乘的线路规划实现方式如下:
-(void)viewDidLoad
{
//初始化检索对象 _searcher = [[BMKRouteSearch alloc]init]; _searcher.delegate = self; //发起检索 BMKPlanNode* start = [[[BMKPlanNode alloc]init] autorelease]; start.name = @"龙泽"; BMKPlanNode* end = [[[BMKPlanNode alloc]init] autorelease]; end.name = "西单"; BMKTransitRoutePlanOption *transitRouteSearchOption = [[BMKTransitRoutePlanOption alloc]init]; transitRouteSearchOption.city= @"北京市"; transitRouteSearchOption.startNode = start; transitRouteSearchOption.endNode = end; BOOL flag = [_searcher transitSearch:transitRouteSearchOption]; [transitRouteSearchOption release]; if(flag) { NSLog(@"bus检索发送成功"); } else { NSLog(@"bus检索发送失败"); } } //实现Deleage处理回调结果 -(void)onGetTransitRouteResult:(BMKRouteSearch*)searcher result: (BMKTransitRouteResult*)result errorCode:(BMKSearchErrorCode)error { if (error == BMK_SEARCH_NO_ERROR) { //在此处理正常结果 } else if (error == BMK_SEARCH_AMBIGUOUS_ROURE_ADDR){ //当路线起终点有歧义时通,获取建议检索起终点 //result.routeAddrResult } else { NSLog(@"抱歉,未找到结果"); } } //不使用时将delegate设置为 nil -(void)viewWillDisappear:(BOOL)animated { _searcher.delegate = nil; }
地理编码
地理编码指的是将地址信息建立空间坐标关系的过程。又可分为正向地图编码和反向地图编码。
正向地理编码指的是由地址信息转换为坐标点的过程。
反向地理编码服务实现了将地球表面的地址坐标转换为标准地址的过程。反向地理编码提供了坐标定位引擎,帮助用户通过地面某个地物的坐标值来反向查询得到该地物所在的行政区划、所处街道、以及最匹配的标准地址信息。通过丰富的标准地址库中的数据,可帮助用户在进行移动端查询、商业分析、规划分析等领域创造无限价值。
正向地理编码和反向地理编码示例如下:
-(void)viewDidLoad
{
//初始化检索对象 _searcher =[[BMKGeoCodeSearch alloc]init]; _searcher.delegate = self; BMKGeoCodeSearchOption *geoCodeSearchOption = [[BMKGeoCodeSearchOption alloc]init]; geoCodeSearchOption.city= @"北京市"; geocodeSearchOption.address = @"海淀区上地10街10号"; BOOL flag = [_searcher geoCode:geoCodeSearchOption]; [geoCodeSearchOption release]; if(flag) { NSLog(@"geo检索发送成功"); } else { NSLog(@"geo检索发送失败"); } //发起反向地理编码检索 //CLLocationCoordinate2D pt = (CLLocationCoordinate2D){39.915, 116.404}; //BMKReverseGeoCodeOption *reverseGeoCodeSearchOption = [[ //BMKReverseGeoCodeOption alloc]init]; //reverseGeoCodeSearchOption.reverseGeoPoint = pt; //BOOL flag = [_searcher reverseGeoCode:reverseGeoCodeSearchOption]; //[reverseGeoCodeSearchOption release]; //if(flag) //{ // NSLog(@"反geo检索发送成功"); //} //else //{ // NSLog(@"反geo检索发送失败"); //} } //实现Deleage处理回调结果 //接收正向编码结果 - (void)onGetGeoCodeResult:(BMKGeoCodeSearch *)searcher result:(BMKGeoCodeResult *)result errorCode:(BMKSearchErrorCode)error{ if (error == BMK_SEARCH_NO_ERROR) { //在此处理正常结果 } else { NSLog(@"抱歉,未找到结果"); } } //接收反向地理编码结果 //-(void) onGetReverseGeoCodeResult:(BMKGeoCodeSearch *)searcher result: //(BMKReverseGeoCodeResult *)result //errorCode:(BMKSearchErrorCode)error{ // if (error == BMK_SEARCH_NO_ERROR) { // 在此处理正常结果 // } // else { // NSLog(@"抱歉,未找到结果"); // } //} //不使用时将delegate设置为 nil -(void)viewWillDisappear:(BOOL)animated { _searcher.delegate = nil; }
在线建议查询
在线建议查询是指根据关键词查询在线建议词。为了帮助开发者实现检索出来的关键词快速定位到地图上,SDK自3.5.0版本起,开放了检索结果的经纬度信息及对应POI点的UID信息。
注意:
1. 在线建议检索的本质是根据部分关键是检索出来可能的完整关键词名称,如果需要这些关键词对应的POI的具体信息,请使用POI检索来完成;
2. 在线检索结果的第一条可能存在没有经纬度信息的情况,该条结果为文字联想出来的关键词结果,并不对应任何确切POI点。例如输入“肯”,第一条结果为“肯德基”,这条结果是一个泛指的名称,不会带有经纬度等信息。
在线建议检索实现方式如下:
-(void)viewDidLoad
{
//初始化检索对象 _searcher =[[BMKSuggestionSearch alloc]init]; _searcher.delegate = self; BMKSuggestionSearchOption* option = [[BMKSuggestionSearchOption alloc] init]; option.cityname = @"北京"; option.keyword = @"中关村"; BOOL flag = [_searchersuggestionSearch:option]; [option release]; if(flag) { NSLog(@"建议检索发送成功"); } else { NSLog(@"建议检索发送失败"); } } //实现Delegate处理回调结果 - (void)onGetSuggestionResult:(BMKSuggestionSearch*)searcher result:(BMKSuggestionResult*)result errorCode:(BMKSearchErrorCode)error{ if (error == BMK_SEARCH_NO_ERROR) { //在此处理正常结果 } else { NSLog(@"抱歉,未找到结果"); } } //不使用时将delegate设置为 nil -(void)viewWillDisappear:(BOOL)animated { _searcher.delegate = nil; }
短串分享
短串分享是指,用户搜索查询后得到的每一个地理位置结果将会对应一条短串(短链接),用户可以通过短信、邮件或第三方分享组件(如微博、微信等)把短串分享给其他用户从而实现地理位置信息的分享。当其他用户收到分享的短串后,点击短串即可打开手机上的百度地图客户端或者手机浏览器进行查看。
例如,用户搜索“百度大厦”后通过短信使用短串分享功能把该地点分享给好友,好友点击短信中的短串“http://j.map.baidu.com/BkmBk” 后可以调起百度地图客户端或者手机浏览器查看“百度大厦”的地理位置信息。
目前短串分享功能暂时开放了“POI详情分享”和“位置信息分享”,日后会开放更多的功能,欢迎广大开发者使用短串分享功能。
示例如下:
-(void)viewDidLoad
{
//初始化检索对象 _searcher =[[BMKShareURLSearch alloc]init]; _searcher.delegate = self; //发起短串搜索获取poi分享url BMKPoiDetailShareURLOption *detailShareUrlSearchOption = [[BMKPoiDetailShareURLOption alloc]init]; //从poi检索得到的poi的uid detailShareUrlSearchOption.uid==@"your poi uid"; BOOL flag = [_searcher requestPoiDetailShareURL:detailShareUrlSearchOption]; [detailShareUrlSearchOption release]; if(flag) { NSLog(@"详情url检索发送成功"); } else { NSLog(@"详情url检索发送失败"); } //发起位置信息分享URL检索 // BMKLocationShareURLOption *option = [[BMKLocationShareURLOption alloc]init]; // option.snippet = @"上地10街10号"; // option.name = @"百度大厦"; // option.location = CLLocationCoordinate2D{40.055,116.037}; // BOOL flag = [_searcher requestLocationShareURL:option]; // [option release]; // if(flag) // { // NSLog(@"位置信息分享URL检索发送成功"); // } // else // { // NSLog(@"位置信息分享URL发送失败"); // } } //实现Delegate处理回调结果 //处理Poi详情分享URL结果 - (void)onGetPoiDetailShareUrlResult:(BMKShareUrlSearch *)searcher result:(BMKShareURLResult *)result errorCode:(BMKSearchErrorCode)error{ if (error == BMK_SEARCH_NO_ERROR) { //在此处理正常结果 } else { NSLog(@"抱歉,未找到结果"); } } //处理位置信息你分享了URL结果 //- (void)onGetLocationShareUrlResult:(BMKShareUrlSearch *)searcher result:(BMKShareURLResult *)result errorCode:(BMKSearchErrorCode)error{ // if (error == BMK_SEARCH_NO_ERROR) { // 在此处理正常结果 // } // else { // NSLog(@"抱歉,未找到结果"); // } //} //不使用时将delegate设置为 nil -(void)viewWillDisappear:(BOOL)animated { _searcher.delegate = nil; }
7.LBS.云检索
简介
百度地图LBS云是百度地图针对LBS开发者全新推出的平台级服务,不仅适用PC应用开发,同时适用移动设备应用的开发。使用LBS云,可以实现移动开发者存储海量位置数据的服务器零成本及维护压力,且支持高效检索用户数据,且实现地图展现。 如何检索开发者自己的数据:
第一步,数据存储:首先开发者需要将待检索数据存入LBS云管理后台;
第二步,检索:利用SDK为开发者提供的接口检索自己的数据;
第三步,展示:开发者可根据自己的实际需求以多种形式(如结果列表、地图模式等)展现自己的数据。
云检索
开发者在完成数据的LBS云端存储之后,便可调用SDK云检索服务,检索自己存储在云端的数据。具体方法如下:
百度地图API提供以下几类云检索类型:本地检索,周边检索,矩形检索,详情检索。 此处以本地检索和详情检索为例说明:
第一步,在ViewController.h中声明BMKCloudSearch对象,并将ViewController实现BMKCloudSearchDelegate协议,代码如下:
@interface CloudSearchDemoViewController : UIViewController<BMKMapViewDelegate, BMKCloudSearchDelegate>{
IBOutlet BMKMapView* _mapView; BMKCloudSearch* _search; }
第二步,在ViewController.m的viewDidLoad中创建BMKCloudSearch对象,设置对应的delegate,代码如下:
- (void)viewDidLoad {
[super viewDidLoad]; //初始化云检索服务 _search = [[BMKCloudSearch alloc] init]; _search.delegate = self; }
第三步,发起本地云检索,并实现BMKCloudSearchDelegate协议中获取云检索结果的方法,代码如下:
//发起本地云检索
-(IBAction)onClickLocalSearch{
BMKCloudLocalSearchInfo *cloudLocalSearch = [[BMKCloudLocalSearchInfo alloc] init]; /* * 本示例代码使用了测试ak和测试数据,开发者在检索自己LBS数据之前,需替换 cloudLocalSearch.ak * 和cloudLocalSearch.geoTableId的值 * * 1、替换cloudLocalSearch.ak的值: * (1)请访问http://lbsyun.baidu.com/apiconsole/key申请一个“服务端”的ak,其他类型的ak无效; * (2)将申请的ak替换cloudLocalSearch.ak的值; * * 2、替换cloudLocalSearch.geoTableId值: * (1)申请完服务端ak后访问http://lbsyun.baidu.com/datamanager/datamanage创建一张表; * (2)在“表名称”处自由填写表的名称,如MyData,点击保存; * (3)“创建”按钮右方将会出现形如“MyData(34195)”字样,其中的“34195”即为geoTableId的值; * (4)添加或修改字段:点击“字段”标签修改和添加字段,然后保存; * (5)添加数据: * a、标注模式:“数据” ->“标注模式”,输入要添加的地址然后“百度一下”,点击地图蓝色图标,再点击保存即可; * b、批量模式: “数据” ->“批量模式”,可上传文件导入,具体文件格式要求请参见当页的“批量导入指南”; * (6)选择左边“设置”标签,“是否发布到检索”选择“是”,然后"保存"; * (7)数据发布后,替换cloudLocalSearch.geoTableId的值即可; * 备注:每创建一张新表后需要选择发布到检索并保存,否则将会出现检索不到数据的情况 */ cloudLocalSearch.ak = @"B266f735e43ab207ec152deff44fec8b"; cloudLocalSearch.geoTableId = 31869; cloudLocalSearch.pageIndex = 0; cloudLocalSearch.pageSize = 10; cloudLocalSearch.region = @"北京市"; cloudLocalSearch.keyword = @"天安门"; BOOL flag = [_search localSearchWithSearchInfo:cloudLocalSearch]; [cloudLocalSearch release]; if(flag){ NSLog(@"本地云检索发送成功"); }else{ NSLog(@"本地云检索发送失败"); } } //返回云检索结果回调 - (void)onGetCloudPoiResult:(NSArray*)poiResultList searchType:(int)type errorCode:(int)error{ // 清楚屏幕中所有的annotation NSArray* array = [NSArray arrayWithArray:_mapView.annotations]; [_mapView removeAnnotations:array]; if (error == BMKErrorOk) { BMKCloudPOIList* result = [poiResultList objectAtIndex:0]; for (int i = 0; i < result.POIs.count; i++) { BMKCloudPOIInfo* poi = [result.POIs objectAtIndex:i]; BMKPointAnnotation* item = [[BMKPointAnnotation alloc] init]; CLLocationCoordinate2D pt = (CLLocationCoordinate2D){ poi.longitude,poi.latitude}; item.coordinate = pt; item.title = poi.title; [_mapView addAnnotation:item]; [item release]; } } else { NSLog(@"error ==%d",error); } }
第四步,发起详情云检索,并实现BMKCloudSearchDelegate协议中获取云检索详情结果的方法,代码如下:
//发起详情云检索
-(IBAction)onClickDetailSearch{
BMKCloudDetailSearchInfo *cloudDetailSearch = [[BMKCloudDetailSearchInfo alloc] init]; cloudDetailSearch.ak = @"B266f735e43ab207ec152deff44fec8b"; cloudDetailSearch.geoTableId = 31869; cloudDetailSearch.uid = @"19150264"; BOOL flag = [_search detailSearchWithSearchInfo:cloudDetailSearch]; [cloudDetailSearch release]; if(flag){ NSLog(@"详情云检索发送成功"); }else{ NSLog(@"详情云检索发送失败"); } } - (void)onGetCloudPoiDetailResult:(BMKCloudPOIInfo*)poiDetailResult searchType:(int)type errorCode:(int)error{ // 清除屏幕中所有的annotation NSArray* array = [NSArray arrayWithArray:_mapView.annotations]; [_mapView removeAnnotations:array]; if (error == BMKErrorOk) { BMKCloudPOIInfo* poi = [poiDetailResult retain]; BMKPointAnnotation* item = [[BMKPointAnnotation alloc] init]; CLLocationCoordinate2D pt = (CLLocationCoordinate2D){ poi.longitude,poi.latitude}; item.coordinate = pt; item.title = poi.title; [_mapView addAnnotation:item]; [poi release]; [item release]; } else { NSLog(@"error ==%d",error); } }
通过以上几步操作,即可完成LBS云检索,运行结果如下图所示:
1.本地云检索
2.详情云检索
注意事项
1.LBS.云检索服务允许用户检索自有数据,包括本地检索、周边检索、矩形检索、详情检索,该服务对开发者免费开放;
2. 官方iOS SDK的云检索示例代码中,使用了测试ak,从而可以检索相关测试数据,开发者在实际使用过程中需将测试ak更换为自己的ak(此ak必须为服务端ak),还需将测试的geoTableId更换为自己的geoTableId,具体位置请参考云检索示例代码“本地云检索”中的注释;
3. 欲详细了解LBS.云的使用方法,请访问LBS.云开发指南;存入待检索数据,请访问LBS.云管理后台;
4. 开发过程中如有任何问题,也可以访问LBS开放平台论坛的“LBS.云”或“iOS开发”版块进行询问和反馈。
5. LBS云检索暂不支持多实例。
8.计算工具
简介
百度地图SDK目前提供的工具有:调启百度地图、空间计算、坐标转换、空间关系判断、收藏夹功能等。帮助开发者实现丰富的LBS功能。
调启百度地图
百度地图SDK为开发者提供了简单的接口调用,即可打开百度地图客户端,实现复杂的业务逻辑。目前所支持的调启类型有:POI周边检索、POI详情检索、步行线路规划、驾车线路规划、公交线路规划、导航。
如果在iOS9中使用了调起百度地图客户端功能,必须在”Info.plist”中进行如下配置,否则不能调起百度地图客户端。
<key>LSApplicationQueriesSchemes</key>
<array> <string>baidumap</string> </array>
如下以公交线路规划调启百度地图为例,向大家介绍具体使用方法。
当手机中安装了百度地图App并且App版本号是8.2.0及以上,可直接调起地图App,当没有安装或版本号不符合要求,则默认调起百度地图WebApp展示,开发者可通过SDK中对应的接口来设置是否支持调起WebApp。
BMKOpenTransitRouteOption *opt = [[BMKOpenTransitRouteOptionalloc] init]; opt.appScheme = @"baidumapsdk://mapsdk.baidu.com";//用于调起成功后,返回原应用 //初始化起点节点 BMKPlanNode* start = [[BMKPlanNodealloc]init]; //指定起点经纬度 CLLocationCoordinate2D coor1; coor1.latitude = 39.90868; coor1.longitude = 116.204; //指定起点名称 start.name = @"西直门"; start.pt = coor1; //指定起点 opt.startPoint = start; //初始化终点节点 BMKPlanNode* end = [[BMKPlanNodealloc]init]; CLLocationCoordinate2D coor2; coor2.latitude = 39.90868; coor2.longitude = 116.3956; end.pt = coor2; //指定终点名称 end.name = @"天安门"; opt.endPoint = end; //打开地图公交路线检索 BMKOpenErrorCode code = [BMKOpenRouteopenBaiduMapTransitRoute:opt];
空间计算
根据用户指定的两个坐标点,计算这两个点的实际地理距离。核心代码如下:
BMKMapPoint point1 = BMKMapPointForCoordinate(CLLocationCoordinate2DMake(39.915,116.404)); BMKMapPoint point2 = BMKMapPointForCoordinate(CLLocationCoordinate2DMake(38.915,115.404)); CLLocationDistance distance = BMKMetersBetweenMapPoints(point1,point2);
坐标转换
百度地图SDK采用的是百度自有的地理坐标系(bdll09),因此开发者在做位置标注的时候,需要将其他类型的坐标转换为百度坐标。相应的接口和转换方式如下:
CLLocationCoordinate2D test = CLLocationCoordinate2DMake(39.90868, 116.3956); //转换 google地图、soso地图、aliyun地图、mapabc地图和amap地图所用坐标至百度坐标 NSDictionary* testdic = BMKConvertBaiduCoorFrom(test,BMK_COORDTYPE_COMMON); //转换GPS坐标至百度坐标 testdic = BMKConvertBaiduCoorFrom(test,BMK_COORDTYPE_GPS); NSLog(@"x=%@,y=%@",[testdic objectForKey:@"x"],[testdic objectForKey:@"y"]);
空间关系判断
提供相应的接口能力,判断点与圆或多边形的位置关系。
判断点与圆位置关系的示例代码如下:
BOOL ptInCircle = BMKCircleContainsCoordinate(CLLocationCoordinate2DMake(39.918,116.408), CLLocationCoordinate2DMake(39.915,116.404), 1000);
除以上位置关系判断方法外,SDK还提供获取折线上与折线外指定位置最近点的方法。核心代码如下:
BMKMapPoint *polylinePoints = new BMKMapPoint[4]; polylinePoints[0]= BMKMapPointForCoordinate(CLLocationCoordinate2DMake(39.915,116.404)); polylinePoints[1]= BMKMapPointForCoordinate(CLLocationCoordinate2DMake(39.915,116.454));; polylinePoints[2]= BMKMapPointForCoordinate(CLLocationCoordinate2DMake(39.975,116.524));; polylinePoints[3]= BMKMapPointForCoordinate(CLLocationCoordinate2DMake(39.855,116.554)); BMKMapPoint point = BMKMapPointForCoordinate(CLLocationCoordinate2DMake(39.815,116.504)); BMKMapPoint nearestPoint = BMKGetNearestMapPointFromPolyline(point, polylinePoints, 4);
收藏夹功能
iOS地图SDK自v2.8.0版本起,向开发者开放了本地收藏夹功能,帮助开发者更好的收藏、管理本地空间点信息数据。
具体使用方法如下:
1、 初始化收藏夹管理类:
BMKFavPoiManager *_favManager = [[BMKFavPoiManageralloc] init];//初始化收藏夹管理类
2、 添加一个收藏点,核心代码如下:
//构造收藏点信息
BMKFavPoiInfo *poiInfo = [[BMKFavPoiInfoalloc] init]; poiInfo.pt = CLLocationCoordinate2DMake(39.908, 116.204);//收藏点坐标 poiInfo.poiName = @"收藏点名称";//收藏点名称 //添加收藏点(收藏点功后会得到favId) NSInteger res = [_favManageraddFavPoi:poiInfo];
3、 获取收藏点,核心代码如下:
//获取所有收藏点
NSArray *allFavPois = [_favManagergetAllFavPois]; //获取某个收藏点(收藏点成功后会得到favId) BMKFavPoiInfo *favPoi = [_favManagergetFavPoi:favId];
4、 删除收藏的点,核心代码如下:
//删除所有收藏点
BOOL res = [_favManagerclearAllFavPois];
//删除某个收藏点(收藏点成功后会得到favId) BOOL res = [_favManagerdeleteFavPoi:favId];
.定位功能
简介
由于系统原因,iOS不允许使用第三方定位,因此地图SDK中的定位方法,本质上是对原生定位的二次封装。通过封装,开发者可更便捷的使用。此外,地图SDK中还提供了相应的定位图层(支持定位三态效果),帮助开发者显示当前位置信息。
注:自iOS8起,系统定位功能进行了升级,SDK为了实现最新的适配,自v2.5.0起也做了相应的修改,开发者在使用定位功能之前,需要在info.plist里添加(以下二选一,两个都添加默认使用NSLocationWhenInUseUsageDescription):
NSLocationWhenInUseUsageDescription ,允许在前台使用时获取GPS的描述
NSLocationAlwaysUsageDescription ,允许永久使用GPS的描述
获取位置信息
定位功能可以和地图功能分离使用,单独的定位功能使用方式如下:
-(void)viewDidLoad
{
//设置定位精确度,默认:kCLLocationAccuracyBest [BMKLocationServicesetLocationDesiredAccuracy:kCLLocationAccuracyNearestTenMeters]; //指定最小距离更新(米),默认:kCLDistanceFilterNone [BMKLocationServicesetLocationDistanceFilter:100.f]; //初始化BMKLocationService _locService = [[BMKLocationService alloc]init]; _locService.delegate = self; //启动LocationService [_locService startUserLocationService]; } //实现相关delegate 处理位置信息更新 //处理方向变更信息 - (void)didUpdateUserHeading:(BMKUserLocation *)userLocation { //NSLog(@"heading is %@",userLocation.heading); } //处理位置坐标更新 - (void)didUpdateBMKUserLocation:(BMKUserLocation *)userLocation { //NSLog(@"didUpdateUserLocation lat %f,long %f",userLocation.location.coordinate.latitude,userLocation.location.coordinate.longitude); }
展示定位信息
展示定位信息的功能位于“地图和覆盖物”这个功能模块,开发者在使用时要注意选择。核心代码如下:(完整信息请参考Demo)
//普通态
//以下_mapView为BMKMapView对象
_mapView.showsUserLocation = YES;//显示定位图层 [_mapView updateLocationData:userLocation];
原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/6082.html