美文网首页
iOS百度地图开发中遇到的一些问题

iOS百度地图开发中遇到的一些问题

作者: 冬天里寒风起 | 来源:发表于2018-07-03 13:55 被阅读1066次

    由于项目需要地图功能,公司决定使用百度地图,但是百度地图也有很多问题,现在总结一下在百度地图中遇到的坑,希望给各位看官一点参考,避免走一些弯路.我使用的百度地图SDK2.9.1.

    iOS地图SDK链接,上面的连接是一些注意事项.

    (一)关于定位的一些设置

    //初始化定位服务
    _locService = [[BMKLocationService alloc] init];
    //设置距离过滤器(默认距离是米)
    _locService.distanceFilter = 10;
    //设置定位精度
    _locService.desiredAccuracy = kCLLocationAccuracyBest;
    //开启定位服务
    [_locService startUserLocationService];
    //指定定位:是否允许后台定位更新。默认为NO。只在iOS 9.0之后起作用
    if ([[UIDevice currentDevice].systemVersion doubleValue] >= 9) {
            _locService.allowsBackgroundLocationUpdates = YES;
    }
    //设置定位的状态
    _mapView.userTrackingMode = BMKUserTrackingModeNone;
    //显示定位图层
    _mapView.showsUserLocation = YES;
    //设置定位图层自定义样式
    BMKLocationViewDisplayParam *userlocationStyle = [[BMKLocationViewDisplayParam alloc] init];
    //精度圈是否显示
    userlocationStyle.isRotateAngleValid = YES;
    //跟随态旋转角度是否生效
    userlocationStyle.isAccuracyCircleShow = NO;
    //定位图标
    userlocationStyle.locationViewImgName = [UIImage imageNamed:@"图标名称"];
    //更新参样式信息
    [_mapView updateLocationViewWithParam:userlocationStyle];
    
    

    (二)关于当前定位位置

    首先,显示当前位置,百度地图提供了三种模式:

    typedef enum {
        BMKUserTrackingModeNone = 0,             /// 普通定位模式
        BMKUserTrackingModeFollow,               /// 定位跟随模式
        BMKUserTrackingModeFollowWithHeading,    /// 定位罗盘模式
    } BMKUserTrackingMode;
    
    
    image.png

    使用下面代码就能设置定位状态:

    //设置定位的状态
        _mapView.userTrackingMode = BMKUserTrackingModeNone;
    

    普通定位模式没有问题,但是如果设置定位跟随或定位罗盘模式,运行app,你会发现定位点确实是对应的状态,但是当你拖动地图的时候,你就会发现后两种模式,又变回了普通定位模式.

    我问了百度地图的工程师,他们说这是当前的策略...

    所以我感觉设置跟随模式和罗盘模式没有什么卵用...

    (三)关于用户方向更新后的设置

    如上面(一)所述,定位点可是设置样式参数,当你自定义了定位图标后,你会发现定位图标确实换为了自己定义的图标,而且当用户方向更新后,定位图标是回发生旋转的,但是当你点击触摸屏幕后,定位图标马上变为初始的情况,并且用户方向更新,定位图标不在发生变化.

    对于这种情况,我想了一个办法,就是使用系统的定位,在地图界面添加一个方向的图标,如下图:


    image.png

    代码如下:

    - (void)viewDidLoad {
        //版本号
        if ([[UIDevice currentDevice].systemVersion doubleValue] >= 8.0) {
            //主动请求权限
            [self.mgr requestAlwaysAuthorization];
        }
        if ([[UIDevice currentDevice].systemVersion doubleValue] >= 9) {
            self.mgr.allowsBackgroundLocationUpdates = YES;
        }
        //对系统定位进行设置
        self.mgr.delegate = self;
        [self.mgr startUpdatingLocation];
        //开始监听(开始获取位置)
        [self.mgr startUpdatingHeading];
    }
    //pragma mark -用户方向更新后,会调用此函数
    - (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading {
        // 将获取到的角度转为弧度 = (角度 * π) / 180;
        CGFloat angle = newHeading.magneticHeading * M_PI / 180;
        // 旋转图片
        self.compasspointer.transform = CGAffineTransformMakeRotation(-angle);
    }
    //pragma mark - 懒加载
    - (CLLocationManager *)mgr
    {
        if (!_mgr) {
            _mgr = [[CLLocationManager alloc] init];
        }
        return _mgr;
    }
    

    当然如果觉得这种处理不好,可以再想其他解决办法~

    (四)关于app切换到后台产生的问题

    当app切换到后台再切换回前台,mapView 可能会产生黑屏的情况,此时只需在AppDelegate.m 中的applicationWillResignActive:(UIApplication *)applicationapplicationDidBecomeActive:(UIApplication *)application 添加如下代码:

    - (void)applicationWillResignActive:(UIApplication *)application {
        //程序将要进入后台
        [BMKMapView willBackGround];
    }
    - (void)applicationDidBecomeActive:(UIApplication *)application {
        //程序进入前台
        [BMKMapView didForeGround];
    }
    
    

    (五)关于BMKLocationServiceDelegate

    设置定位的委托有如下两种方式:

    • 方式1:
    - (void)viewDidLoad {
        [super viewDidLoad];
        _mapView.delegate = self; 
        _locService.delegate = self;
    }
    -(void)viewWillDisappear:(BOOL)animated {
        [super viewWillDisappear:animated];
        _locService.delegate = nil;
    }
    
    • 方式2
    -(void)viewWillDisappear:(BOOL)animated {
        [super viewWillDisappear:animated];
        _locService.delegate = nil;
    }
    - (void)viewWillAppear:(BOOL)animated {
        [super viewWillAppear:animated];
        _locService.delegate = self;
    }
    
    

    上面两种方式的区别:

    如果在viewDidLoad里写定位委托的话,加载完mapView后,定位当前位置是可以正常显示,并且可以随着位置的变化,定位点也随之发生变化.如果切换到后台,然后再切换回mapView界面,定位点还是会变化.但是会产生一个问题,当点击别的tabbar,切换到别的界面后,再切换回mapView界面,定位点就不再随着位置的变化而发生变化了.

    如果采用方式2的话,就会避免这种问题.

    (六)关于标注与当前位置间距离的计算

    //设置标注的经纬度坐标
        CGFloat latitude = 39.915168;
        CGFloat longitude = 116.403875;
        anno.coordinate = CLLocationCoordinate2DMake(latitude, longitude);
        //计算所选坐标和当前位置之间的距离
        CLLocationCoordinate2D currentAnno = CLLocationCoordinate2DMake(latitude, longitude);
            BMKMapPoint mp1 = BMKMapPointForCoordinate(currentAnno);
            BMKMapPoint mp2 = BMKMapPointForCoordinate(userLocation.location.coordinate);
            //distance的单位是米
            CLLocationDistance distance = BMKMetersBetweenMapPoints(mp1, mp2);
    

    最后,需要说明一下,系统地图和高德地图我也用过了,用法和百度地图非常相似,尤其是高德地图,更是相似,很多地方都是把前缀换一下就OK了,其他代码都不用改,但是有个别地方还是有区别的,比如说百度地图的paopaoView,高德地图和百度地图是不一样的.

    群里会不定时分享面试题及答案和Demo,群号:776296806


    QQ图片20180531173835.jpg

    相关文章

      网友评论

          本文标题:iOS百度地图开发中遇到的一些问题

          本文链接:https://www.haomeiwen.com/subject/qtwduftx.html