iOS 地图线路动态可视化显示

之前有碰到过这样的问题,就是画出两点之间的距离,然后将线路显示在可视化的范围内,下面是一些主要代码:

#pragma mark - 驾车线路检索
- (void)onGetDrivingRouteResult:(BMKRouteSearch*)searcher result:(BMKDrivingRouteResult*)result errorCode:(BMKSearchErrorCode)error
{
    if (error == BMK_SEARCH_NO_ERROR) {
        //在此处理正常结果
        NSArray* array = [NSArray arrayWithArray:_mapView.annotations];
        [_mapView removeAnnotations:array];
        array = [NSArray arrayWithArray:_mapView.overlays];
        [_mapView removeOverlays:array];
        if (error == BMK_SEARCH_NO_ERROR) {
            BMKDrivingRouteLine* plan = (BMKDrivingRouteLine*)[result.routes objectAtIndex:0];
            // 计算路线方案中的路段数目
            int size = [plan.steps count];
            int planPointCounts = 0;
            for (int i = 0; i < size; i++) {
                BMKDrivingStep* transitStep = [plan.steps objectAtIndex:i];
                if(i==0){
                    RouteAnnotation* item = [[RouteAnnotation alloc]init];
                    item.coordinate = plan.starting.location;
                    item.title = @"起点";
                    item.type = 0;
                    [_mapView addAnnotation:item]; // 添加起点标注

                }else if(i==size-1){
                    RouteAnnotation* item = [[RouteAnnotation alloc]init];
                    item.coordinate = plan.terminal.location;
                    item.title = @"终点";
                    item.type = 1;
                    [_mapView addAnnotation:item]; // 添加起点标注
                }
                //添加annotation节点
                RouteAnnotation* item = [[RouteAnnotation alloc]init];
                item.coordinate = transitStep.entrace.location;
                item.title = transitStep.entraceInstruction;
                item.degree = transitStep.direction * 30;
                item.type = 4;
                [_mapView addAnnotation:item];
                //轨迹点总数累计
                planPointCounts += transitStep.pointsCount;

                //-----------------------------------------------------------

                if (i==0) {
                 //以第一个坐标点做初始值
                    minLat = plan.starting.location.latitude;
                    maxLat = plan.starting.location.latitude;
                    minLon = plan.starting.location.longitude;
                    maxLon = plan.starting.location.longitude;
                }else{
                  //对比筛选出最小纬度,最大纬度;最小经度,最大经度
                    minLat = MIN(minLat, transitStep.entrace.location.latitude);
                    maxLat = MAX(maxLat, transitStep.entrace.location.latitude);
                    minLon = MIN(minLon, transitStep.entrace.location.longitude);
                    maxLon = MAX(maxLon, transitStep.entrace.location.longitude);
                }

                //-----------------------------------------------------------
            }

            [self setVisibleRegin];

            // 添加途经点
            if (plan.wayPoints) {
                for (BMKPlanNode* tempNode in plan.wayPoints) {
                    RouteAnnotation* item = [[RouteAnnotation alloc]init];
                    item = [[RouteAnnotation alloc]init];
                    item.coordinate = tempNode.pt;
                    item.type = 5;
                    item.title = tempNode.name;
                    [_mapView addAnnotation:item];
                }
            }
            //轨迹点
            BMKMapPoint * temppoints = new BMKMapPoint[planPointCounts];
            int i = 0;
            for (int j = 0; j < size; j++) {
                BMKDrivingStep* 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;

        }
    }
    else {
        NSLog(@"抱歉,未找到结果");
    }
}
- (void)setVisibleRegin
{
    //计算中心点
    CLLocationCoordinate2D centCoor;
    centCoor.latitude = (CLLocationDegrees)((maxLat+minLat) * 0.5f);
    centCoor.longitude = (CLLocationDegrees)((maxLon+minLon) * 0.5f);
    BMKCoordinateSpan span;
    //计算地理位置的跨度
    span.latitudeDelta = maxLat - minLat;
    span.longitudeDelta = maxLon - minLon;
    //得出数据的坐标区域
    BMKCoordinateRegion region = BMKCoordinateRegionMake(centCoor, span);

    //百度地图的坐标范围转换成相对视图的位置
    CGRect fitRect = [_mapView convertRegion:region toRectToView:_mapView];
    //将地图视图的位置转换成地图的位置,
    BMKMapRect fitMapRect = [_mapView convertRect:fitRect toMapRectFromView:_mapView];
    //设置地图可视范围为数据所在的地图位置
    [_mapView setVisibleMapRect:fitMapRect animated:YES];
}

欢迎大家批评指正!!!

时间: 2024-10-07 13:43:50

iOS 地图线路动态可视化显示的相关文章

iOS地图开发-基本使用

地图的基本使用 1.设置地图显示类型 /** MKMapTypeStandard = 0, // 标准 MKMapTypeSatellite, // 卫星 MKMapTypeHybrid, // 混合(标准+卫星) MKMapTypeSatelliteFlyover NS_ENUM_AVAILABLE(10_11, 9_0), // 3D立体卫星 MKMapTypeHybridFlyover NS_ENUM_AVAILABLE(10_11, 9_0), // 3D立体混合 */ self.cus

iOS 地图开发小结

首先来说说ios地图开发使用的主要类: MKMapView:地图控件,无其他Label等控件无异,拖进来就可以用了,用于地图的内容的显示,用户可以对地图进行放大.缩小.拖动.旋转等操作: CLLocationCoordinate2D :坐标,包括经度和纬度: MKCoordinateSpan :地图跨度,表示地图放大倍数,数值越小地图显示的单位越精细: CLLocationManager :用户所在位置的管理类,通过该类的能够获取用户所在的GPS坐标. 下面与大家分享一些个人项目中地图部分所涉及

ios 开发中 动态库 与静态库的区别

使用静态库的好处 1,模块化,分工合作 2,避免少量改动经常导致大量的重复编译连接 3,也可以重用,注意不是共享使用 动态库使用有如下好处: 1使用动态库,可以将最终可执行文件体积缩小 2使用动态库,多个应用程序共享内存中得同一份库文件,节省资源 3使用动态库,可以不重新编译连接可执行程序的前提下,更新动态库文件达到更新应用程序的目的. 从1可以得出,将整个应用程序分模块,团队合作,进行分工,影响比较小. 等其他好处, 从2可以看出,其实动态库应该叫共享库,那么从这个意义上来说,苹果禁止iOS开

iOS中关于动态Tableview中的cell数据传输的多线程问题解决之拙见

iOS中关于动态Tableview中的cell数据传输的多线程问题解决之拙见 (2015-12-05 12:48:20)[编辑][删除] 转载▼     首先我们先明确一下问题: 1.因为UI是在主线程中更新的,不能在down数据的同时显示界面,这样会使得下载的时间占用主线程,导致的后果就是你的屏幕就那样的卡死在哪了 2.如果要解觉问题1,就势必要将其下载数据的环节放在其他分线程上来实现,但是这里还会遇见一个问题,分线程的执行是不会有序的,这样,在动态显示的过 程中,cell中的数据就会混乱的变

使用Visifire+ArcGIS API for Silverlight实现Graphic信息的动态图表显示

原文:使用Visifire+ArcGIS API for Silverlight实现Graphic信息的动态图表显示 首先来看一看实现的效果: PS:原始的程序中更新曲线数据时添加了过渡的效果,具体可查看官网的示例: http://www.visifire.com/silverlight_spline_charts_gallery.php 点击其中的一个例子,然后点击Live Updates,就可看到数据更新时的过渡效果.但是蛋疼的博客园,不知道为什么,我插入了我原始的xap文件,过渡效果却没有

李洪强iOS开发之动态获取UILabel的bounds

李洪强iOS开发之动态获取UILabel的bounds 在使用UILabel存放字符串时,经常需要获取label的长宽数据,本文列出了部分常用的计算方法. 1.获取宽度,获取字符串不折行单行显示时所需要的长度  CGSize labelBounds = [str sizeWithFont:font constrainedToSize:CGSizeMake(MAXFLOAT, 30)]; 注:如果想得到宽度的话,size的width应该设为MAXFLOAT. 2.获取高度,获取字符串在指定的siz

提示框第三方库之MBProgressHUD iOS toast效果 动态提示框效果

提示框第三方库之MBProgressHUD iOS toast效果 动态提示框效果 2014-08-11 17:39 11614人阅读 评论(0) 收藏 举报  分类: iOS相关(20)  文章来自:http://blog.csdn.net/ryantang03/article/details/7877120 MBProgressHUD是一个开源项目,实现了很多种样式的提示框,使用上简单.方便,并且可以对显示的内容进行自定义,功能很强大,很多项目中都有使用到.到GitHub上可以下载到项目源码

iOS地图导航仪的实现

第一部分 知识储备 1 根据地址定位 苹果给开发者为地址解析提供了CLGeocode工具类,该工具类可以把用户输入的地址解析成经纬度,该方是: -geocodeAddressString:destAddress completionHandler:^(NSArray *placemarks, NSError *error)   该方法将字符串地址解析,然后就可以得到对应的经纬度 2 MKMapView控件及相关属性 <1 ios的MKMapView支持一下三种属性: MKMapTypeStand

iOS地图开发详解一(MKMapView)

一.ios地图说明 ios中自带有地图,之前使用的时谷歌的,不过现在使用的是高德地图,另外在国内,百度地图也很常用. 二.代码实现 1.导入框架 导入MapKit框架如下图所示 2.创建并显示地图 经过以上两步,地图已经可以显示出来了 注意:以上步骤一定要来联网的基础上进行,否则只会看到格子而不会显示地图. 3.设置显示区域 上面的操作显示的地图并不能满足要求,因为它显示的不是我们想要的区域,下面我们说下怎样设置当前显示区域 网上查到北京故宫博物馆的纬度和经度为{39.918031,116.40