檢索功能
1. 簡介
百度地圖SDK提供的檢索服務包括以下功能模塊:POI檢索,公交方案檢索,駕車路線檢索,步行路線檢索,地理編碼,反地理編碼,公交詳情檢索,在線建議查詢,短串分享。
每個檢索功能模塊都包括一個主檢索對象,一個用于構造檢索參數(shù)的Option結構體,和一個用于接收檢索結果回調的Delegate,所有檢索服務都使用異步回調模式。使用檢索服務時,需要先初始化主檢索對象,然后通過主檢索對象以包含檢索參數(shù)的Option做為參數(shù)發(fā)起檢索,最后實現(xiàn)相應的檢索功能模塊的Delegate處理返回結果 。
2. POI檢索
POI(Point of Interest),中文可以翻譯為“興趣點”。在地理信息系統(tǒng)中,一個POI可以是一棟房子、一個商鋪、一個郵筒、一個公交站等。
百度地圖SDK提供三種類型的POI檢索:周邊檢索、區(qū)域檢索和城市內(nèi)檢索。下面將以周邊檢索為例,向大家介紹如何使用檢索服務。
-(void)viewDidLoad{
//初始化檢索對象
_searcher = [[BMKPoiSearch alloc]init];
_searcher.delegate=self;
//發(fā)起檢索
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(@"周邊檢索發(fā)送成功");
}else{
NSLog(@"周邊檢索發(fā)送失敗");}}
//實現(xiàn)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,還向廣大開發(fā)者開放了POI詳情信息的檢索,為開發(fā)者提供更多的LBS數(shù)據(jù)支持。
POI詳情檢索的實現(xiàn)方式如下:
第一步,發(fā)起檢索:
//初始化檢索服務
_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){
//詳情檢索發(fā)起成功
}else{
//詳情檢索發(fā)送失敗 }
第二步,設置結果監(jiān)聽:
-(void)onGetPoiDetailResult:(BMKPoiSearch*)searcher result:(BMKPoiDetailResult*)poiDetailResult errorCode:(BMKSearchErrorCode)errorCode{
if(errorCode == BMK_SEARCH_NO_ERROR){
//在此處理正常結果
}}
公交詳情信息檢索
上一節(jié)POI檢索返回的POI結果中,epoitype字段表示POI類型,epoitype字段值為2標示公交路線,4表示地鐵路線,把這兩種類型的POI的uid傳給公交信息檢索接口,可以得到該POI所代表的路線的詳細信息(如:該公交線有多少個站點,每個站點的名稱,位置等)。
公交詳情信息檢索接口使用示例如下:
-(void)viewDidLoad{
//初始化檢索對象
_searcher = [[BMKBusLineSearch alloc]init];
_searcher.delegate=self;
//發(fā)起檢索
BMKBusLineSearchOption *buslineSearchOption = [[BMKBusLineSearchOption alloc]init];
buslineSearchOption.city = @"北京";
buslineSearchOption.busLineUid = @"your bus line UID";
BOOL flag=[_searcher busLineSearch:buslineSearchOption];
if(flag){
NSLog(@"busline檢索發(fā)送成功");
}else{
NSLog(@"busline檢索");
}
//實現(xiàn)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. 路徑規(guī)劃
百度地圖iOS SDK為開發(fā)者提供了公交換乘、駕車和步行三種類型的線路規(guī)劃方案,同時根據(jù)不同的方案還可以選擇“時間最短”、“距離最短”等策略來完成最終的線路規(guī)劃。開發(fā)者可根據(jù)自己實際的業(yè)務需求來自由使用。自v2.7.0版本起,我們針對駕車線路規(guī)劃,增加了返回多條線路結果的能力,具體使用方法,可參考我們的官網(wǎng)Demo。
公交換乘的線路規(guī)劃實現(xiàn)方式如下:
-(void)viewDidLoad{
//初始化檢索對象
_searcher = [[BMKRouteSearch alloc]init];
_searcher.delegate=self;
//發(fā)起檢索
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檢索發(fā)送成功");
}else{
NSLog(@"bus檢索發(fā)送失敗");}}
//實現(xiàn)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. 地理編碼
地理編碼指的是將地址信息建立空間坐標關系的過程。又可分為正向地圖編碼和反向地圖編碼。
正向地理編碼指的是由地址信息轉換為坐標點的過程。
反向地理編碼服務實現(xiàn)了將地球表面的地址坐標轉換為標準地址的過程。反向地理編碼提供了坐標定位引擎,幫助用戶通過地面某個地物的坐標值來反向查詢得到該地物所在的行政區(qū)劃、所處街道、以及最匹配的標準地址信息。通過豐富的標準地址庫中的數(shù)據(jù),可幫助用戶在進行移動端查詢、商業(yè)分析、規(guī)劃分析等領域創(chuàng)造無限價值。
正向地理編碼和反向地理編碼示例如下:
-(void)viewDidLoad{
//初始化檢索對象
_searcher = [[BMKGeoCodeSearch alloc]init];
_searcher.delegate=self;
BMKGeoCodeSearchOption *geoCodeSearchOption = [[BMKGeoCodeSearchOption alloc]init];
geoCodeSearchOption.city = @"北京市";
geocodeSearchOption.address = @"海淀區(qū)上地10街10號";
BOOL flag = [_searcher geoCode:geoCodeSearchOption];
if(flag){
NSLog(@"geo檢索發(fā)送成功");
}else{
NSLog(@"geo檢索發(fā)送失敗");}
//發(fā)起反向地理編碼檢索
//CLLocationCoordinate2D pt = (CLLocationCoordinate2D){39.915, 116.404};
//BMKReverseGeoCodeOption *reverseGeoCodeSearchOption = [[//BMKReverseGeoCodeOption alloc]init];
//reverseGeoCodeSearchOption.reverseGeoPoint = pt;
//BOOL flag = [_searcher reverseGeoCode:reverseGeoCodeSearchOption];
//if(flag)
//{
// NSLog(@"反geo檢索發(fā)送成功");
//}
//else
//{
// NSLog(@"反geo檢索發(fā)送失敗");
//}}
//實現(xiàn)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. 在線建議查詢
在線建議查詢是指根據(jù)關鍵詞查詢在線建議詞。為了幫助開發(fā)者實現(xiàn)檢索出來的關鍵詞快速定位到地圖上,SDK自2.5.0版本起,開放了檢索結果的經(jīng)緯度信息及對應POI點的UID信息。
注意:
1. 在線建議檢索的本質是根據(jù)部分關鍵是檢索出來可能的完整關鍵詞名稱,如果需要這些關鍵詞對應的POI的具體信息,請使用POI檢索來完成;
2. 在線檢索結果的第一條可能存在沒有經(jīng)緯度信息的情況,該條結果為文字聯(lián)想出來的關鍵詞結果,并不對應任何確切POI點。例如輸入“肯”,第一條結果為“肯德基”,這條結果是一個泛指的名稱,不會帶有經(jīng)緯度等信息。
在線建議檢索實現(xiàn)方式如下:
-(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(@"建議檢索發(fā)送成功");
}else{
NSLog(@"建議檢索發(fā)送失敗");
}}
//實現(xiàn)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. 短串分享
短串分享是指,用戶搜索查詢后得到的每一個地理位置結果將會對應一條短串(短鏈接),用戶可以通過短信、郵件或第三方分享組件(如微博、微信等)把短串分享給其他用戶從而實現(xiàn)地理位置信息的分享。當其他用戶收到分享的短串后,點擊短串即可打開手機上的百度地圖客戶端或者手機瀏覽器進行查看。
例如,用戶搜索“百度大廈”后通過短信使用短串分享功能把該地點分享給好友,好友點擊短信中的短串“http://j.map.baidu.com/BkmBk”后可以調起百度地圖客戶端或者手機瀏覽器查看“百度大廈”的地理位置信息。
目前短串分享功能暫時開放了“POI詳情分享”和“位置信息分享”,日后會開放更多的功能,歡迎廣大開發(fā)者使用短串分享功能。
示例如下:
-(void)viewDidLoad{
//初始化檢索對象
_searcher = [[BMKShareURLSearch alloc]init];
_searcher.delegate=self;
//發(fā)起短串搜索獲取poi分享url
BMKPoiDetailShareURLOption *detailShareUrlSearchOption = [[BMKPoiDetailShareURLOption alloc]init];
//從poi檢索得到的poi的uid
detailShareUrlSearchOption.uid == @"your poi uid";
BOOL flag = [_searcher requestPoiDetailShareURL:detailShareUrlSearchOption];
if(flag){
NSLog(@"詳情url檢索發(fā)送成功");
}else{
NSLog(@"詳情url檢索發(fā)送失敗");}
//發(fā)起位置信息分享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檢索發(fā)送成功");
//? }
//? else
//? {
// NSLog(@"位置信息分享URL發(fā)送失敗");
// ?}
}
//實現(xiàn)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開發(fā)者全新推出的平臺級服務,不僅適用PC應用開發(fā),同時適用移動設備應用的開發(fā)。使用LBS云,可以實現(xiàn)移動開發(fā)者存儲海量位置數(shù)據(jù)的服務器零成本及維護壓力,且支持高效檢索用戶數(shù)據(jù),且實現(xiàn)地圖展現(xiàn)。 如何檢索開發(fā)者自己的數(shù)據(jù):
第一步,數(shù)據(jù)存儲:首先開發(fā)者需要將待檢索數(shù)據(jù)存入LBS云管理后臺;
第二步,檢索:利用SDK為開發(fā)者提供的接口檢索自己的數(shù)據(jù);
第三步,展示:開發(fā)者可根據(jù)自己的實際需求以多種形式(如結果列表、地圖模式等)展現(xiàn)自己的數(shù)據(jù)。
云檢索
開發(fā)者在完成數(shù)據(jù)的LBS云端存儲之后,便可調用SDK云檢索服務,檢索自己存儲在云端的數(shù)據(jù)。具體方法如下:
百度地圖API提供以下幾類云檢索類型:本地檢索,周邊檢索,矩形檢索,詳情檢索。 此處以本地檢索和詳情檢索為例說明:
第一步,在ViewController.h中聲明BMKCloudSearch對象,并將ViewController實現(xiàn)BMKCloudSearchDelegate協(xié)議,代碼如下:
@interface CloudSearchDemoViewController:UIViewController
{
IBOutlet BMKMapView *_mapView;
BMKCloudSearch *_search;
}
第二步,在ViewController.m的viewDidLoad中創(chuàng)建BMKCloudSearch對象,設置對應的delegate,代碼如下:
- (void)viewDidLoad{
[superviewDidLoad];
//初始化云檢索服務
_search = [[BMKCloudSearch alloc] init];
_search.delegate = self;
}
第三步,發(fā)起本地云檢索,并實現(xiàn)BMKCloudSearchDelegate協(xié)議中獲取云檢索結果的方法,代碼如下:
//發(fā)起本地云檢索
- (IBAction)onClickLocalSearch{
BMKCloudLocalSearchInfo *cloudLocalSearch = [[BMKCloudLocalSearchInfo alloc]init];
/*
* 本示例代碼使用了測試ak和測試數(shù)據(jù),開發(fā)者在檢索自己LBS數(shù)據(jù)之前,需替換 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創(chuàng)建一張表;
* (2)在“表名稱”處自由填寫表的名稱,如MyData,點擊保存;
* (3)“創(chuàng)建”按鈕右方將會出現(xiàn)形如“MyData(34195)”字樣,其中的“34195”即為geoTableId的值;
* (4)添加或修改字段:點擊“字段”標簽修改和添加字段,然后保存;
* (5)添加數(shù)據(jù):
*? a、標注模式:“數(shù)據(jù)” ->“標注模式”,輸入要添加的地址然后“百度一下”,點擊地圖藍色圖標,再點擊保存即可;
*? b、批量模式: “數(shù)據(jù)” ->“批量模式”,可上傳文件導入,具體文件格式要求請參見當頁的“批量導入指南”;
* (6)選擇左邊“設置”標簽,“是否發(fā)布到檢索”選擇“是”,然后"保存";
* (7)數(shù)據(jù)發(fā)布后,替換cloudLocalSearch.geoTableId的值即可;
* 備注:每創(chuàng)建一張新表后需要選擇發(fā)布到檢索并保存,否則將會出現(xiàn)檢索不到數(shù)據(jù)的情況
*/
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(@"本地云檢索發(fā)送成功");
}else{
NSLog(@"本地云檢索發(fā)送失敗");
}
}
//返回云檢索結果回調
- (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];
...
第四步,發(fā)起詳情云檢索,并實現(xiàn)BMKCloudSearchDelegate協(xié)議中獲取云檢索詳情結果的方法,代碼如下:
//發(fā)起詳情云檢索
- (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(@"詳情云檢索發(fā)送成功");
}else{
NSLog(@"詳情云檢索發(fā)送失敗");
}
}
- (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.云檢索服務允許用戶檢索自有數(shù)據(jù),包括本地檢索、周邊檢索、矩形檢索、詳情檢索,該服務對開發(fā)者免費開放;
2. 官方iOS SDK的云檢索示例代碼中,使用了測試ak,從而可以檢索相關測試數(shù)據(jù),開發(fā)者在實際使用過程中需將測試ak更換為自己的ak(此ak必須為服務端ak),還需將測試的geoTableId更換為自己的geoTableId,具體位置請參考云檢索示例代碼“本地云檢索”中的注釋;
3. 欲詳細了解LBS.云的使用方法,請訪問LBS.云開發(fā)指南;存入待檢索數(shù)據(jù),請訪問LBS.云管理后臺;
4. 開發(fā)過程中如有任何問題,也可以訪問LBS開放平臺論壇的“LBS.云”或“iOS開發(fā)”版塊進行詢問和反饋。
5. LBS云檢索暫不支持多實例。