你的位置:首页 > 操作系统

[操作系统]地图篇


地图篇-01.获取用户位置

今天把地图整理了一下,共享出来和大家一起分享,希望帮助到不了解的朋友,当然很精通的朋友希望指正小生的不足.

1.说到地图,首先要接触一个framework -CoreLocation.framework

创建一个项目

点击"+"号之后,跳转到下个界面

导入完毕

2.原理:

  大家平时在使用iPhone时,每下载一个App,第一次打开的时候,都会有这样的提示

 

是吧,这时候我们如果选择了不允许的话,这个App是获取不了我们的位置的,相应的App里面涉及到位置的功能我们都用不了(比如微信和QQ的"附近的人")

所以每次我都被App的意志强奸,选择允许

那么,如果选择了不允许之后,又想选择允许怎么办呢?下图

可以到设置->隐私->定位服务里面去打开定位服务,所有的App,只要有定位功能的都会在这里面显示,还可以选择性打开自己想要打开的App定位

所以,在我们写代码的时候,第一步就要判断用户是否打开了定位服务.

接下来看下图

 

 

大家会从上图右侧看到,有的App是"使用期间",有的又是"始终",有的是"永不"

对,这是一个定位的状态,或者说模式,就是说你希望什么时候用这个App的定位服务,或者是不使用

点进去会看到如下图示

和下图

大家又会发现在以上两张图片中,微博比手机淘宝多了一个字段,这是为什么呢?

首先,在iOS8之后,获取用户位置需要在info.plist文件中添加字段,下图

常用字段:NSLocationAlwaysUsageDescription(始终)和NSLocationWhenInUseUsageDescription(使用期间),如果只添加一个,就会像上图那样有的只有使用期间,或者有的只有始终,亦或者有的App两者都有

所以,在判断用户打开定位服务之后,我们要判断用户的授权状态

3.在写代码之前,先来理理逻辑:

大家都知道在日常生活中,我们使用地图的时候,基本都是用经纬度来表示位置(要是不知道这个的话可以问问科学家),在iOS编码中也一样,也是用经纬度来表示用户位置,大家看到的地址名字不过是地理编码后显示的文本.

上述步骤完成之后,我们就可以开始定位了.

4.代码

 

 1 // 2 // ViewController.m 3 // 地图 4 // 5 // Created by admin on 16/5/21. 6 // Copyright © 2016年 邓驹. All rights reserved. 7 // 8  9 #import "ViewController.h"10 11 //导入头文件(也可以创建一个pch文件,在pch文件中导入下面头文件)12 #import <CoreLocation/CoreLocation.h>13 14 @interface ViewController ()<CLLocationManagerDelegate>15 16 @property (nonatomic, strong) CLLocationManager *manager;17 18 @end19 20 @implementation ViewController21 22 - (void)viewDidLoad {23   [super viewDidLoad];24   //1.判断用户是否开启定位服务25   if (![CLLocationManager locationServicesEnabled]) {26     NSLog(@"请开启定位服务");27     return;28   }29   //2.判断用户授权状态30   if ([CLLocationManager authorizationStatus] != kCLAuthorizationStatusAuthorizedWhenInUse) {31     //请求用户授权32     //后台可以定位33 //    [self.manager requestAlwaysAuthorization];34     //允许在前台使用GPS描述,后台不能定位35     [self.manager requestWhenInUseAuthorization];36   }37   //3.开始定位38   [self.manager startUpdatingLocation];39 }40 41 -(CLLocationManager *)manager {42   if (!_manager) {43     _manager = [[CLLocationManager alloc] init];44     //定位精度(误差)45     _manager.desiredAccuracy = kCLLocationAccuracyBest;46     //位置更新的最小距离(如果不设置这个属性,程序会一直获取用户当前位置,是非常耗电的)47     _manager.distanceFilter = 100;48     _manager.delegate = self;49   }50   return _manager;51 }52 53 /**54  * 当获取到用户位置的时候调用55  *56  * @param manager  当前manager57  * @param locations 用户的位置58 */59 -(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations {60   //获取用户的最新位置61   CLLocation *userLocal = [locations lastObject];62   //停止定位63   [self.manager stopUpdatingHeading];64   //通过经纬度来获取用户位置65   //纬度66   CLLocationDegrees latitude = userLocal.coordinate.latitude;67   //经度68   CLLocationDegrees longtitude = userLocal.coordinate.longitude;69   NSLog(@"纬度:%f,经度:%f",latitude,longtitude);70 }71 72 - (void)didReceiveMemoryWarning {73   [super didReceiveMemoryWarning];74   // Dispose of any resources that can be recreated.75 }76 77 @end

打印结果:

1 2016-05-21 19:40:37.242 地图[2172:76214] 纬度:37.785834,经度:-122.406417

东经为正数,西经为负数

取值范围:-180~180

北纬为正数,南纬为负数

取值范围:-90~90

注意:

CLLocationManager创建对象,必须要用强引用,不然可能会提前释放.

5.计算两点间的距离

 1 /** 2  * 计算两点间的距离 3 */ 4 -(void)calculateDistance{ 5   CLLocation *beijing = [[CLLocation alloc] initWithLatitude:39.54 longitude:116.28]; 6   CLLocation *chengdu = [[CLLocation alloc] initWithLatitude:30.67 longitude:104.06]; 7   //计算距离(单位是米) 8   CLLocationDistance distance = [beijing distanceFromLocation:chengdu]; 9   NSLog(@"北京到成都的距离是:%f米",distance);10 }

打印结果:

1 2016-05-21 19:50:06.315 地图[2201:79784] 北京到成都的距离是:1483882.846655米

本节内容到这就完了,下一节是地理编码,望大家指正,不明白的可以评论或者留言,我会第一时间回复.谢谢