iOSPOI檢索詳細總結

iOS百度地圖路徑規劃和POI檢索詳細總結c++


路徑規劃.png

百度地圖的使用

百度地圖API的導入網上說了許多坑,不過我遇到的比較少,這裏就放兩個比較常見的吧。
坑一:sql


奧聯WIFI_xcodeproj.png


如上圖所示,在infoplist里加入這個字段,並且這裏還能夠設置提示的內容。不加的話,嘿嘿嘿,期待你的嘗試。
坑二:以下圖api


Pasted_Graphic_jpg.png


導入百度地圖API運行以後報上圖錯誤大約18到20個左右,解決方法添加libstdc++.6.0.9 的庫。
填完坑以後看一下咱們今天要演示的效果吧。數組


路線規劃圖.gif


這裏實現的內容就是在定位到的當前城市內的路徑規劃,實現駕車,公交,步行三種規劃方式。xcode

注意要點:
  • 這裏咱們採用的是地點到地點之間的路徑規劃,因此咱們在查詢的過程當中必定要設置查詢的城市,否則沒法查找成功(固然也能夠用經緯度的方式,那就另說了)。
  • 方式切換問題,若是咱們想要像上圖所示的不一樣路徑規劃間的切換,咱們要注意的就是地圖上已經存在的路線軌跡和標註的清除問題。
  • 咱們在不一樣條件下規劃路徑要注意他們是不一樣的查詢方法,以及他們不一樣的協議方法,這個咱們能夠具體點進百度地圖靜態庫的方法去查看。

代碼的實現

因爲在項目中,並無整理出來,這裏咱們就貼一些主要的代碼。
由於三種路徑規劃其實原理一致這裏咱們以駕車的路徑規劃作一個例子。
由於要顧及到在此以前是否有軌跡和標註所以咱們要先作清除處理,代碼以下post

[_mapView removeOverlays:_mapView.overlays]; NSArray *annArray = [[NSArray alloc]initWithArray:_mapView.annotations]; [_mapView removeAnnotations: annArray];

以後咱們建立路徑規劃的方法動畫

_searcher = [[BMKRouteSearch alloc]init];
  _searcher.delegate = self;

 //發起檢索
    BMKPlanNode* start = [[BMKPlanNode alloc]init] ; start.name = _startFiled.text; BMKPlanNode* end = [[BMKPlanNode alloc]init]; end.name = _endFiled.text; start.cityName = self.city; end.cityName = self.city; BMKDrivingRoutePlanOption *driveRouteSearchOption =[[BMKDrivingRoutePlanOption alloc]init]; driveRouteSearchOption.from = start; driveRouteSearchOption.to = end;

這裏要注意的就是由於咱們是駕車路徑規劃,因此建立的是BMKDrivingRoutePlanOption,咱們進入到內部方法能夠看到,入過咱們是公交和步行對應的則是他們各自的Option,發起檢索成功後會調取他的協議方法,這裏的前提是要遵循BMKRouteSearchDelegate協議ui

- (void)onGetDrivingRouteResult:(BMKRouteSearch*)searcher result:(BMKDrivingRouteResult*)result errorCode:(BMKSearchErrorCode)error

在上述的協議方法中,咱們設置起點,終點,以及路段入口信息和各軌跡點的總數atom

