前言

今天分享腾讯位置服务地图SDK检索功能的应用,使用公交路线规划功能实现Demo,暂时还没有做同一路线不同公交线路切换功能(后续完善此Demo)。

使用场景

公交路线规划

准备

腾讯位置服务iOS地图SDK

公交路线规划检索结果的数据说明

1、检索结果:QMSBusingRouteSearchResult中的NSArray *routes属性包含了检索到的结果,每个结果都是一个独立的公交出行方案QMSBusingRoutePlan。

2、公交出行方案:QMSBusingRoutePlan,表示从起点到终点的完整出行规划

属性 说明
CGFloat distance 方案的总距离
CGFloat duration 方案的预估时间
NSString *bounds 方案的东北、西南坐标,用于调整地图视角显示路线
NSArray <QMSBusingSegmentRoutePlan *> *steps 总路线的分段信息(包含步行、公交,其中公交可能包含多个方案)

3、出行方案的分段路线规划

属性 说明
NSString *mode “WALKING”:步行
"TRANSIT":公交
标记该分段的出行方式
CGFloat distance 分段的距离
CGFloat duration 分段的预估时间
CGFloat price 如果是公交或者地铁,需要花费的金额,元
CNSString *direction 方向描述,如果为步行,表达为向哪个方向走
NSArray *polyline 分段途径坐标点(这里必须说一下,腾讯地图SDK使用的是CLLocationCoordinate2D的encode类型,因此还需要decode才能使用)
NSArray *lines 如果是公交,并且有多个线路可以乘坐的话,该数组就会包含多个路线:QMSBusingRouteTransitLine

4、公交线路规划:QMSBusingRouteTransitLine,到这里才是最麻烦的地方,因为是一个线路的不同方案

属性 说明
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 下车车站

公交路线规划的详细说明

1、公交路线规划的起点和终点坐标的检索(不支持地名检索)

1)SDK检索参数并不支持地名检索,只有坐标检索,因此要使用检索功能就必须先通过POI检索功能来获取起点和终点的坐标位置:

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

2、显示所有路线的基本信息

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来展示所有的方案:

3、选择方案,展示路线图

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

4、补充:当添加完毕之后,让地图的视野自动适配路线

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

5、最终显示效果:

作者:面糊

链接:https://www.jianshu.com/p/12b569add049

来源:简书

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

腾讯地图SDK公交路线规划Demo相关推荐

  1. Android 调用百度地图sdk 实现路线规划导航

    Android 调用百度地图sdk 实现路线规划导航 功能: 实现实时/需求定位 卫星地图查看 路况 周边poi检索 地点输入提示检索 驾驶 步行 公交 骑行路线规划 注:以上为实现的大概功能 ,接下 ...

  2. 小程序原生 详解实现腾讯地图标点和路线规划和距离计算

    一.开通腾讯位置服务 在微信公众平台开通腾讯位置服务 二.用开发者权限登录腾讯位置服务 在我的应用中找到在你用的小程序下的key 三.配置合法域名 在开发管理中配置腾讯位置信息的合理域名 四.代码详解 ...

  3. 使用ajax访问腾讯地图api,腾讯地图ajax获取路线规划结果

    通过下面的代码 简单地图 html,body{ width:100%; height:100%; } *{ margin:0px; padding:0px; } body, button, input ...

  4. 微信小程序 腾讯位置服务地图选点和路线规划

    微信小程序使用 腾讯位置服务插件 实现 地图选点和路线规划 效果图: 实现过程 点击"开发指南",根据对应打开网页中的接入指引进行开发实现. 腾讯位置服务地图选点:开发指南 腾讯位 ...

  5. 微信小程序 - 腾讯地图SDK

    转自:https://github.com/qcomdd/qqmap-wx 微信小程序_腾讯地图SDK(在官方基础上增加路径规划功能) 以下为使用方法. // 引入SDK核心类本文件 var QQMa ...

  6. 腾讯地图SDK距离测量小工具

    以下内容转载自面糊的文章<腾讯地图SDK距离测量小工具> 作者:面糊 链接:https://www.jianshu.com/p/6e507ebcdd93 来源:简书 著作权归作者所有.商业 ...

  7. 地图 显示 动态轨迹_腾讯地图SDK全新版本上线,可满足开发者核心诉求

    近日,由腾讯位置服务开发的SDK全新v4.3.0版本正式上线,新增了小车平滑移动.点聚合功能,内置墨渊模板适配暗色模式,动态路名等,可以帮助开发者更轻松地访问腾讯地图服务和数据,优化地图类的程序开发体 ...

  8. (六)高德地图之驾车路线规划

    在项目中用到地图的地方往往会有导航功能,那么这一节将介绍一下使用高德地图来实现驾车路线规划的功能. 首先来两张示例图供参考:             接下来还是直接上代码更直观 建立DriverRou ...

  9. Paper Time|开放式时空大数据助力智能公交路线规划

    城市化进程的加快,带来了城市居民出行需求.城市公共交通规模的爆发式增长.如何更好地发展与管理城市公交,实现社会和经济效益的最优化,一直是备受关注的问题.近年来大数据技术日渐成熟,其在交通领域的应用也不 ...

  10. 腾讯小程序 java编写_微信小程序 使用腾讯地图SDK详解及实现步骤

    微信小程序 使用腾讯地图SDK详解及实现步骤 近期在做一款彩票服务类项目中用到了腾讯地图提供的小程序解决方案,拿来给大家分享一下! 使用起来非常简单,就是一些功能还有待完善. 官方文档:http:// ...

最新文章

  1. ASP.NET Ajax 1.0 RC 'Sys' 未被定義 問題
  2. hdu 1688 Sightseeing
  3. Android应用程序键盘(Keyboard)消息处理机制分析(17)
  4. 计算最大回撤_看专业分析研究员如何一步步解读外汇市场结构,实现交易最大化盈利化!...
  5. 正则表达式收藏(四)之MySQL的正则
  6. php 伪静态有什么用,网站为什么要做伪静态,做伪静态的好处是什么?
  7. php中urlencode使用
  8. 1011 A+B 和 C (15 分)—PAT (Basic Level) Practice (中文)
  9. Java并发面试,幸亏有点道行,不然又被忽悠了 1
  10. 时区时钟插件html,日期、时间选择控件 - datetimepicker
  11. java导出文件放到压缩包里
  12. mysql2000数据库四合一_sql server 2000
  13. Photoshop(ps) CC 2017中文版 3264位
  14. VLAN 主干道配置
  15. 如何实现某些软件自动点赞
  16. 基于uni-app手机端后台管理系统uni-uadmin
  17. 将自定义程序写入U盘引导区,并在真机执行
  18. 中国数据标注公司排名前十强有哪些?
  19. OpenCV人脸识别之Eigenface算法(PCA特征脸方法)
  20. excel表格末尾添加一行_在EXCEL表格中,快速插入多行、多列的技巧

热门文章

  1. c语言用户登录系统管理员,C语言系统用户管理系统
  2. 慧都与数据库厂商Devart进一步提升合作层次
  3. 国内Linux各版本占有率,Linux市场占有率知多少?
  4. ContentRoot 和 WebRoot 的区别
  5. [Math] 二阶行列式和三阶行列式的几何意义的证明
  6. 压力传感器的制作材料
  7. 通过ajax异步请求下载文件的方法
  8. 众所周知B站(哔哩哔哩)是一个学习软件
  9. 4r照片尺寸是多大_4r照片尺寸(正常照片是5寸还是6寸)
  10. 算是目前PAYPAL最全最完整的开发方式了