iOS关于地图定位基础(二)

  在前一篇文章 iOS关于地图定位基础(一) 中我们主要总结了 iOS 里面利用原生 CoreLocation 框架实现基本定位功能和一些注意点,侧重点主要是iOS8+之后的定位授权与授权状态的使用。接下来本篇文章主要是讲解如何利用 CoreLocation 框架实现地理定位、区域监听、地理编码的具体实现。(PS:下文涉及我自定义的指南针Demo请去我的GitHub仓库查看源码https://github.com/IMLoser/HWCompass,谢谢大家支持。)

  一、定位实现&监听方向)那么我们先来看看这个代理方法:  

// 通过位置管理者一旦定位到位置,就会一直调用这个代理方法
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations;


  在这个方法中共有两个参数,一个是位置管理者,另一个就是保存有位置对象(CLLocation)的数组,这个数组中位置对象的存放顺序是按照时间排序的,那么最新的定位信息永远是数组最后一个元素。那么 CLLocation 对象又是什么呢?我们看看以下代码:

#pragma mark - CLLocationManagerDelegate
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations {
    
    CLLocation * location = [locations lastObject];
    
    /*
     
     CLLocation 位置对象的重要属性:
     
     coordinate 定位到的经纬度坐标
     altitude 海拔
     horizontalAccuracy 水平精确度
     verticalAccuracy 垂直精确度
     course 航向(取值0 ~ 359.9)
     speed 速度
     
     */
    
}

  光看干巴巴的属性来学习始终不够形象,下面我们来看个小案例 : 显示用户每次行走的方向和角度以及针对于上一次定位行走的距离,如 :  北偏东 30度 移动了12米。代码如下 :

{
    // 记录上一次位置
    CLLocation *_oldLocation;
}

#pragma mark - CLLocationManagerDelegate
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations {
    
    CLLocation * location = [locations lastObject];
    NSString * locationInfo = nil;
    NSInteger direction = (NSInteger)location.course / 90;
    
    // 获取方向
    switch (direction) {
        case 0:
            locationInfo = @"北偏东";
            break;
            
        case 1:
            locationInfo = @"东偏南";
            break;
            
        case 2:
            locationInfo = @"南偏西";
            break;
            
        case 3:
            locationInfo = @"西偏北";
            break;
            
        default:
            break;
    }
    
    
    // 获取角度
    NSInteger angle = (NSInteger)location.course % 90;
    if (!angle) {
        
        locationInfo = [NSString stringWithFormat:@"正%@", [locationInfo substringToIndex:1]];
        
    } else {
        locationInfo = [locationInfo stringByAppendingString:[NSString stringWithFormat:@"%zd度", angle]];
    }
    
    
    // 获取移动的距离
    NSInteger distance = 0;
    if (_oldLocation) {
        distance = [location distanceFromLocation:_oldLocation];
    }
    _oldLocation = location;
    
    
    // 拼接打印
    locationInfo = [locationInfo stringByAppendingString:[NSString stringWithFormat:@"移动了%zd米", distance
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值