b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

iOS高德地图路径规划

电脑杂谈  发布时间:2020-05-09 01:15:10  来源:网络整理

高德地图能离线导航_高德离线步行导航_高德手机离线导航

本文仅适用于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 ,代理AMapNaviRideManagerDelegate

_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

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    • 叶矗
      叶矗

      听得我分分钟不想看了

    • 白展鹏
      白展鹏

      是封建社会独有的东西

    热点图片
    拼命载入中...