前言
今天分享騰訊位置服務地圖SDK檢索功能的應用,使用公交路線規劃功能實現Demo,暫時尚未作同一路線不一樣公交線路切換功能(後續完善此Demo)。數組
使用場景
公交路線規劃工具
準備
騰訊位置服務iOS地圖SDKatom
公交路線規劃檢索結果的數聽說明
一、檢索結果:QMSBusingRouteSearchResult中的NSArray *routes
屬性包含了檢索到的結果,每一個結果都是一個獨立的公交出行方案QMSBusingRoutePlan。url
二、公交出行方案:QMSBusingRoutePlan,表示從起點到終點的完整出行規劃.net
屬性 | 說明 |
---|---|
CGFloat distance | 方案的總距離 |
CGFloat duration | 方案的預估時間 |
NSString *bounds | 方案的東北、西南座標,用於調整地圖視角顯示路線 |
NSArray <QMSBusingSegmentRoutePlan *> *steps | 總路線的分段信息(包含步行、公交,其中公交可能包含多個方案) |
三、出行方案的分段路線規劃代理
屬性 | 說明 |
---|---|
NSString *mode | "WALKING":步行<br>"TRANSIT":公交<br>標記該分段的出行方式 |
CGFloat distance | 分段的距離 |
CGFloat duration | 分段的預估時間 |
CGFloat price | 若是是公交或者地鐵,須要花費的金額,元 |
CNSString *direction | 方向描述,若是爲步行,表達爲向哪一個方向走 |
NSArray *polyline | 分段途徑座標點(這裏必須說一下,騰訊地圖SDK使用的是CLLocationCoordinate2D的encode類型,所以還須要decode才能使用) |
NSArray *lines | 若是是公交,而且有多個線路能夠乘坐的話,該數組就會包含多個路線:QMSBusingRouteTransitLine |
四、公交線路規劃:QMSBusingRouteTransitLine,到這裏纔是最麻煩的地方,由於是一個線路的不一樣方案code
屬性 | 說明 |
---|---|
NSString *vehicle | 交通工具:公交、地鐵 |
NSString *id_ | 應該是個標記,沒發現做用 |
CGFloat distance | 距離 |
NSTimeInterval duration | 預計乘坐時間 |
NSString *title | 車名:如333路、軟件園通勤車等 |
NSArray *polyline | 途徑座標點 |
NSInteger station_count | 途徑站的數目 |
NSArray<QMSBusStation *> *stations | 途徑站的站名 |
QMSStationEntrance *destination | 目的地的地址,也就是屬於哪一個街道 |
QMSBusStation *geton | 上車車站 |
QMSBusStation *getoff | 下車車站 |
公交路線規劃的詳細說明
一、公交路線規劃的起點和終點座標的檢索(不支持地名檢索)component
1)SDK檢索參數並不支持地名檢索,只有座標檢索,所以要使用檢索功能就必須先經過POI檢索功能來獲取起點和終點的座標位置:blog
- (IBAction)searchButtonClicked:(UIButton *)sender { _startPoiData = nil; _endPoiData = nil; // 起點:騰訊北京總部 _startPoiOption = [[QMSPoiSearchOption alloc] init]; _startPoiOption.keyword = _startPointTextField.text; [_startPoiOption setBoundaryByRegionWithCityName:@"北京" autoExtend:NO]; [self.mapSearcher searchWithPoiSearchOption:_startPoiOption]; // 終點:西二旗地忒站 _endPoiOption = [[QMSPoiSearchOption alloc] init]; _endPoiOption.keyword = _endPointTextField.text; [_endPoiOption setBoundaryByRegionWithCityName:@"北京" autoExtend:NO]; [self.mapSearcher searchWithPoiSearchOption:_endPoiOption]; } - (void)searchWithPoiSearchOption:(QMSPoiSearchOption *)poiSearchOption didReceiveResult:(QMSPoiSearchResult *)poiSearchResult { if (poiSearchOption == _startPoiOption) { _startPoiData = poiSearchResult.dataArray.firstObject; } else { _endPoiData = poiSearchResult.dataArray.firstObject; } // 添加起點終點前,先消除以前的大頭針 [self.mapView removeAnnotations:self.mapView.annotations]; // 設置起點和終點 QPointAnnotation *startPointAnnotation = [[QPointAnnotation alloc] init]; startPointAnnotation.coordinate = _startPoiData.location; [self.mapView addAnnotation:startPointAnnotation]; QPointAnnotation *endPointAnnotation = [[QPointAnnotation alloc] init]; endPointAnnotation.coordinate = _endPoiData.location; [self.mapView addAnnotation:endPointAnnotation]; // 發起公交路線規劃檢索 [self searchBusRoute]; }
2)經過起點和終點POI數據來發起公交路線規劃檢索接口
- (void)searchBusRoute { if (_startPoiData != nil && _endPoiData != nil) { QMSBusingRouteSearchOption *option = [[QMSBusingRouteSearchOption alloc] init]; [option setFromCoordinate:_startPoiData.location]; [option setToCoordinate:_endPoiData.location]; [self.mapSearcher searchWithBusingRouteSearchOption:option]; } }
二、顯示全部路線的基本信息
1)、獲取方案的數量:planCount
NSInteger planCount = busingRouteSearchResult.routes.count;
2)、建立路線方案模型數組,在這裏我在保存了路線的同事,提出了幾樣數據:
// 路線方案 @property (nonatomic, strong) QMSBusingRoutePlan *routePlan; // 路線預估時間 @property (nonatomic, assign) NSInteger duration; // 路線的步行距離 @property (nonatomic, assign) CGFloat distance; // 途徑的公交車站數 @property (nonatomic, assign) NSInteger stationCount; // 上車站名稱 @property (nonatomic, strong) NSString *startStationName;
3)、獲取路線的步行距離:須要遍歷方案中的全部分段信息,判斷是否爲步行,而後累加distance:
// 遍歷方案中的步驟 for (int i = 0; i < plan.steps.count; i++) { QMSBusingSegmentRoutePlan *segmentRoutePlan = plan.steps[i]; // 判斷步驟爲步行,累計距離 if ([self routeIsWalkingPlan:segmentRoutePlan]) { walkingDistance += segmentRoutePlan.distance; } }
4)、獲取途徑的公交站總數和上車站名稱:因爲同一分段可能有多個公交出行方案,在此只演示了默認第一條方案:
// 判斷步驟爲公交 if ([self routeIsTransitPlan:segmentRoutePlan]) { // 遍歷通過的公交 for (int j = 0; j < segmentRoutePlan.lines.count; j++) { QMSBusingRouteTransitLine *line = segmentRoutePlan.lines[j]; // 公交站數 stationCount += line.station_count; // 第一站名稱 if (j == 0) { QMSBusStation *station = line.stations.firstObject; startStationName = station.title; } } }
5)、經過TableView來展現全部的方案:
三、選擇方案,展現路線圖
1)、先獲取該方案總共的分段數:
NSInteger stepCount = routePlan.steps.count;
2)、經過判斷分段方案的類型,來區分虛線和蚯蚓線:
if ([self routeIsWalkingPlan:plan]) { // 步行虛線 CLLocationCoordinate2D coords[plan.polyline.count]; for (int i = 0; i < plan.polyline.count; i++) { NSValue *value = plan.polyline[i]; CLLocationCoordinate2D coord = [value coordinateValue]; coords[i] = coord; } QPolyline *walkingPolyline = [[QPolyline alloc] initWithCoordinates:coords count:plan.polyline.count]; // QPolyline中的userData屬性能夠用來添加自定義的內容去判斷數據 walkingPolyline.userData = @"WALKING"; [self.mapView addOverlay:walkingPolyline]; } else { // 駕車蚯蚓線 QMSBusingRouteTransitLine *line = plan.lines[0]; CLLocationCoordinate2D coords[line.polyline.count]; for (int i = 0; i < line.polyline.count; i++) { NSValue *value = line.polyline[i]; CLLocationCoordinate2D coord = [value coordinateValue]; coords[i] = coord; } QPolyline *busPolyline = [[QPolyline alloc] initWithCoordinates:coords count:line.polyline.count]; busPolyline.userData = @"TRANSIT"; [self.mapView addOverlay:busPolyline]; }
3)、最後,實現代理方法去繪製線路:
- (QOverlayView *)mapView:(QMapView *)mapView viewForOverlay:(id<QOverlay>)overlay { if ([overlay isKindOfClass:[QPolyline class]]) { QPolyline *polyline = (QPolyline *)overlay; NSString *userData = (NSString *)polyline.userData; if ([userData isEqualToString:@"WALKING"]) { // 步行虛線 QPolylineView *polylineView = [[QPolylineView alloc] initWithPolyline:polyline]; polylineView.lineWidth = 8; polylineView.lineDashPattern = @[@15, @10]; polylineView.strokeColor = [UIColor colorWithRed:0 green:0 blue:1 alpha:0.5]; return polylineView; } else { // 駕車蚯蚓線 QTexturePolylineView *polylineView = [[QTexturePolylineView alloc] initWithPolyline:polyline]; polylineView.drawType = QTextureLineDrawType_ColorLine; // 路線箭頭 polylineView.drawSymbol = YES; polylineView.lineWidth = 8; polylineView.strokeColor = [UIColor colorWithRed:0 green:0 blue:1 alpha:0.8]; return polylineView; } } return nil; }
四、補充:當添加完畢以後,讓地圖的視野自動適配路線
1)、路線方案中的NSString *bounds
屬性標記了西南、東北兩個方向的座標,可是這個兩個座標組合成了一個字符串,還須要咱們本身去解析:
- (QCoordinateBounds)boundsFromString:(NSString *)boundsString { NSArray *array = [boundsString componentsSeparatedByString:@","]; NSString *southWestLatString = array[0]; NSString *southWestLongString = array[1]; NSString *northEastLatString = array[2]; NSString *northEastLongString = array[3]; CLLocationCoordinate2D northEast = CLLocationCoordinate2DMake(northEastLatString.floatValue, northEastLongString.floatValue); CLLocationCoordinate2D southWest = CLLocationCoordinate2DMake(southWestLatString.floatValue, southWestLongString.floatValue); QCoordinateBounds bounds; bounds.northEast = northEast; bounds.southWest = southWest; return bounds; }
2)、最後調用地圖接口,調整地圖顯示範圍:
[self.mapView setVisibleMapRect:QMapRectForCoordinateBounds(bounds) edgePadding:UIEdgeInsetsMake(10, 10, 10, 10) animated:YES];
五、最終顯示效果:
做者:麪糊
連接:https://www.jianshu.com/p/12b569add049
來源:簡書
著做權歸做者全部。商業轉載請聯繫做者得到受權,非商業轉載請註明出處。