• 百度地图定位,标注以及地图中心点问题


    关于百度地图的相关配置以及库的合并方法请查看官方文档,上面说的很详细,

    下面是在配置好的基础上进行的。

    1、引入百度地图的库的头文件

        //百度地图
        #import <BaiduMapAPI/BMapKit.h>
        #import <BaiduMapAPI/BMKMapView.h>

    2、我是直接使用xib进行开发的,我直接让当前显示地图的view继承自BMKMapView,建立属性连接

    @property (strong, nonatomic) IBOutlet BMKMapView *myMapView;

    3、在-(void)viewWillAppear:(BOOL)animated和-(void)viewWillDisappear:(BOOL)animated中设置地图

    -(void)viewWillAppear:(BOOL)animated{
        [super viewWillAppear:YES];
        [self setNavBarTranslucent];//导航栏透明,不遮挡地图
        [_myMapView viewWillAppear];
        _myMapView.delegate = self;
        locService.delegate = self;

        //开始定位
        [locService startUserLocationService];
        
    }

    -(void)viewWillDisappear:(BOOL)animated{
        [super viewWillDisappear:YES];
        
        [self setNavBarBackImage];
        [_myMapView viewWillDisappear];
        //停止定位
        [locService stopUserLocationService];
        _myMapView.delegate = nil;
        locService.delegate  = nil;
        
    }

    4、在- (void)viewDidLoad中初始化地图和定位

       locService = [[BMKLocationService alloc]init];//初始化定位服务
        _myMapView.showsUserLocation = NO;//不显示当前用户所在位置
        _myMapView.userTrackingMode = BMKUserTrackingModeNone;
        _myMapView.zoomLevel = 17;//地图显示的级别
        _myMapView.showMapScaleBar = YES;//显示比例尺

    5、当用户的位置变化以及开始定位时都会调用这个代理方法

    #pragma mark -用户位置更新后,会调用此函数
    - (void)didUpdateBMKUserLocation:(BMKUserLocation *)userLocation
    {
        NSLog(@"didUpdateUserLocation lat %f,long %f",userLocation.location.coordinate.latitude,userLocation.location.coordinate.longitude);
        [_myMapView updateLocationData:userLocation];

       //设置地图的中心点和范围
        BMKCoordinateRegion region ;//表示范围的结构体
        region.center = userLocation.location.coordinate;//中心点(当前定位的点)
        region.span.latitudeDelta = 0.05;//经度范围
        region.span.longitudeDelta = 0.05;//纬度范围
        [_myMapView setRegion:region animated:YES];
        //获取地理位置(自己写的一个方法,把经纬度传进去得到地理位置)
        [self getAddressByCoordinate:userLocation.location.coordinate];

        //停止定位
        [locService stopUserLocationService];

    }

    - (void)getAddressByCoordinate:(CLLocationCoordinate2D)coordinate {
       CLLocation *location = [[CLLocation alloc] initWithLatitude:coordinate.latitude longitude:coordinate.longitude];
        CLGeocoder *geocoder = [[CLGeocoder alloc]init];
        geocoder.accessibilityValue = @"zh-hans";
        [geocoder reverseGeocodeLocation:location completionHandler:^(NSArray *placemarks, NSError *error) {
            
            CLPlacemark *placemark = [placemarks lastObject];
            NSString *Country = [placemark.addressDictionary objectForKey:@"Country"];  //国家
            NSString *State = [placemark.addressDictionary objectForKey:@"State"];  //省份
            NSString *city = [placemark.addressDictionary objectForKey:@"City"];        //省份
            NSString *SubLocality = [placemark.addressDictionary objectForKey:@"SubLocality"];  //区
            NSString *Street = [placemark.addressDictionary objectForKey:@"Street"];
            NSString *Thoroughfare = [placemark.addressDictionary objectForKey:@"Thoroughfare"];
            
            NSString *Name = [placemark.addressDictionary objectForKey:@"Name"];
            NSLog(@"总:%@,城市:%@,国家:%@,省份:%@,街道:%@,%@--%@",Name,city,Country,State,Street,SubLocality,Thoroughfare);
            if (Thoroughfare == nil) {// 街道定位可能是空值
                Thoroughfare = @"";
            }
            NSString *address = [NSString stringWithFormat:@"%@%@%@%@",State,city,SubLocality,Thoroughfare];
            [self addPointAnnotationWith:location address:address];//添加标注
        }];
    }

    #pragma mark -添加标注
    #pragma mark -添加标注
    - (void)addPointAnnotationWith:(CLLocation*)loc address:(NSString*)address
    {
        //设置标注
        myAnnotation = [[MyAnnotation alloc]init];
        myAnnotation.coordinate = loc.coordinate;
        myAnnotation.title = address;
        myAnnotation.icon = @"";
        [self.myMapView addAnnotation:myAnnotation];
        //一开始就显示该地方的标注信息
        [_myMapView selectAnnotation:myAnnotation animated:YES];

    }

    #pragma mark - 根据anntation生成对应的View
    - (BMKAnnotationView *)mapView:(BMKMapView *)mapView viewForAnnotation:(MyAnnotation*)annotation
    {
        static NSString *annoID = @"anno";
        //设置MKPinAnnotationView可以设置大头针的颜色和气泡,MKAnnotationView只能设置大头针视图
        BMKPinAnnotationView *view = (BMKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:annoID];
        if (view ==nil) {
            view = [[BMKPinAnnotationView alloc]initWithAnnotation:annotation reuseIdentifier:annoID];
            //设置气泡
            view.canShowCallout = YES;
            //设置大头针的颜色
            view.pinColor = MKPinAnnotationColorGreen;
            //设置大头针显示的数据
            view.annotation = annotation;
            view.image = [UIImage imageNamed:annotation.icon];
            
        }
        return view;
    }

    在这里我添加的标注是自己定义的一个遵循BMKAnnotation协议的一个标注类

    #import <Foundation/Foundation.h>
    #import <MapKit/MapKit.h>

    @interface MyAnnotation : NSObject<BMKAnnotation>

    @property (nonatomic, assign) CLLocationCoordinate2D coordinate;

    @property (nonatomic, copy) NSString *title;

    @property (nonatomic, copy) NSString *subtitle;

    @property (nonatomic, copy) NSString *icon;

    - (void)setCoordinate:(CLLocationCoordinate2D)newCoordinate;
    @end

    .m文件中没有任何方法

    我在xib的中心点位置固定了一个大小的imageview,移动地图的时候图片控件不会发生变化,结束移动的时候会在中心点的位置显示当前中心点的地理信息,而这个标注的icon属性,我设置的是加载一个空的图片,这样就可以实现我移动地图的时候,中心点不移动,移送完成之后会立刻显示当前的地理位置信息

    这些是实现定位要做的工作,

    6、地图停止定位之后会调用下面的方法

    - (void)didStopLocatingUser{

        NSLog(@"定位停止");
    }

    #pragma mark -定位失败后,会调用此函数
    - (void)didFailToLocateUserWithError:(NSError *)error
    {
        NSLog(@"location error--%@",error.localizedDescription);
    }

    7、在拖动地图的时候想要在地图中心点显示当前的地理位置信息,此时地图的中心点发生改变,要实现的方法

    -(void)mapView:(BMKMapView *)mapView regionDidChangeAnimated:(BOOL)animated{
        CLLocationCoordinate2D coordinate= _myMapView.centerCoordinate;
        //拖动地图的时候,显示当前地图中心点的地理位置,标注会在拖动结束的时候跑到中心点
        [self getAddressByCoordinate:coordinate];//这个是获取当前的地图中心点以及添加标注的方法 ,上面在定位的时候也是这个方法,封装起来便于调用

    }

    8、点击标注触发的函数

    #pragma mark -点击标注触发的事件
    - (void)mapView:(BMKMapView *)mapView annotationViewForBubble:(BMKAnnotationView *)view{
        //TODO:点击标题之后返回经纬度,上一个界面根据经纬度查询数据
        NSLog(@"标注被点击了");
    }

    点击标注点返回上个界面,并传递回来一个经纬度的值,在上个界面中根据经纬度继续加载数据,

    9、介绍的有点不足,望大家指正,还有一些功能正在完善中,

    握不住的沙,干脆扬了它。
  • 相关阅读:
    AWS 磁盘 在线扩容(SSD 磁盘)
    磁盘扩容出错:e2fsck: Bad magic number in super-block while trying to open /dev/vdb1
    manjaro_install_all_in_one
    docker_info_06_stressTest 压力测试
    docker_info_05_registry 仓库管理
    docker_info_04_image 镜像管理
    docker_info_03_volume 数据卷管理
    docker_info_02_network 网络管理
    docker_info_01_install 安装
    docker-ce_install_centos75
  • 原文地址:https://www.cnblogs.com/zj901203/p/4531119.html
Copyright © 2020-2023  润新知