• 04 将当前位置用大头针标注到百度地图上


    O 需求

    将当前位置用大头针标注到百度地图上

    一 准备

    详见《01 如何将百度地图加入IOS应用程序?》

    注意,此应用程序运行环境是IOS DEVICE 。所以,相应的开发包一定要做好调整。

    二 编码

    (New标示本次新添加的代码;Delete表示本次需要删除的代码;Modify表示本次被修改的代码)

    1、在ViewController.h中修改代码如下

    1 #import <UIKit/UIKit.h>
    2 #import "BMapKit.h"
    3 @interface ViewController : UIViewController<BMKGeneralDelegate,BMKMapViewDelegate>
    4 {
    5         BMKMapManager *_mapManager;                          //声明一个地图管理
    6         BMKMapView *_mapView;                                 //声明一张地图
    7         BMKPointAnnotation *_annotation;                         //声明一个标注
    8 }
    9 @end

    在ViewController.m中添加如下代码

     1 - (void)viewDidLoad
     2 {
     3     [superviewDidLoad];
     4      // Do any additional setup after loading the view, typically from a nib.
     5    
     6     //启动BMKMapManager
     7     _mapManager = [[BMKMapManageralloc]init];
     8     BOOL ret = [_mapManagerstart:@"2772BD5CAFF652491F65707D6D5E9ABEBF3639CC"generalDelegate:self];
     9     if (!ret) {
    10         NSLog(@"manager start failed!");
    11     }
    12    
    13     //创建一张百度地图
    14     _mapView = [[BMKMapViewalloc]initWithFrame:CGRectMake(0, 0, 320, 480)];
    15     [_mapViewsetShowsUserLocation:YES];               //开启定位功能
    16     _mapView.delegate = self;
    17     [self.viewaddSubview:_mapView];
    18    
    19     // 在地图中添加一个PointAnnotation
    20     _annotation = [[BMKPointAnnotationalloc]init];
    21     _annotation.title = @"test";
    22     _annotation.subtitle = @"this is a test!";
    23     [_mapViewaddAnnotation:_annotation];      //个人猜测,当执行此句代码时,将会调用- (BMKAnnotationView *)mapView:(BMKMapView *)mapView viewForAnnotation:(id <BMKAnnotation>)annotation方法
    24 }
    25  
    26 #pragma mark -  实现 BMKMapViewDelegate 中的方法
    27  
    28 /**
    29  在地图View将要启动定位时,会调用此函数
    30  @param mapView 地图View
    31  下面的这个方法,貌似并没有被启动啊?是否是可有可无的?
    32  */
    33 - (void)mapViewWillStartLocatingUser:(BMKMapView *)mapView
    34 {
    35      NSLog(@"start locate");
    36 }
    37  
    38 /**
    39      用户位置更新后,会调用此函数
    40      @param mapView 地图View
    41      @param userLocation 新的用户位置
    42     在实际使用中,只需要    [mapView setShowsUserLocation:YES];    mapView.delegate = self;   两句代码就可以启动下面的方法。疑问,为什么我的位置没有移动的情况下,这个方法循环被调用呢?
    43  */
    44 - (void)mapView:(BMKMapView *)mapView didUpdateUserLocation:(BMKUserLocation *)userLocation
    45 {
    46      if (userLocation != nil) {
    47        NSLog(@"%f %f", userLocation.location.coordinate.latitude, userLocation.location.coordinate.longitude);
    48  
    49         //将地图移动到当前位置
    50         float zoomLevel = 0.02; 
    51         BMKCoordinateRegion region = BMKCoordinateRegionMake(userLocation.location.coordinate,BMKCoordinateSpanMake(zoomLevel, zoomLevel)); 
    52         [_mapViewsetRegion:[_mapViewregionThatFits:region] animated:YES];
    53        
    54         //大头针摆放的坐标,必须从这里进行赋值,否则取不到值,这里可能涉及到委托方法执行顺序的问题
    55         CLLocationCoordinate2D coor;
    56         coor.latitude = userLocation.location.coordinate.latitude;
    57         coor.longitude = userLocation.location.coordinate.longitude;
    58         _annotation.coordinate = coor;
    59      }
    60 }
    61  
    62 /**
    63      定位失败后,会调用此函数
    64      @param mapView 地图View
    65      @param error  错误号,参考CLError.h中定义的错误号
    66  */
    67 - (void)mapView:(BMKMapView *)mapView didFailToLocateUserWithError:(NSError *)error
    68  
    69 {
    70      if (error != nil)
    71        NSLog(@"locate failed: %@", [error localizedDescription]);
    72      else {
    73        NSLog(@"locate failed");
    74      }
    75 }
    76  
    77 - (BMKAnnotationView *)mapView:(BMKMapView *)mapView viewForAnnotation:(id <BMKAnnotation>)annotation
    78 {
    79      if ([annotation isKindOfClass:[BMKPointAnnotationclass]]) {
    80        BMKPinAnnotationView *newAnnotation = [[BMKPinAnnotationViewalloc] initWithAnnotation:annotation reuseIdentifier:@"myAnnotation"];                 //初始化一个大头针标注
    81         NSLog(@"I'm coming!");
    82        newAnnotation.pinColor = BMKPinAnnotationColorPurple;  
    83        newAnnotation.animatesDrop = YES;
    84        newAnnotation.draggable = YES;
    85        return newAnnotation;  
    86      }
    87      returnnil;
    88 }

    执行后,效果如下:

    四 下载          ......去下载源码咯 ......

    五 思路

    六 分析

    用到的类:

    BMKMapManager(配合BMKMapView

    使用,用于启动一张地图

    BMKMapView

    BMKCoordinateRegion (配合BMKMapView

    使用,用于设置地图显示的范围和边界)

    BMKCoordinateRegionMake(配合BMKCoordinateRegion进行使用,用于创建一个BMKCoordinateRegion对象)

     BMKPointAnnotation

    CLLocationCoordinate2D

    配合BMKPointAnnotation使用,用于设置大头针显示的位置)

    用到的方法:

    用户位置更新后,会调用此函数

    - (void)mapView:(BMKMapView *)mapView didUpdateUserLocation:(BMKUserLocation *)userLocation

    //根据anntation生成对应的View

    - (BMKAnnotationView *)mapView:(BMKMapView *)mapView viewForAnnotation:(id <BMKAnnotation>)annotation

    七 疑问

    1)        以上委托方法的触发时机和执行顺序是什么?(这个问题必须解决,这个问题关系到大头针是否显示,何时显示的问题。)

  • 相关阅读:
    腾讯2022暑期实习服务器被挤爆,23届校招难度升级,该如何去准备?
    【校招VIP】出品:校招java大厂之 java考点5(jvm三大考点) 校招VIP
    【校招VIP|产品】从脑图到原型图
    博客互挂友链
    反爬虫技术和爬虫特点
    有时候你不逼自己一把,根本不知道自己潜力有多大
    阿里技术专家?10年+工作经验?架构能力不错但是….
    解决浏览器跨域问题
    Spring 最常用工具类汇总
    sass语言
  • 原文地址:https://www.cnblogs.com/ygm900/p/2783147.html
Copyright © 2020-2023  润新知