iOS中定位以及地图的使用

1.定位技术:

1.1 基站定位技术

根据移动通信信号,获取基站ID,查询苹果服务器或手机预置的基站信息计算出定位信息,速度快,但由于信号辐射范围大,误差几百上千米,使用三角定位


1.2 WiFi定位

Apple设备可根据周围WIFI热点(不用连接,只需要硬件mac地址,信号强弱等数据),通过苹果服务器或离线数据查询位置信息并计算出定位.支持地区相比基站定位少,精确度&速度中等.


1.3 卫星定位(GPS&GLONASS)

global position system 美国军方 24颗人造卫星 广播无线电信号  手机GPS模块通过分析多个卫星信号(计算角度)获取定位,精准度最高,不需要网络,但获取卫星信息非常耗时耗电, iPhone3G引入,飞行模式理论上也可以导航(飞行模式关蓝牙&wifi&移动通信接收的无线电)


1.4 A-GPS(assisted GPS)

根据基站&wifi定位数据 ,通过网络传给服务器,服务器传回GPS辅助信息,帮手机快速锁定卫星信号获取信息

2.什么是经纬度:

描述世界上某个点位置的统一标准

在地图上表示某点位置时,需要获取该点的经纬度


2.1.本初子午线

穿过英国伦敦格林文治天文台

