iOS 百度地图v2.9.1 API 的详细使用(四)

检索功能

1. 简介

百度地图SDK提供的检索服务包括以下功能模块:POI检索,公交方案检索,驾车路线检索,步行路线检索,地理编码,反地理编码,公交详情检索,在线建议查询,短串分享。

每个检索功能模块都包括一个主检索对象,一个用于构造检索参数的Option结构体,和一个用于接收检索结果回调的Delegate,所有检索服务都使用异步回调模式。使用检索服务时,需要先初始化主检索对象,然后通过主检索对象以包含检索参数的Option做为参数发起检索,最后实现相应的检索功能模块的Delegate处理返回结果 。

2. 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];

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];

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];

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;

}

3. 路径规划

百度地图iOS SDK为开发者提供了公交换乘、驾车和步行三种类型的线路规划方案,同时根据不同的方案还可以选择“时间最短”、“距离最短”等策略来完成最终的线路规划。开发者可根据自己实际的业务需求来自由使用。自v2.7.0版本起,我们针对驾车线路规划,增加了返回多条线路结果的能力,具体使用方法,可参考我们的官网Demo。

公交换乘的线路规划实现方式如下:

-(void)viewDidLoad{

//初始化检索对象

_searcher = [[BMKRouteSearch alloc]init];

_searcher.delegate=self;

//发起检索

BMKPlanNode *start = [[BMKPlanNode alloc]init];

start.name = @"龙泽";

BMKPlanNode *end = [[BMKPlanNode alloc]init];

end.name = "西单";

BMKTransitRoutePlanOption *transitRouteSearchOption = [[BMKTransitRoutePlanOption alloc]init];

transitRouteSearchOption.city = @"北京市";

transitRouteSearchOption.startNode = start;

transitRouteSearchOption.endNode = end;

BOOL flag = [_searcher transitSearch:transitRouteSearchOption];

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;

}

4. 地理编码

地理编码指的是将地址信息建立空间坐标关系的过程。又可分为正向地图编码和反向地图编码。

正向地理编码指的是由地址信息转换为坐标点的过程。

反向地理编码服务实现了将地球表面的地址坐标转换为标准地址的过程。反向地理编码提供了坐标定位引擎,帮助用户通过地面某个地物的坐标值来反向查询得到该地物所在的行政区划、所处街道、以及最匹配的标准地址信息。通过丰富的标准地址库中的数据,可帮助用户在进行移动端查询、商业分析、规划分析等领域创造无限价值。

正向地理编码和反向地理编码示例如下:

-(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];

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];

//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;

}

5. 在线建议查询

在线建议查询是指根据关键词查询在线建议词。为了帮助开发者实现检索出来的关键词快速定位到地图上,SDK自2.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=[_searcher suggestion Search:option];

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;

}

6. 短串分享

短串分享是指,用户搜索查询后得到的每一个地理位置结果将会对应一条短串(短链接),用户可以通过短信、邮件或第三方分享组件(如微博、微信等)把短串分享给其他用户从而实现地理位置信息的分享。当其他用户收到分享的短串后,点击短串即可打开手机上的百度地图客户端或者手机浏览器进行查看。

例如,用户搜索“百度大厦”后通过短信使用短串分享功能把该地点分享给好友,好友点击短信中的短串“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];

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 requestLocation ShareURL:option];

//  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;

}

------------------------------------------------------------------

云检索

1.简介

百度地图LBS云是百度地图针对LBS开发者全新推出的平台级服务,不仅适用PC应用开发,同时适用移动设备应用的开发。使用LBS云,可以实现移动开发者存储海量位置数据的服务器零成本及维护压力,且支持高效检索用户数据,且实现地图展现。 如何检索开发者自己的数据:

第一步,数据存储:首先开发者需要将待检索数据存入LBS云管理后台

第二步,检索:利用SDK为开发者提供的接口检索自己的数据;

第三步,展示:开发者可根据自己的实际需求以多种形式(如结果列表、地图模式等)展现自己的数据。

云检索

开发者在完成数据的LBS云端存储之后,便可调用SDK云检索服务,检索自己存储在云端的数据。具体方法如下:

百度地图API提供以下几类云检索类型:本地检索,周边检索,矩形检索,详情检索。 此处以本地检索和详情检索为例说明:

第一步,在ViewController.h中声明BMKCloudSearch对象,并将ViewController实现BMKCloudSearchDelegate协议,代码如下:

@interface CloudSearchDemoViewController:UIViewController

{

IBOutlet BMKMapView *_mapView;

BMKCloudSearch *_search;

}

第二步,在ViewController.m的viewDidLoad中创建BMKCloudSearch对象,设置对应的delegate,代码如下:

- (void)viewDidLoad{

[superviewDidLoad];

//初始化云检索服务

_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];

...

第四步,发起详情云检索,并实现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云检索暂不支持多实例。

推荐阅读更多精彩内容