
本文仅适用于iOS系统的高德地图的路径规划功能. 有关集成和配置,请参考高德开放平台. 我以前也看过其他人写的博客,但是当使用AMapSearchAPI进行路径规划时,在进行路径解析时我陷入了一个小洞(地图上绘制的路径在拐角处不一致高德离线步行导航,如下所示). 因此写这篇文章来记录我踩的坑,并希望能帮助那些需要帮助的人.

corner.png处的不连贯
行进路线规划分为“行进行进路线规划”高德离线步行导航,“步行行进路线规划”,“公共汽车行进路线规划”和“骑行行进路线规划”. 路径规划没有区别. 以下代码均以骑行路线规划为例.
设置起点和终点,使用AMapSearchKit或AMapNaviKit的路线规划功能返回的数据,解析出路线的经纬度数据,然后通过绘制折线功能在地图上绘制路径
折线类型为MAPolyline,它由一组纬度和经度坐标组成,并且按有序顺序建立了一系列线段. iOS SDK支持在3D矢量地图上使用箭头或纹理绘制折线. 同时,可以设置折线端点和连接点的类型,以适应绘图线的各种场景.
需要注意的是,这两个API返回的数据结构并不相同,因此经纬度的分析方法也有所不同.
IFDA版本号IDFA版本备注
3D Map SDK
AMap3DMap
AMap3DMap-NO-IDFA
3D地图和2D地图不能同时使用

2D地图SDK
AMap2DMap
AMap2DMap-NO-IDFA
3D地图和2D地图不能同时使用
搜索功能
AMapSearch
AMapSearch-NO-IDFA
目标SDK
AMapLocation
AMapLocation-NO-IDFA
导航SDK
AMapNavi

AMapNavi-NO-IDFA
包括3D地图,无需单独介绍3D地图
_search = [[AMapSearchAPI alloc]init];
_search.delegate = self;
搜索成功后,它将通过解析AMapRouteSearchResponse来输入onRouteSearchDone回调函数,以获取在地图上显示的计划步行路线的数据.
AMapRidingRouteSearchRequest *navi = [[AMapRidingRouteSearchRequest alloc] init];
/* 出发点. */
navi.origin = [AMapGeoPoint locationWithLatitude:self.startLocation.latitude longitude:self.startLocation.longitude];
/* 目的地. */
navi.destination = [AMapGeoPoint locationWithLatitude:self.endLocation.latitude longitude:self.endLocation.longitude];
[self.search AMapRidingRouteSearch:navi];//发起骑行路线规划
注意:
“ AMapRidingRouteSearchRequest”是自行车路线规划类
“ AMapDrivingRouteSearchRequest”-行车路线计划
“ AMapWalkingRouteSearchRequest”-步行路线规划类
“ AMapTransitRouteSearchRequest”-公交出行路线计划类
- (void)onRouteSearchDone:(AMapRouteSearchBaseRequest *)request response:(AMapRouteSearchResponse *)response{
if (response.route == nil){
return;
}
if (response.count > 0){
//直接取第一个方案
AMapPath *path = response.route.paths[0];
//移除旧折线对象
[_mapView removeOverlay:_polyline];
//构造折线对象
_polyline = [self polylinesForPath:path];
//添加新的遮盖,然后会触发代理方法(- (MAOverlayRenderer *)mapView:(MAMapView *)mapView rendererForOverlay:(id<MAOverlay>)overlay)进行绘制
[_mapView addOverlay:_polyline];
}
}
//路线解析
- (MAPolyline *)polylinesForPath:(AMapPath *)path{
if (path == nil || path.steps.count == 0){
return nil;
}
NSMutableString *polylineMutableString = [@"" mutableCopy];
for (AMapStep *step in path.steps) {
[polylineMutableString appendFormat:@"%@;",step.polyline];
}
NSUInteger count = 0;
CLLocationCoordinate2D *coordinates = [self coordinatesForString:polylineMutableString
coordinateCount:&count
parseToken:@";"];
MAPolyline *polyline = [MAPolyline polylineWithCoordinates:coordinates count:count];
free(coordinates), coordinates = NULL;
return polyline;
}
//解析经纬度
- (CLLocationCoordinate2D *)coordinatesForString:(NSString *)string
coordinateCount:(NSUInteger *)coordinateCount
parseToken:(NSString *)token{
if (string == nil){
return NULL;
}
if (token == nil){
token = @",";
}
NSString *str = @"";
if (![token isEqualToString:@","]){
str = [string stringByReplacingOccurrencesOfString:token withString:@","];
}else{
str = [NSString stringWithString:string];
}
NSArray *components = [str componentsSeparatedByString:@","];
NSUInteger count = [components count] / 2;
if (coordinateCount != NULL){
*coordinateCount = count;
}
CLLocationCoordinate2D *coordinates = (CLLocationCoordinate2D*)malloc(count * sizeof(CLLocationCoordinate2D));
for (int i = 0; i < count; i++){
coordinates[i].longitude = [[components objectAtIndex:2 * i] doubleValue];
coordinates[i].latitude = [[components objectAtIndex:2 * i + 1] doubleValue];
}
return coordinates;
}

特别注意: -( MAPolyline *)polylinesForPath: (AMapPath *)路径只能返回一个MAPolyline对象,而不是数组形式的多个对象.
path.steps是道路段基本信息的数组. 规划的路径将分为几个路段. 我之前犯的一个错误是直接通过循环创建每个MAPALYLINE对象,并将其作为数组“说不连续”来返回.
我在这里通过
NSMutableString *polylineMutableString = [@"" mutableCopy];
for (AMapStep *step in path.steps) {
[polylineMutableString appendFormat:@"%@;",step.polyline];
}
将所有路段的纬度和经度字符串拼接为完整的纬度和经度字符串.
通过导航SDK进行路径规划. 导入头文件#import
_naviRideManager = [[AMapNaviRideManager alloc] init];
_naviRideManager.delegate = self;
“ AMapNaviRideManager”是循环导航管理类
“ AMapNaviDriveManager”-驾驶导航管理类
“ AMapNaviWalkManager”-步行导航管理类
以下路径计算方法需要高德坐标(GCJ02).
有没有起点的自行车道计划和有起点的自行车道计划. 如果没有起点规划,则默认起点是用户的当前位置. 建议使用带起点的路径规划方法,因为会使用没有起点的路径规划方法,因为定位失败会使用北京的默认位置,这会使计算结果异常. 这里,不同类型的路径规划方法略有不同. 下面以骑行导航管理的路径规划为例.

AMapNaviPoint *startPoint = [AMapNaviPoint locationWithLatitude:latitude longitude:longitude];
AMapNaviPoint *endPoint = [AMapNaviPoint locationWithLatitude:latitude longitude:longitude];
[self.naviRideManager calculateRideRouteWithStartPoint:startPoint endPoint:endPoint];
//骑行路径规划成功
- (void)rideManagerOnCalculateRouteSuccess:(AMapNaviRideManager *)rideManager{
if (rideManager.naviRoute.routeCoordinates.count > 0){
[_mapView removeOverlays:_mapView.overlays];
//添加新的遮盖,然后会触发代理方法进行绘制
[_mapView addOverlay:[self polylinesForPath:rideManager.naviRoute.routeCoordinates]];
}
}
//骑行路径规划失败后的回调函数
-(void)rideManager:(AMapNaviRideManager *)rideManager onCalculateRouteFailure:(NSError *)error{
NSLog(@"骑行路径规划失败 : %@", error);
}
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/ruanjian/article-203576-1.html
是封建社会独有的东西
听得我分分钟不想看了