往东边(右边)走,是东经(E

往西边(左边)走,是西经(W

东西经各180°,总共360°

2.2.赤道

往北边(上边)走,是北纬(N

往南边(下边)走,是南纬(S

南北纬各90°,总共180°


横跨经度\纬度越大(1° ≈ 111km

表示的范围就越大

 

在地图上看到的东西就越小


#pragma mark 1. 实现一次定位

1.创建位置管理者 统一管理定位服务

self.mgr = [[CLLocationManager alloc] init];

2.请求授权  友情提示设置info.plist

if ([self.mgr respondsToSelector:@selector(requestWhenInUseAuthorization)]) { //版本适配

    

    //当应用在使用可以获取定位服务

    [self.mgr requestWhenInUseAuthorization];

}

3. 获取数据 代理  mgr要强引用

///  当更新位置后调用,该方法会持续调用,返回位置信息(无论位置是否变化)

///

///  @param manager   位置管理者

///  @param locations 数组<<span style="line-height: normal; font-family: 'PingFang SC';">位置对象>

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations{..}

4. 开启定位

// 开启

[manager startUpdatingLocation];



#pragma mark 2. 实现持续定位


1. 距离筛选器 减少不必要的回调

self.mgr.distanceFilter = 10;

2. 期望精确度 减少不必要的能耗

self.mgr.desiredAccuracy = kCLLocationAccuracyBestForNavigation;



#pragma mark 3. 用户授权&iOS9新特性

1.当应用在使用(应用在前台)可以获取定位服务

[self.mgr requestWhenInUseAuthorization];


2.始终(应用在前台&后台)可以获取定位服务  用户反感

[self.mgr requestAlwaysAuthorization];


3.开启临时后台  设置后台运行模式(设置info.plist)

//iOS9新特性

self.mgr.allowsBackgroundLocationUpdates = YES;



#pragma mark 4. 计算两个位置的距离

1. 将经纬度封装成位置对象

CLLocation *location1 = [[CLLocation alloc] initWithLatitude:39.9longitude:116.4];

2. 计算距离  直线距离

CGFloat distance = [location1 distanceFromLocation:location2];



#pragma mark - . Geocoder


#pragma mark 1. 地理编码  人文信息转化为地理信息的过程


地理编码 人文信息 转为 地理信息

1.创建地理编码者

CLGeocoder *geocoder = [[CLGeocoder alloc] init];

2.进行地理编码

//NSArray * _Nullable placemarks 数组<<span style="line-height: normal; font-family: 'PingFang SC';">地标对象>

[geocoder geocodeAddressString:self.addressTF.text completionHandler:^(NSArray * _Nullable placemarks, NSError * _Nullableerror) {}];

3.CLPlacemark 地标对象,包含地理编码查询的数据(地理信息&人文信息)


 


#pragma mark 2. 反地理编码   地理信息转化为人文信息的过程

反地理编码  地理信息 -> 人文信息

1.创建地理编码者

CLGeocoder *geocoder = [[CLGeocoder alloc] init];

2.将经纬度封装成位置对象

CLLocation *location = [[CLLocation alloc] initWithLatitude:self.latitudeTF.text.floatValue longitude:self.longitudeTF.text.floatValue];

3.进行反地理编码

[geocoder reverseGeocodeLocation:location completionHandler:^(NSArray * _Nullable placemarks, NSError * _Nullable error) {}];


#pragma mark - . MapKit-MapView的基本使用


#pragma mark 1. 地图定位

1.MKMapView 用来显示地图

//所有使用的框架都需要导入,但是xcode可以根据代码对一部分系统框架进行自动导入

//如果只在IB工具中使用MKMapView,则需要手动导入框架

2.地图定位

1> 请求授权

1.请求授权  友情提示

self.mgr = [[CLLocationManager alloc] init];

if ([self.mgr respondsToSelector:@selector(requestWhenInUseAuthorization)]) {

    

    [self.mgr requestWhenInUseAuthorization];

}

2.地图定位 设置用户跟踪模式

self.mapView.userTrackingMode = MKUserTrackingModeFollow;




#pragma mark 2. 定位大头针

1.大头针视图是由系统添加的,其数据可以由大头针模型来设置  MKUserLocation定位大头针模型类

2.思路: 通过反地理编码获取人文信息并设置

3.设置代理  获取更新位置信息后的地理信息

self.mapView.delegate = self;

///  当更新用户位置后调用

///

///  @param mapView      地图视图

///  @param userLocation 定位大头针模型

- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation{}

4.根据经纬度进行反地理编码 转化为 人文信息

5.设置大头针模型的属性

self.mapView.userLocation.title = pm.locality;

self.mapView.userLocation.subtitle = pm.name;




#pragma mark 3. 地图类型

 


#pragma mark 4. 地图范围-"返回"(设置以用户所在位置为中心点)

方式1 动画设置用户跟踪模式

[self.mapView setUserTrackingMode:MKUserTrackingModeFollowanimated:YES];

方式2 设置地图显示的范围

 

1.中心点设置为定位点

CLLocationCoordinate2D center = self.mapView.userLocation.location.coordinate;

2.跨度设置当前地图的跨度

MKCoordinateSpan span = self.mapView.region.span;

3.设置地图的范围

[self.mapView setRegion:MKCoordinateRegionMake(center, span) animated:YES];


#pragma mark 5. 地图范围-"放大缩小"{获取地图显示区域改变时的中心点坐标及显示跨度)

1.中心点 设置为地图当前范围的中心点

CLLocationCoordinate2D center = self.mapView.region.center;

2.跨度 设置为地图当前范围的跨度 * 缩放系数

CLLocationDegrees latitudeDelta = self.mapView.region.span.latitudeDelta * 0.5;

 


#pragma mark 6. iOS9新特性

//是否显示指南针(罗盘)

self.mapView.showsCompass = YES;

//是否显示标尺 单位 英尺(mi) 3.2英尺 = 1

self.mapView.showsScale = YES;

//是否显示交通情况

self.mapView.showsTraffic = YES;



//是否显示建筑物的3D模型 只能在沙盘(3D/航拍)模式  高德地图不支持

self.mapView.showsBuildings = YES;

//设置地图的航拍属性

//    self.mapView.camera = [MKMapCamera cameraLookingAtCenterCoordinate:self.mapView.userLocation.location.coordinate fromDistance:100 pitch:45 heading:0];

//设置兴趣点

//    self.mapView.showsPointsOfInterest = NO;

//设置是否显示定位

//    self.mapView.showsUserLocation = NO;




#pragma mark - . MapKit-添加大头针


#pragma mark 1. 添加大头针

0.思路: 添加大头针视图是系统的事,开发者需要设置大头针模型来提供数据,为系统设置大头针视图

1.创建自定义大头针模型类 所有遵守MKAnnotation协议的类都可以作为大头针的模型

//@property的本质是自动声明&实现属性同名的set&get方法,并且创建同名加下划线的成员变量


//协议中@property只会声明属性同名的set&get方法,协议中出现属性直接拷贝出来使用

2.设置属性

2.1设置坐标  可以通过iOS的坐标转化为经纬度

2.1.1获取iOS坐标

UITouch *touch = touches.anyObject;

//获取点击事件所在视图的iOS坐标

CGPoint point = [touch locationInView:self.mapView];

2.1.2 转化为经纬度

CLLocationCoordinate2D coordinate = [self.mapView convertPoint:point toCoordinateFromView:self.mapView];

2.2设置标题

annotation.title = @"DH";

annotation.subtitle = @"野生程序员";

3.添加大头针模型到地图中

[self.mapView addAnnotation:annotation];



#pragma mark 2. 自定义大头针视图1-设置颜色&掉落

大头针视图也存在重用的机制,方便优化内容

0.实现协议方法

///  当大头针视图设置大头针模型时调用,在该方法中设置大头针视图的重用

///

///  @param mapView    地图视图

///  @param annotation 大头针模型

///

///  @return 大头针视图

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id)annotation{..}

1.设置重用ID

static NSString *identifier = @"anno";

2.从缓存池中取出大头针视图

MKPinAnnotationView *annoV = (MKPinAnnotationView *)[self.mapView dequeueReusableAnnotationViewWithIdentifier:identifier];

3.判断是否为空,为空则创建大头针视图

if(annoV == nil) {

    annoV = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:identifier];}

4.设置大头针视图的颜色  设置颜色需要使用MKAnnotationView的子类MKPinAnnotationView

annoV.pinTintColor = [UIColor purpleColor];

5.设置显示标注

annoV.canShowCallout = YES;

6.设置滑落动画

annoV.animatesDrop = YES;




#pragma mark 3. 自定义大头针视图2-设置图像

1.设置图片 只有基类MKAnnotationView才可以设置自定义图片

2.设置滑落动画 自定义动画 在已经添加大头针但是还没有显示大头针的时候设置自定义的动画

实现代理方法

///  已经添加大头针但是还没有显示大头针时调用,该方法就是专门用来设置大头针动画

///

///  @param mapView 地图视图

///  @param views   数组<<span style="line-height: normal; font-family: 'PingFang SC';">大头针视图>

- (void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views{

    for (MKAnnotationView *annoV in views) {

        //获取目标位置

        CGRect targetRect = annoV.frame;

        //设置起始的位置 改变y

        annoV.frame = CGRectMake(targetRect.origin.x, 0, targetRect.size.width, targetRect.size.height);

        //设置动画

        [UIView animateWithDuration:0.3 animations:^{

            annoV.frame = targetRect;

        }];

    }

    

}

3.过滤系统定位大头针

if ([annotation isKindOfClass:[MKUserLocation class]]) {

    return nil;

}

1.定位技术:

1.1 基站定位技术

根据移动通信信号,获取基站ID,查询苹果服务器或手机预置的基站信息计算出定位信息,速度快,但由于信号辐射范围大,误差几百上千米,使用三角定位


1.2 WiFi定位

Apple设备可根据周围WIFI热点(不用连接,只需要硬件mac地址,信号强弱等数据),通过苹果服务器或离线数据查询位置信息并计算出定位.支持地区相比基站定位少,精确度&速度中等.


1.3 卫星定位(GPS&GLONASS)

global position system 美国军方 24颗人造卫星 广播无线电信号  手机GPS模块通过分析多个卫星信号(计算角度)获取定位,精准度最高,不需要网络,但获取卫星信息非常耗时耗电, iPhone3G引入,飞行模式理论上也可以导航(飞行模式关蓝牙&wifi&移动通信接收的无线电)


1.4 A-GPS(assisted GPS)

根据基站&wifi定位数据 ,通过网络传给服务器,服务器传回GPS辅助信息,帮手机快速锁定卫星信号获取信息

2.什么是经纬度:

描述世界上某个点位置的统一标准

在地图上表示某点位置时,需要获取该点的经纬度


2.1.本初子午线

穿过英国伦敦格林文治天文台

往东边(右边)走,是东经(E

往西边(左边)走,是西经(W

东西经各180°,总共360°

2.2.赤道

往北边(上边)走,是北纬(N

往南边(下边)走,是南纬(S

南北纬各90°,总共180°


横跨经度\纬度越大(1° ≈ 111km

表示的范围就越大

 

在地图上看到的东西就越小


#pragma mark 1. 实现一次定位

1.创建位置管理者 统一管理定位服务

self.mgr = [[CLLocationManager alloc] init];

2.请求授权  友情提示设置info.plist

if ([self.mgr respondsToSelector:@selector(requestWhenInUseAuthorization)]) { //版本适配

    

    //当应用在使用可以获取定位服务

    [self.mgr requestWhenInUseAuthorization];

}

3. 获取数据 代理  mgr要强引用

///  当更新位置后调用,该方法会持续调用,返回位置信息(无论位置是否变化)

///

///  @param manager   位置管理者

///  @param locations 数组<<span style="line-height: normal; font-family: 'PingFang SC';">位置对象>

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations{..}

4. 开启定位

// 开启

[manager startUpdatingLocation];



#pragma mark 2. 实现持续定位


1. 距离筛选器 减少不必要的回调

self.mgr.distanceFilter = 10;

2. 期望精确度 减少不必要的能耗

self.mgr.desiredAccuracy = kCLLocationAccuracyBestForNavigation;



#pragma mark 3. 用户授权&iOS9新特性

1.当应用在使用(应用在前台)可以获取定位服务

[self.mgr requestWhenInUseAuthorization];


2.始终(应用在前台&后台)可以获取定位服务  用户反感

[self.mgr requestAlwaysAuthorization];


3.开启临时后台  设置后台运行模式(设置info.plist)

//iOS9新特性

self.mgr.allowsBackgroundLocationUpdates = YES;



#pragma mark 4. 计算两个位置的距离

1. 将经纬度封装成位置对象

CLLocation *location1 = [[CLLocation alloc] initWithLatitude:39.9longitude:116.4];

2. 计算距离  直线距离

CGFloat distance = [location1 distanceFromLocation:location2];



#pragma mark - . Geocoder


#pragma mark 1. 地理编码  人文信息转化为地理信息的过程


地理编码 人文信息 转为 地理信息

1.创建地理编码者

CLGeocoder *geocoder = [[CLGeocoder alloc] init];

2.进行地理编码

//NSArray * _Nullable placemarks 数组<<span style="line-height: normal; font-family: 'PingFang SC';">地标对象>

[geocoder geocodeAddressString:self.addressTF.text completionHandler:^(NSArray * _Nullable placemarks, NSError * _Nullableerror) {}];

3.CLPlacemark 地标对象,包含地理编码查询的数据(地理信息&人文信息)


 


#pragma mark 2. 反地理编码   地理信息转化为人文信息的过程

反地理编码  地理信息 -> 人文信息

1.创建地理编码者

CLGeocoder *geocoder = [[CLGeocoder alloc] init];

2.将经纬度封装成位置对象

CLLocation *location = [[CLLocation alloc] initWithLatitude:self.latitudeTF.text.floatValue longitude:self.longitudeTF.text.floatValue];

3.进行反地理编码

[geocoder reverseGeocodeLocation:location completionHandler:^(NSArray * _Nullable placemarks, NSError * _Nullable error) {}];


#pragma mark - . MapKit-MapView的基本使用


#pragma mark 1. 地图定位

1.MKMapView 用来显示地图

//所有使用的框架都需要导入,但是xcode可以根据代码对一部分系统框架进行自动导入

//如果只在IB工具中使用MKMapView,则需要手动导入框架

2.地图定位

1> 请求授权

1.请求授权  友情提示

self.mgr = [[CLLocationManager alloc] init];

if ([self.mgr respondsToSelector:@selector(requestWhenInUseAuthorization)]) {

    

    [self.mgr requestWhenInUseAuthorization];

}

2.地图定位 设置用户跟踪模式

self.mapView.userTrackingMode = MKUserTrackingModeFollow;




#pragma mark 2. 定位大头针

1.大头针视图是由系统添加的,其数据可以由大头针模型来设置  MKUserLocation定位大头针模型类

2.思路: 通过反地理编码获取人文信息并设置

3.设置代理  获取更新位置信息后的地理信息

self.mapView.delegate = self;

///  当更新用户位置后调用

///

///  @param mapView      地图视图

///  @param userLocation 定位大头针模型

- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation{}

4.根据经纬度进行反地理编码 转化为 人文信息

5.设置大头针模型的属性

self.mapView.userLocation.title = pm.locality;

self.mapView.userLocation.subtitle = pm.name;




#pragma mark 3. 地图类型

 


#pragma mark 4. 地图范围-"返回"(设置以用户所在位置为中心点)

方式1 动画设置用户跟踪模式

[self.mapView setUserTrackingMode:MKUserTrackingModeFollowanimated:YES];

方式2 设置地图显示的范围

 

1.中心点设置为定位点

CLLocationCoordinate2D center = self.mapView.userLocation.location.coordinate;

2.跨度设置当前地图的跨度

MKCoordinateSpan span = self.mapView.region.span;

3.设置地图的范围

[self.mapView setRegion:MKCoordinateRegionMake(center, span) animated:YES];


#pragma mark 5. 地图范围-"放大缩小"{获取地图显示区域改变时的中心点坐标及显示跨度)

1.中心点 设置为地图当前范围的中心点

CLLocationCoordinate2D center = self.mapView.region.center;

2.跨度 设置为地图当前范围的跨度 * 缩放系数

CLLocationDegrees latitudeDelta = self.mapView.region.span.latitudeDelta * 0.5;

 


#pragma mark 6. iOS9新特性

//是否显示指南针(罗盘)

self.mapView.showsCompass = YES;

//是否显示标尺 单位 英尺(mi) 3.2英尺 = 1

self.mapView.showsScale = YES;

//是否显示交通情况

self.mapView.showsTraffic = YES;



//是否显示建筑物的3D模型 只能在沙盘(3D/航拍)模式  高德地图不支持

self.mapView.showsBuildings = YES;

//设置地图的航拍属性

//    self.mapView.camera = [MKMapCamera cameraLookingAtCenterCoordinate:self.mapView.userLocation.location.coordinate fromDistance:100 pitch:45 heading:0];

//设置兴趣点

//    self.mapView.showsPointsOfInterest = NO;

//设置是否显示定位

//    self.mapView.showsUserLocation = NO;




#pragma mark - . MapKit-添加大头针


#pragma mark 1. 添加大头针

0.思路: 添加大头针视图是系统的事,开发者需要设置大头针模型来提供数据,为系统设置大头针视图

1.创建自定义大头针模型类 所有遵守MKAnnotation协议的类都可以作为大头针的模型

//@property的本质是自动声明&实现属性同名的set&get方法,并且创建同名加下划线的成员变量


//协议中@property只会声明属性同名的set&get方法,协议中出现属性直接拷贝出来使用

2.设置属性

2.1设置坐标  可以通过iOS的坐标转化为经纬度

2.1.1获取iOS坐标

UITouch *touch = touches.anyObject;

//获取点击事件所在视图的iOS坐标

CGPoint point = [touch locationInView:self.mapView];

2.1.2 转化为经纬度

CLLocationCoordinate2D coordinate = [self.mapView convertPoint:point toCoordinateFromView:self.mapView];

2.2设置标题

annotation.title = @"DH";

annotation.subtitle = @"野生程序员";

3.添加大头针模型到地图中

[self.mapView addAnnotation:annotation];



#pragma mark 2. 自定义大头针视图1-设置颜色&掉落

大头针视图也存在重用的机制,方便优化内容

0.实现协议方法

///  当大头针视图设置大头针模型时调用,在该方法中设置大头针视图的重用

///

///  @param mapView    地图视图

///  @param annotation 大头针模型

///

///  @return 大头针视图

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id)annotation{..}

1.设置重用ID

static NSString *identifier = @"anno";

2.从缓存池中取出大头针视图

MKPinAnnotationView *annoV = (MKPinAnnotationView *)[self.mapView dequeueReusableAnnotationViewWithIdentifier:identifier];

3.判断是否为空,为空则创建大头针视图

if(annoV == nil) {

    annoV = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:identifier];}

4.设置大头针视图的颜色  设置颜色需要使用MKAnnotationView的子类MKPinAnnotationView

annoV.pinTintColor = [UIColor purpleColor];

5.设置显示标注

annoV.canShowCallout = YES;

6.设置滑落动画

annoV.animatesDrop = YES;




#pragma mark 3. 自定义大头针视图2-设置图像

1.设置图片 只有基类MKAnnotationView才可以设置自定义图片

2.设置滑落动画 自定义动画 在已经添加大头针但是还没有显示大头针的时候设置自定义的动画

实现代理方法

///  已经添加大头针但是还没有显示大头针时调用,该方法就是专门用来设置大头针动画

///

///  @param mapView 地图视图

///  @param views   数组<<span style="line-height: normal; font-family: 'PingFang SC';">大头针视图>

- (void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views{

    for (MKAnnotationView *annoV in views) {

        //获取目标位置

        CGRect targetRect = annoV.frame;

        //设置起始的位置 改变y

        annoV.frame = CGRectMake(targetRect.origin.x, 0, targetRect.size.width, targetRect.size.height);

        //设置动画

        [UIView animateWithDuration:0.3 animations:^{

            annoV.frame = targetRect;

        }];

    }

    

}

3.过滤系统定位大头针

if ([annotation isKindOfClass:[MKUserLocation class]]) {

    return nil;

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值