• 【改】IOS-百度地图API用点生成线路、导航、自定义标注 2013年11月更新


    IOS百度地图API开发自定义气泡,点击气泡自动生成路线,以及拖拽
    IOS百度地图开发POISearch搜索附近停车场,附近加油站
    IOS百度地图视角跳到用户当前位置
    IOS百度地图开发实时路况
    IOS开发百度地图自动导航
    IOS开发百度地图在大头钉上加文字和图片,点击这个整体再弹出气泡
    IOS开发百度地图实现经纬度导航,无需地名。

     第一部分--牛刀小试

    百度地图零基础到各种效果界面。上面的几行不用看,那是为了SEO,就是为了让我这篇博客让更多的人搜索到,上面的问题我都已经解决,都在文章里面。下面是步骤:
    1.申请百度地图key。2013年10月之后的2.1.0版本开始启用新的key!要想使用百度地图,你需要申请key,这个key是安桌苹果通用,但是你的项目名必须跟你的key吻合,至于什么是项目名,不多说,到网址http://lbsyun.baidu.com/apiconsole/key申请,

    我的应用
    应用Id应用名称访问应用(ak)应用类别备注信息(双击更改)应用配置
    系统默认AK 系统默认AK
    AA1********28e
    未配置 当前系统所用AK 当前系统所用AK
    17673 IphoneMapSdkDemo pytxh1exmzkAneO5Vf4K 移动端   设置 删除
    17721 MapTest LqwUseZROjwxwb2zZ4e 移动端   设置 删除



    2.下载百度开发包http://api.map.baidu.com/lbsapi/cloud/sdkiosdev-download.htm
    3.建项目。这部分设计添加lib以及资源文件,参考百度的IOS api开发指南做就行,那些内容已经在2013年10月份更新过了,别去看网上乱七八糟的帖子,照着里面做就能顺利通过编译。有帖子说那些方法过时,错!
    4.将ViewController的.m改成.mm
    5.在委托中.h文件中中加入#import "BMapKit.h",并声明变量BMKMapManager* _mapManager;在.m委托中加入
    _   mapManager = [[BMKMapManager alloc]init];
        // 如果要关注网络及授权验证事件,请设定 generalDelegate 参数
        BOOL ret = [_mapManager start:@"3102732B30E0D66EF51415C9E6CE055EC78FF07E" generalDelegate:nil];
        if (!ret) {
            NSLog(@"manager start failed!");
        }
    6.注意:在这里就开始运行程序的话,我在我的iphone上运行这个百度地图,会出现-[UIDevice uniqueGlobalDeviceIdentifier]: unrecognized selector sent to instance 0x1ed19370
    这么一个bug,解决办法很多,但是我感觉最爽的一种办法就是加入4个文件NSString+MD5Addition,UIDevice+IdentifierAddition,直接加入到项目里面就可以,无需引入头文件,下载地址
    http://www.kuaipan.cn/file/id_30491149655344975.htm
    7.在viewController.mm中的viewDidLoad改为如下代码
    - (void)viewDidLoad
    {
        [super viewDidLoad];
        BMKMapView* mapView = [[BMKMapView alloc]initWithFrame:CGRectMake(0, 0, 320, 548)];
        self.view = mapView;
        // Do any additional setup after loading the view, typically from a nib.
    }
    保存后运行,一个最简单的百度地图API应用就完成了
    源代码下载http://www.kuaipan.cn/file/id_30491149655344976.htm

    百度地图的功能很强大,上面只是牛刀小试


    第二部分

    功能五,搜索,用的很广泛,这个功能很强大,你可以搜索某一坐标点附近的加油站,停车场,宾馆,酒店,餐厅,甚至厕所都能搜索到,比如说你想查找5000米内的加油站,以及1000米内的停车场。
    flag = [_search  poiSearchNearBy:@"加油站" center:coor1 radius:5000 pageIndex:0];
    flag = [_search  poiSearchNearBy:@"停车场" center:coor1 radius:1000 pageIndex:0];
    然后用委托- (void)onGetPoiResult:(NSArray*)poiResultList searchType:(int)type errorCode:(int)error
    输出结果
    将百度地图视角切换到某一坐标点
    -(void)Region{
        CLLocationCoordinate2D coor;
        coor.latitude = self._latitude;
        coor.longitude = self._longitude;
        NSDictionary *tip =  BMKBaiduCoorForWgs84(coor);
        CLLocationCoordinate2D coor1=  BMKCoorDictionaryDecode(tip);
        BMKCoordinateRegion viewRegion = BMKCoordinateRegionMake(coor1, BMKCoordinateSpanMake(0.05,0.05));
        BMKCoordinateRegion adjustedRegion = [_mapView regionThatFits:viewRegion];
        [_mapView setRegion:adjustedRegion animated:YES];
    }
    清除地图上所有痕迹和路线
    -(void)clereOldYJDH{
        NSArray* array = [NSArray arrayWithArray:_mapView.annotations];
        [_mapView removeAnnotations:array];
        array = [NSArray arrayWithArray:_mapView.overlays];
        [_mapView removeOverlays:array];
        [self Region];
    }
    //当选中一个annotation views时,调用此接口
    - (void)mapView:(BMKMapView *)mapView didSelectAnnotationView:(BMKAnnotationView *)view
    {
        NSLog(@"选中一个annotation views:%f,%f",view.annotation.coordinate.latitude,view.annotation.coordinate.longitude);
    }
    //当取消选中一个annotation views时,调用此接口
    - (void)mapView:(BMKMapView *)mapView didDeselectAnnotationView:(BMKAnnotationView *)view{
        NSLog(@"取消选中一个annotation views");
    }
    //当mapView新添加annotation views时,调用此接口
    - (void)mapView:(BMKMapView *)mapView didAddAnnotationViews:(NSArray *)views
    {
        NSLog(@"mapView新添加annotation views");
    }
    //当点击annotation view弹出的泡泡时,调用此接口
    - (void)mapView:(BMKMapView *)mapView annotationViewForBubble:(BMKAnnotationView *)view
    {
        NSLog(@"点击annotation view弹出的泡泡");
    }
    //拖动annotation view时view的状态变化
    - (void)mapView:(BMKMapView *)mapView annotationView:(BMKAnnotationView *)view didChangeDragState:(BMKAnnotationViewDragState)newStatefromOldState:(BMKAnnotationViewDragState)oldState
    {
        NSLog(@"动annotation view时view的状态变化");
    }
    //标注呈绿色样式大头钉
    ((BMKPinAnnotationView *)annotationView).pinColor = BMKPinAnnotationColorGreen;
    //允许用户拖动
    [annotationView setDraggable:YES];
    //气泡框左侧显示的View,可自定义
    annotationView.leftCalloutAccessoryView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"icon_location.png"]];
    //气泡框右侧显示的View 可自定义
    annotationView.rightCalloutAccessoryView =selectButton;
    //让标注在进入界面时就处于弹出气泡框的状态
    [annotationView setSelected:YES animated:YES];
    //整个标注的偏移量
    annotationView.centerOffset = CGPointMake(0, -(annotationView.frame.size.height * 0.5));
    annotationView.annotation = annotation;//绑定对应的标点经纬度
    annotationView.canShowCallout = TRUE;//允许点击弹出气泡框


    在地图上定制标注替代大头钉,可以将文字图片所有能加到view中的,都可以以大头钉的形式显示出来,需要将view转换为image主要代码,最重要的是知道这个原理,然后实现起来就很简单:
    - (BMKAnnotationView *)mapView:(BMKMapView *)view viewForAnnotation:(id <BMKAnnotation>)annotation
    在这个委托中实现如下代码
           UIView *viewForImage=[[UIView alloc]initWithFrame:CGRectMake(0, 0, 132, 64)];
            UIImageView *imageview=[[UIImageView alloc]initWithFrame:CGRectMake(0, 0, 32, 64)];
            [imageview setImage:[UIImage imageNamed:@"车位置.png"]];
            [viewForImage addSubview:imageview];
           
            UILabel *label=[[UILabel alloc]initWithFrame:CGRectMake(32, 0, 100, 64)];
            label.text=@"陈双超";
            label.backgroundColor=[UIColor clearColor];
            [viewForImage addSubview:label];
            annotationView.image=[self getImageFromView:viewForImage];


    -(UIImage *)getImageFromView:(UIView *)view{
        UIGraphicsBeginImageContext(view.bounds.size);
        [view.layer renderInContext:UIGraphicsGetCurrentContext()];
        UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
        return image;
    }

    在网上发现别人专门建立view来定制气泡和专门建立文件来定制大头钉,觉得那方法对代码管理起来更简单,可读性强。值得学习http://www.kuaipan.cn/file/id_30491149655345085.htm
    @interface KYBubbleView : UIScrollView {   //UIView是气泡view的本质
        NSDictionary *_infoDict;
        UILabel         *titleLabel;//标题label
        UILabel         *detailLabel;//副标题label
        UILabel         *contactLabel;    //联系人
        UILabel         *homeAddresslabel;   //家庭地址
        UIButton        *rightButton;
        NSUInteger      index;
    }
    #import "BMKPointAnnotation.h"

    @interface KYPointAnnotation : BMKPointAnnotation {
        NSUInteger _tag;
    }

    @property NSUInteger tag;

    @end
     

    部分效果图[转载]IOS开发百度地图API-用点生成路线,导航,气泡响应

    [转载]IOS开发百度地图API-用点生成路线,导航,气泡响应

    [转载]IOS开发百度地图API-用点生成路线,导航,气泡响应




    第三部分

    1.有一个朋友问我他做导航时,传参数遇到问题,就是输入汉字部分没有,仅靠两点的经纬度怎么实现路线导航,他试了很久没弄出来。然后我把解决这个问题的源码贴出来。我做的是驾车路线,如果需要步行或者公交则需要作调整。主要涉及的方法如下,实现这个的代码,我直接从我的项目中弄出来的http://www.kuaipan.cn/file/id_30491149655345069.htm
    -(void)onClickDriveSearch
    {
       NSLog(@"%f,%f,%f,%f",_startCoordainateXText,_startCoordainateYText,_endCoordainateXText,_endCoordainateYText);
        count = 0;
        isLoadingMap=2;

        if(!_endCoordainateXText ||!_endCoordainateYText )isLoadingMap=1;
       
        NSArray* array = [NSArray arrayWithArray:_mapView.annotations];
        [_mapView removeAnnotations:array];
        array = [NSArray arrayWithArray:_mapView.overlays];
        [_mapView removeOverlays:array];
        CLLocationCoordinate2D startPt = (CLLocationCoordinate2D){0, 0};
        CLLocationCoordinate2D endPt = (CLLocationCoordinate2D){0, 0};
        if (_startCoordainateXText && _startCoordainateYText ) {
            startPt = (CLLocationCoordinate2D){_startCoordainateYText ,_startCoordainateXText };
        }
        if (_endCoordainateYText  && _endCoordainateXText ) {
            endPt = (CLLocationCoordinate2D){ _endCoordainateYText ,_endCoordainateXText};
        }
        BMKPlanNode* start = [[BMKPlanNode alloc]init];
        start.pt = startPt;
        start.name = nil;
       
        BMKPlanNode* end = [[BMKPlanNode alloc]init];
        end.pt = endPt;
        end.name = nil;
       
        BOOL flag = [_search drivingSearch:nil startNode:start endCity:nil endNode:end];
        if (!flag) {
            NSLog(@"search failed");
        }
        [start release];
        [end release];
        [self Region];
    }

  • 相关阅读:
    How to Enable Trace or Debug for APIs executed as SQL Script Outside of the Applications ?
    Android中MVC、MVP、MVVM具体解释
    破坏性创新第一原则
    Android学习笔记(八)——显示运行进度对话框
    Hadoop知识汇总
    mybatis collection和association使用区别
    mybatis $和#
    IDEA新建一个多maven模块工程(有图)
    可输入的下拉框
    springboot 使用i18n进行国际化
  • 原文地址:https://www.cnblogs.com/wengzilin/p/3444471.html
Copyright © 2020-2023  润新知