for (int i = 0; i < size; i++) { BMKDrivingStep *tansitStep = [plan.steps objectAtIndex:i]; if (i == 0 ) { BMKPointAnnotation* annotation = [[BMKPointAnnotation alloc]init]; annotation.coordinate = plan.terminal.location; annotation.title = @"起點"; [_mapView addAnnotation:annotation]; } else if (i == size - 1) { BMKPointAnnotation* annotation = [[BMKPointAnnotation alloc]init]; annotation.coordinate = plan.terminal.location; annotation.title = @"終點"; [_mapView addAnnotation:annotation]; } BMKPointAnnotation* annotation = [[BMKPointAnnotation alloc]init]; annotation.coordinate = tansitStep.entrace.location; //路段入口信息 annotation.title = tansitStep.instruction; //路程換成說明 [_mapView addAnnotation:annotation]; //軌跡點總數累計 planPointCounts += tansitStep.pointsCount; } //軌跡點 BMKMapPoint * temppoints = new BMKMapPoint[planPointCounts]; //文件後綴名改成mm int i = 0; for (int j = 0; j < size; j++) { BMKTransitStep *transitStep = [plan.steps objectAtIndex:j]; int k = 0; for (k = 0; k < transitStep.pointsCount; k++) { temppoints[i].x = transitStep.points[k].x; temppoints[i].y = transitStep.points[k].y; i++; } } //經過points構建BMKPolyline BMKPolyline *polyLine = [BMKPolyline polylineWithPoints:temppoints count:planPointCounts]; [_mapView addOverlay:polyLine]; //添加路線overlay delete []temppoints; [self mapViewFitPolyLine:polyLine];

這樣咱們就完成了路徑規劃的主要設置。spa

POI檢索

百度地圖提供了詳細的POI檢索,以下圖咱們設置一個界面選擇咱們想要檢索的內容,而後根據咱們選擇的內容去在地圖上標記處各個對應的點,並顯示出他的詳細信息。而後咱們點擊具體的cell,而後咱們根據模型中的數據地點或者經緯度,能夠規劃處咱們所在地到目的地的線路規劃,同樣有駕車,公交,步行,三種。這裏不得不吐槽一下爲啥那麼多電話都沒有嘞。


IMG_0003.PNG

IMG_0004.PNG


咱們要進行POI檢索,首先要遵循BMKPoiSearchDelegate協議,而後進行檢索

_searcher2 =[[BMKPoiSearch alloc]init]; _searcher2.delegate = self; //發起檢索 BMKNearbySearchOption *option = [[BMKNearbySearchOption alloc]init]; option.pageIndex = 1; //當前索引頁 option.pageCapacity = 10; //分頁量 option.location = CLLocationCoordinate2DMake(self.lat2, self.lon2); option.keyword = self.str; option.radius = 3000; BOOL flag = [_searcher2 poiSearchNearBy:option]; if(flag) { NSLog(@"周邊檢索發送成功"); } else { NSLog(@"周邊檢索發送失敗"); }

檢索成功後會走到協議方法

- (void)onGetPoiResult:(BMKPoiSearch*)searcher result:(BMKPoiResult*)poiResultList errorCode:(BMKSearchErrorCode)error

在這裏咱們獲得了包含詳細信息的一個數組,而後咱們取出BMKPoiInfo對象中的uid,去進行詳細檢索,同時並把它轉換爲一個model,去建立咱們的tableview,而後把獲得的對應數據展現到下半部的列表中,在點擊tableview的詳細事件中進行傳值,實現路線的規劃。model中的部分屬性以下:

@interface GSMapModel : NSObject ///POI名稱 @property (nonatomic, strong) NSString* name; ///POIuid @property (nonatomic, strong) NSString* uid; ///POI地址 @property (nonatomic, strong) NSString* address; ///POI所在城市 @property (nonatomic, strong) NSString* city; ///POI電話號碼 @property (nonatomic, strong) NSString* phone; ///POI郵編 @property (nonatomic, strong) NSString* postcode;

詳情檢索對應的協議方法

//搜索的詳細結果 - (void)onGetPoiDetailResult:(BMKPoiSearch*)searcher result:(BMKPoiDetailResult*)poiDetailResult errorCode:(BMKSearchErrorCode)errorCode{ if (errorCode == BMK_SEARCH_NO_ERROR) { //在此處理正常結果 } else if (errorCode == BMK_SEARCH_AMBIGUOUS_KEYWORD){ //當在設置城市未找到結果,但在其餘城市找到結果時,回調建議檢索城市列表 // result.cityList; NSLog(@"起始點有歧義"); } else { NSLog(@"抱歉,未找到結果"); }

大頭針的自定義

咱們想要本身定義咱們想要看到的大頭針模樣,就要對他進行自定義。下面介紹一種簡單的處理大頭針樣式的方法,若是想要具體的根據不一樣的情形來進行自定義,就要進行判斷,根據他們不一樣的狀況去給定相應的標註圖片

- (BMKAnnotationView *)mapView:(BMKMapView *)mapView viewForAnnotation:(id<BMKAnnotation>)annotation{ BMKPinAnnotationView *newAnnotationView = [[BMKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"myAnnotation"]; newAnnotationView.pinColor = BMKPinAnnotationColorPurple; newAnnotationView.animatesDrop = NO;// 設置該標註點動畫顯示 newAnnotationView.annotation=annotation; newAnnotationView.image = [UIImage imageNamed:@"mapicon"]; //把大頭針換成別的圖片 newAnnotationView.size = CGSizeMake(20, 33); return newAnnotationView; }

後記

地圖中咱們用的比較多的就是定位,POI檢索和路徑規劃了,定位的話,相信不論是官方SDK仍是網上各類資料都夠詳細的了,我就再也不重複了,這裏主要對路徑規劃和POI檢索作出說明,但願對你們有所幫助。

補充內容

今天有小夥伴問看了文章想知道百度地圖的模糊搜索是怎麼作的,輸入地名就能自動聯想好厲害的樣子,這裏就補充一下吧,其實也是POI搜索的一部分,是城市內搜索根據輸入的地名發起搜索,而後把搜索內容展現到tableview上罷了。以下圖:


模糊搜索.gif


當咱們改變輸入框的內容時其實內部的操做是什麼呢,下面咱們一點點介紹一下他。
這裏咱們要作的是POI檢索,所以首先要遵循BMKPoiSearchDelegate協議,建立搜索的代碼以下:

_poisearcher = [[BMKPoiSearch alloc]init]; _poisearcher.delegate = self; BMKCitySearchOption *citySearchOption = [[BMKCitySearchOption alloc]init]; citySearchOption.pageIndex = 0; citySearchOption.pageCapacity = 20; citySearchOption.city= self.city; citySearchOption.keyword = _inputFiled.text;

成功以後會走下面這個協議方法

-(void)onGetPoiResult:(BMKPoiSearch *)searcher result:(BMKPoiResult *)poiResult errorCode:(BMKSearchErrorCode)errorCode

這裏咱們就獲得了返回的內容,而後把它裏面的數據取到轉換爲模型展現到tableview上就行了,可是,爲何是可是呢,由於你這樣作並不能獲得想要的結果,由於你這裏作的檢索只是一次的,並不能實現每改變一個字就從新檢索展現出地點,咱們要對輸入框作處理

[_inputFiled addTarget:self action:@selector(inputaction:) forControlEvents:UIControlEventEditingChanged];

添加事件,實現對輸入框變化的監聽,而後實現方法。

#pragma mark - 輸入框的實時監聽 -(void)inputaction:(UITextField *)textField{ [self performSelector:@selector(delay) withObject:self afterDelay:0.5]; }

這裏咱們監聽輸入框的變化,而後把相應的檢索寫到delay方法中就能夠了。這樣就實現了數據的展現,而後點擊對應的cell的時候,把數據傳給上個界面接Ok了啊,這裏爲了用戶體驗咱們能夠監聽tableview的滾動,當滾動的時候讓輸入框的鍵盤消失,代碼以下:

#pragma mark -滾動隱藏鍵盤 -(void)scrollViewDidScroll:(UIScrollView *)scrollView{ [self.view endEditing:YES]; }

這樣咱們就實現了模糊搜索了,是否是仍是比較簡單的。有別的問題之後再接着補充吧。

相關文章
相關標籤/搜索