百度地圖SDK提供的檢索服務(wù)包括以下功能模塊:
POI檢索更振,
公交方案檢索炕桨,
駕車(chē)路線檢索,
步行路線檢索肯腕,
行政區(qū)邊界數(shù)據(jù)檢索献宫,
地理編碼,
反地理編碼实撒,
公交詳情檢索遵蚜,
在線建議查詢(xún)帖池,
短串分享(包括POI搜索結(jié)果分享、駕車(chē)/公交/騎行/步行路線規(guī)劃分享吭净、反向地理編碼結(jié)果分享)。
每個(gè)檢索功能模塊都包括一個(gè)主檢索對(duì)象肴甸,一個(gè)用于構(gòu)造檢索參數(shù)的Option結(jié)構(gòu)體寂殉,和一個(gè)用于接收檢索結(jié)果回調(diào)的Delegate,所有檢索服務(wù)都使用異步回調(diào)模式原在。使用檢索服務(wù)時(shí)友扰,需要先初始化主檢索對(duì)象,然后通過(guò)主檢索對(duì)象以包含檢索參數(shù)的Option做為參數(shù)發(fā)起檢索庶柿,最后實(shí)現(xiàn)相應(yīng)的檢索功能模塊的Delegate處理返回結(jié)果 村怪。
更加具體的使用詳情可以參看 [百度地圖檢索功能]
(http://lbsyun.baidu.com/index.php?title=iossdk/guide/retrieval)
1 POI周邊檢索
POI(Point of Interest),中文可以翻譯為“興趣點(diǎn)”浮庐。在地理信息系統(tǒng)中甚负,一個(gè)POI可以是一棟房子、一個(gè)商鋪审残、一個(gè)郵筒梭域、一個(gè)公交站等。
百度地圖SDK提供三種類(lèi)型的POI檢索:周邊檢索搅轿、區(qū)域檢索和城市內(nèi)檢索病涨。下面將以周邊檢索為例,向大家介紹如何使用檢索服務(wù)璧坟。
1.1 在頁(yè)面上定義一個(gè)輸入框既穆,內(nèi)容改變時(shí)發(fā)起檢索
注意檢查 nearBySearchOption.location 內(nèi)容是否正確,否則總是檢索不到結(jié)果
UITextField *poiTextField = [[UITextField alloc] initWithFrame:CGRectMake(30, 30, 100, 20)];
poiTextField.backgroundColor = [UIColor lightGrayColor];
[poiTextField addTarget:self action:@selector(valueChange:) forControlEvents:UIControlEventEditingChanged];
[self.view addSubview:poiTextField];
- (void)valueChange:(UITextField *)textField {
_poiSearch = [[BMKPoiSearch alloc]init];
_poiSearch.delegate = self;
// 附近云檢索
BMKNearbySearchOption *nearBySearchOption = [[BMKNearbySearchOption alloc]init];
// 檢索關(guān)鍵字
nearBySearchOption.keyword = textField.text;
// 檢索中心點(diǎn)及半徑
nearBySearchOption.location = _locService.userLocation.location.coordinate;
nearBySearchOption.radius = 10000;
// 搜索結(jié)果排序雀鹃,距離由近到遠(yuǎn)
nearBySearchOption.sortType = BMK_POI_SORT_BY_DISTANCE;
// 分頁(yè)索引及數(shù)量
nearBySearchOption.pageIndex = 0;
nearBySearchOption.pageCapacity = 10;
// 開(kāi)始檢索幻工,結(jié)果在代理方法 onGetPoiResult 中返回
BOOL flag = [_poiSearch poiSearchNearBy:nearBySearchOption];
if (flag) {
NSLog(@"搜索成功--%@", textField.text);
}else {
NSLog(@"搜索失敗");
}
}
1.2 結(jié)果監(jiān)聽(tīng)
調(diào)用 poiSearchNearBy 方法后,檢索結(jié)果 在代理方法 onGetPoiResult 中返回褐澎,poiResult.poiInfoList 就是檢索到的結(jié)果会钝,是一個(gè) BMKPoiInfo 的集合,每個(gè)BMKPoiInfo包含該檢索點(diǎn)的名稱(chēng)工三,地址迁酸,uid等詳細(xì)信息。
- (void)onGetPoiResult:(BMKPoiSearch *)searcher result:(BMKPoiResult *)poiResult errorCode:(BMKSearchErrorCode)errorCode {
if (errorCode == BMK_SEARCH_NO_ERROR) {
for (int i = 0; i < poiResult.poiInfoList.count; i++) {
BMKPoiInfo *info = [poiResult.poiInfoList objectAtIndex:i];
NSLog(@"地址:%@---%@---%@", info.city ,info.name, info.address);
}
}else {
NSLog(@"檢索異常-%d", errorCode);
}
}
1.3 展示
1.3.1 把這些數(shù)據(jù)顯示到tableview上俭正,就是我們常見(jiàn)的搜索框搜索得到對(duì)應(yīng)的結(jié)果奸鬓。
1.3.2 或者將搜索出來(lái)的結(jié)果通過(guò)大頭針展示在地圖上:
- (void)onGetPoiResult:(BMKPoiSearch *)searcher result:(BMKPoiResult *)poiResult errorCode:(BMKSearchErrorCode)errorCode {
// 清楚屏幕中所有的annotation
NSArray* array = [NSArray arrayWithArray:_mapView.annotations];
[_mapView removeAnnotations:array];
if (errorCode == BMK_SEARCH_NO_ERROR) {
NSMutableArray *arrM = [NSMutableArray array];
for (int i = 0; i < poiResult.poiInfoList.count; i++) {
BMKPoiInfo *info = [poiResult.poiInfoList objectAtIndex:i];
NSLog(@"地址:%@---%@---%@", info.city ,info.name, info.address);
BMKPointAnnotation* item = [[BMKPointAnnotation alloc]init];
item.coordinate = info.pt;
item.title = info.name;
[arrM addObject:item];
}
[_mapView addAnnotations:arrM];
[_mapView showAnnotations:arrM animated:YES];
self.poiResultArr = poiResult.poiInfoList;
[self.tableView reloadData];
}else {
NSLog(@"檢索異常-%d", errorCode);
}
}
2 公交詳情信息檢索-基于POI
基于上面POI檢索返回的POI結(jié)果中,BMKPoiInfo有一屬性epoitype掸读,表示POI類(lèi)型串远,epoitype字段值為2標(biāo)示公交路線宏多,4表示地鐵路線,把這兩種類(lèi)型的POI的 uid 傳給公交信息檢索接口澡罚,可以得到該P(yáng)OI所代表的路線的詳細(xì)信息(如:該公交線有多少個(gè)站點(diǎn)伸但,每個(gè)站點(diǎn)的名稱(chēng),位置留搔、參考票價(jià)和上下線行信息)更胖。
點(diǎn)擊tableView調(diào)用 公交詳情信息檢索,代碼如下:
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return self.poiResultArr.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"ID"];
if (!cell) {
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"ID"];
}
BMKPoiInfo *info = self.poiResultArr[indexPath.row];
cell.textLabel.text = info.name;
return cell;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
BMKPoiInfo *info = self.poiResultArr[indexPath.row];
if (info.epoitype == 2 || info.epoitype == 4) {
// 發(fā)起公交檢索
[self startBusLineSearchWithCity:info.city uid:info.uid];
}else {
NSLog(@"這不是一條公交線路");
}
[tableView deselectRowAtIndexPath:indexPath animated:YES];
}
#pragma mark
#pragma mark -- 公交方案檢索
- (void)startBusLineSearchWithCity:(NSString *)city uid:(NSString *)uid{
_busLineSearch = [[BMKBusLineSearch alloc]init];
_busLineSearch.delegate = self;
BMKBusLineSearchOption *option = [[BMKBusLineSearchOption alloc]init];
option.city = city;
option.busLineUid = uid;
BOOL flag = [_busLineSearch busLineSearch:option];
if(flag)
{
NSLog(@"busline檢索發(fā)送成功 %@---%@", city, uid);
}
else
{
NSLog(@"busline檢索失敗");
}
}
- (void)onGetBusDetailResult:(BMKBusLineSearch *)searcher result:(BMKBusLineResult *)busLineResult errorCode:(BMKSearchErrorCode)error {
if (error == BMK_SEARCH_NO_ERROR) {
//在此處理正常結(jié)果
NSLog(@"%@,共有%zd站",busLineResult.busLineName, busLineResult.busStations.count);
}
else {
NSLog(@"抱歉隔显,未找到Bus結(jié)果%d",error);
}
}
注意代理控制:
-(void)viewWillDisappear:(BOOL)animated
{
[_mapView viewWillDisappear];
_mapView.delegate = nil; // 不用時(shí)却妨,置nil,否則影響內(nèi)存的釋放
_locService.delegate = nil;
_poiSearch.delegate = nil;
_busLineSearch.delegate = nil;
}
分別點(diǎn)擊下面第1條,第3條括眠,第4條彪标,打印結(jié)果: