zoukankan      html  css  js  c++  java
  • iOS地图集成示例:百度地图POI检索

    一、集成百度地图(傻瓜教程,以网站说明文档为准,此处罗列几项主要步骤)

    1、登录  http://lbsyun.baidu.com  百度地图开发者平台,获取SDK和集成文档。

    2、百度地图可以提供的一些服务

    (1)地图:提供地图展示和地图操作功能;

    (2)POI检索:支持周边检索、区域检索和城市内兴趣点检索; 

    (3)地理编码:提供经纬度和地址信息相互转化的功能接口;

    (4)线路规划:支持公交、驾车、步行、骑行,四种方式的线路规划;

    (5)覆盖物图层:支持在地图上添加覆盖物(标注、几何图形、热力图、地形图图层等),展示更丰富的LBS信息;

    (6)定位:获取当前位置信息,并在地图上展示(支持普通、跟随、罗盘三种模式);

    (7)离线地图:使用离线地图可节省用户流量,提供更好的地图展示效果;

    (8)调启百度地图:利用SDK接口,直接在本地打开百度地图客户端或WebApp,实现地图功能;

    (9)周边雷达:利用周边雷达功能,开发者可在App内低成本、快速实现查找周边使用相同App的用户位置的功能;

    (10)LBS云检索:支持查询存储在LBS云内的自有数据;

    (11)瓦片图层: 支持在地图上添加自有瓦片数据。

    (12)特色功能:提供短串分享、Place详情检索、热力图等特色功能,帮助开发者搭建功能更加强大的应用;

    2、创建应用,获得AppKey (密钥)

    (1)这里需要以开发者身份获得key

    (2)注意和Bundle Identifier的绑定

    3、配置集成前的注意事项

    (1)严格参考文档!

    (2)几个注意点

       <1> iOS9.0之后,要在Info.plist配置ATS

       <2> 在Info.plist配置 百度地图应用的白名单(支持在自己的应用中打开百度地图)

       <3> 管理地图的生命周期(手动将代理置空)

       <4>在Info.plist中添加获取定位授权的提醒

         NSLocationWhenInUseUsageDescription ,允许在前台使用时获取GPS的描述  

            NSLocationAlwaysUsageDescription ,允许永久使用GPS的描述   

    4、配置开发环境

    (1)添加百度的静态库(.framework)

    (2)导入一大堆的系统库

    (3)添加地图包(mapapi.bundle资源文件)

    (4)引入所有的头文件

    5、初始化地图

    (1)初始化BMKMapManager

    (2)创建BMKMapView

    6、基础地图

    (1)参阅文档!http://lbsyun.baidu.com/index.php?title=iossdk/guide/basicmap

    (2)一些功能的了解

       <1>地图类型:普通矢量地图、卫星图和空白地图(节省流量)

       <2>打开实时路况图层

       <3>热力地图

       <4>手势、地图控制、底标、折线(几何图形的遮盖)

       <5>设置地图显示范围

    <6> 等等等。。。

    二、百度地图POI检索

    #import "ViewController.h"
    @interface ViewController ()<BMKMapViewDelegate,BMKPoiSearchDelegate>
    @property(nonatomic,weak)BMKMapView * mapView;
    @property(nonatomic,weak)UITextField * tf;
    @property(nonatomic,strong)BMKPoiSearch * poisearch;
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        
        //设置地图
        BMKMapView* mapView = [[BMKMapView alloc]initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height)];
        self.mapView = mapView;
        [self.view addSubview:mapView];
        
        
        //设置开始查找按钮和输入文本框
        UIButton * btn = [[UIButton alloc]initWithFrame:CGRectMake(30, 30, 100, 30)];
        [btn setTitle:@"开始查找" forState:UIControlStateNormal];
        [btn addTarget:self action:@selector(btnClick:) forControlEvents:UIControlEventTouchUpInside];
        [btn setBackgroundColor:[UIColor orangeColor]];
        [self.view addSubview:btn];
        
        UITextField * tf = [[UITextField alloc]initWithFrame:CGRectMake(150, 30, 100, 30)];
        self.tf= tf;
        tf.backgroundColor = [UIColor orangeColor];
        [self.view addSubview:tf];
        
        
        //实例POI检索化检索对象,并设置代理
        
        self.poisearch = [[BMKPoiSearch alloc]init];
        self.poisearch.delegate = self;
        
    
    }
    
    
    -(void)btnClick :(UIButton *)btn
    {
    
        //检索参数
        BMKCitySearchOption *citySearchOption = [[BMKCitySearchOption alloc]init];
        citySearchOption.pageIndex = 0; //当前页码
        citySearchOption.pageCapacity = 20; //每页个数
        citySearchOption.city= @"北京"; //城市
        citySearchOption.keyword = self.tf.text; //关键字 酒店
        
        //根据检索参数,进行检索,并返回检索结果的标识
        BOOL flag = [_poisearch poiSearchInCity:citySearchOption];
        if(flag)
        {
            NSLog(@"城市内检索发送成功");
        }
        else
        {
            NSLog(@"城市内检索发送失败");
        }
    }
    
    
    #pragma mark implement BMKSearchDelegate
    - (void)onGetPoiResult:(BMKPoiSearch *)searcher result:(BMKPoiResult*)result errorCode:(BMKSearchErrorCode)error
    {
        // 清除屏幕中所有的annotation
        NSArray* array = [NSArray arrayWithArray:_mapView.annotations];
        [_mapView removeAnnotations:array];
        //正确
        if (error == BMK_SEARCH_NO_ERROR) {
            NSMutableArray *annotations = [NSMutableArray array];
            //遍历返回的查询结果
            for (int i = 0; i < result.poiInfoList.count; i++) {
                BMKPoiInfo* poi = [result.poiInfoList objectAtIndex:i];
                BMKPointAnnotation* item = [[BMKPointAnnotation alloc]init];
                item.coordinate = poi.pt;
                item.title = poi.name;
                [annotations addObject:item];
            }
            
            //给地图添加大头针模型
            [_mapView addAnnotations:annotations];
            [_mapView showAnnotations:annotations animated:YES];
            
            
        } else if (error == BMK_SEARCH_AMBIGUOUS_ROURE_ADDR){
            NSLog(@"起始点有歧义");
        } else {
            // 各种情况的判断。。。
        }
    }
    
    
    
    #pragma mark implement BMKMapViewDelegate
    
    /**
     *根据anntation生成对应的View
     *@param mapView 地图View
     *@param annotation 指定的标注
     *@return 生成的标注View
     */
    - (BMKAnnotationView *)mapView:(BMKMapView *)view viewForAnnotation:(id <BMKAnnotation>)annotation
    {
        // 生成重用标示identifier
        NSString *AnnotationViewID = @"xidanMark";
        
        // 检查是否有重用的缓存
        BMKAnnotationView* annotationView = [view dequeueReusableAnnotationViewWithIdentifier:AnnotationViewID];
        
        // 缓存没有,自己构造一个,一般首次添加annotation代码会运行到此处
        if (annotationView == nil) {
            annotationView = [[BMKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:AnnotationViewID];
            ((BMKPinAnnotationView*)annotationView).pinColor = BMKPinAnnotationColorRed;
            // 设置重天上掉下的效果(annotation)
            ((BMKPinAnnotationView*)annotationView).animatesDrop = YES;
        }
        
        // 设置位置
        annotationView.centerOffset = CGPointMake(0, -(annotationView.frame.size.height * 0.5));
        annotationView.annotation = annotation;
        // 单击弹出泡泡,弹出泡泡前提annotation必须实现title属性
        annotationView.canShowCallout = YES;
        // 设置是否可以拖拽
        annotationView.draggable = NO;
        
        return annotationView;
    }
    
    
    -(void)viewWillAppear:(BOOL)animated
    {
        [_mapView viewWillAppear];
        _mapView.delegate = self; // 此处记得不用的时候需要置nil,否则影响内存的释放
    }
    -(void)viewWillDisappear:(BOOL)animated
    {
        [_mapView viewWillDisappear];
        _mapView.delegate = nil; // 不用时,置nil
    }
    
    @end
    
  • 相关阅读:
    系统架构师学习笔记_第十三章(上)_连载
    PHP开发不能违背的安全规则
    五种常见的PHP设计模式
    系统架构师学习笔记_第十四章_连载
    Agile PLM Setting Up EC Attributes and Attribute Mapping
    Agile PLM EC Client Product Structure
    Agile EC 301 SolidWorks Connector Administration
    Agile PLM Create Item /BOM Dialog
    Agile PLM 权限控制
    Agile PLM EC Understand the BOM Publishing Process
  • 原文地址:https://www.cnblogs.com/cleven/p/5442269.html
Copyright © 2011-2022 走看看