关于地图:CoreLocation的使用

基本概念

  • 地图和定位功能基于两个框架:

    • Map Kit:用于地图展示
    • Core Location:用于地理定位
  • 2个入门专业术语:

    • LBS Location Based Service 基于位置的服务 (查看周边)
    • SoLoMo: Social Local Mobil (索罗门) 社交本地移动(微信陌陌的定位)
  • 经纬度结构体:CLLocationCoordinate2D - CLLocationCoordinate2DMake
    • 北京约119°,40°
    • 1经度约是111km
    • 一般情况下模拟器没有经纬度,需要手动设置 Debug-Location-CustomLocation

获取用户的地址

  • 从iOS6开始,获取用户的位置需要经过用户的授权。
  • iOS7:开发者可以在Info.plist中设置NSLocationUsageDescription说明定位的目的(Privacy - Location Usage Description)
    这里写图片描述

  • iOS8开始,设置比较复杂,分两种情况

    • 总是使用用户位置:NSLocationAlwaysUsageDescription
    • 使用应用时定位:NSLocationWhenInUseDescription

iOS8获取用户位置的具体使用

  • 导入框架
CLLocationManager *manager = [[CLLocationManager alloc] init];

获取授权

  • 判断用户是否已经授权:只有在未请求过的状态下才需要请求。并且需要判断版本,只有iOS8以上才需要发送请求
CLAuthorizationStatus status = [CLLocationManager authorizationStatus];
if (status == kCLAuthorizationStatusNotDetermined) {
    if ([[UIDevice currentDevice].systemVersion doubleValue] >= 8.0){
        [manager requsetWhenInUseAuthorization];
    }
    // 或者可以根据方法是否有响应来判断
    // if (manager respondsToSelector:@selector(requsetWhenInUseAuthorization)) {
    //     [manager requsetWhenInUseAuthorization];
    // }
}
  • 仅这些还不够,还需要在info.plist里设置字段
    - 注意字段找不到,需要手动复制过去。请求的是哪种状态,就添加哪个字段
    这里写图片描述
  • 但运行还是没有请求通知出来,因为manager是个局部变量,需要保存起来。换成用懒加载的方式创建manager,运行,完成。

获取定位

  • 设置代理self.manager.delegate = self;
  • 告诉系统,开始定位[self.manager startUpdatingLocation];
  • 实现代理方法
// Xcode6.3.2的iPhone6模拟器有问题,不执行这个方法
- (void)locationManager:(CLLocationManager *)manager didUpdateLocation:(NSArray *)locations{}
  • 这个代理方法会不停调用,每获得一个位置都会执行。如果是仅仅想拿到用户的位置,可以在获取到位置之后停止定位
- (void)locationManager:(CLLocationManager *)manager didUpdateLocation:(NSArray *)locations{
    // 拿到用户位置对象
    CLLocation *location = [locations lastObject];
    // 拿到用户当前位置的经纬度
    CLLocationCoordinate2D coordinate = location.coordinate;
    NSLog(@"纬度 = %.2f",coordinate.latitude);
    NSLog(@"经度 = %.2f",coordinate.longitude);
    // 停止定位
    [manager stopUpdatingLocation];
}

把获得的位置传给服务器

  • 具体在使用中,获得用户位置信息之后,要传给服务器,然后服务器再根据你的位置信息再给你下一步响应。

CLLocation的其它属性

  • altitude海拔(不是很准确)
  • horizontalAccuracy水平精度
  • verticalAccuracy垂直精度
  • course方向(0-360°,不准)
  • speed速度(不准)
  • timestamp定位的时间

CLLocationManager的属性

  • desiredAccuracy 设置定位精度,可以传任意double,但一般用系统给的几个枚举,默认kCLLocationAccuracyBest,精度越高,越耗电,越占性能。默认是
    • 比如网易新闻,只需要不精确的定位即可
    • 导航就需要最精确的
  • distanceFilter 设置当用户移动多少距离的时候重新定位,可以传任意double,单位是米
    - 注意,要设置重新定位说明需要不断定位,上面那个停止定位的代码要去掉。系统就会在移动你设置的距离之后重新定位

计算距离(了解,一般交给服务器)

“`
- (void)countDistance
{
// 北京:39.6 116.39
// 广州:23.08 113.15
CLLocation *location1 = [[CLLocation alloc] initWithLatitude:39.6 longitude:116.39];
CLLocation *location2 = [[CLLocation alloc] initWithLatitude:23.08 longitude:113.15];

// 计算距离
CLLocationDistance distance = [location1 distanceFromLocation:location2];
NSLog(@"%.2f", distance);

}
“`

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值