iOS开发之CoreLocation框架使用(二)

简介: iOS开发之CoreLocation框架使用

三、进行GEO编码的工具类CLGeocoder


     如前所述,使用CLLocationManager获取到的位置信息是CLLocation对象,这个对象封装了经纬度等基础信息,但是在实际开发中,我们往往需要获取到的是位置的更多实际信息,比如国家,省份,城市等等,GEO编码的作用就是通过经纬度信息发起请求,获取现实意义的更多数据。CLGeocoder类解析如下:


//是否正在进行GEO编码

@property (nonatomic, readonly, getter=isGeocoding) BOOL geocoding;

//反地理位置信息编码

/*

CLGeocodeCompletionHandler会传回一组标志建筑物

*/

- (void)reverseGeocodeLocation:(CLLocation *)location completionHandler:(CLGeocodeCompletionHandler)completionHandler;

//作用同上 local用来设置区域 可以通过这个参数控制返回的语言

- (void)reverseGeocodeLocation:(CLLocation *)location preferredLocale:(nullable NSLocale *)locale completionHandler:(CLGeocodeCompletionHandler)completionHandler;


//下面这些方法通常与 AddressBook配合使用

//将地址信息字典进行编码 这个方法与AddressBook框架配合使用 AddressBook框架中定义这个字典

- (void)geocodeAddressDictionary:(NSDictionary *)addressDictionary completionHandler:(CLGeocodeCompletionHandler)completionHandler;

- (void)geocodeAddressString:(NSString *)addressString completionHandler:(CLGeocodeCompletionHandler)completionHandler;

- (void)geocodeAddressString:(NSString *)addressString inRegion:(nullable CLRegion *)region completionHandler:(CLGeocodeCompletionHandler)completionHandler;

- (void)geocodeAddressString:(NSString *)addressString inRegion:(nullable CLRegion *)region preferredLocale:(nullable NSLocale *)locale completionHandler:(CLGeocodeCompletionHandler)completionHandler;

//对邮编地址进行GEO编码

- (void)geocodePostalAddress:(CNPostalAddress *)postalAddress completionHandler:(CLGeocodeCompletionHandler)completionHandler;

- (void)geocodePostalAddress:(CNPostalAddress *)postalAddress preferredLocale:(nullable NSLocale *)locale completionHandler:(CLGeocodeCompletionHandler)completionHandler;

//取消编码

- (void)cancelGeocode;

四、位置信息模型CLLocation相关类


   首先在CoreLocation框架中,位置的经纬度是由CLLocationCoordinate2D结构体描述的,这个结构体定义如下:


struct CLLocationCoordinate2D {

CLLocationDegrees latitude; //精度

CLLocationDegrees longitude;//维度

};

使用下面的函数可以快速的检查和创建CLLocationCoordinate2D对象:


//检查经纬度对象是否有效

BOOL CLLocationCoordinate2DIsValid(CLLocationCoordinate2D coord);

//创建对象

CLLocationCoordinate2D CLLocationCoordinate2DMake(CLLocationDegrees latitude, CLLocationDegrees longitude);

CLFloor类是一个用来描述楼层信息的模型,并不一定精准,是基于地面的粗略计算,其中属性如下:


@interface CLFloor : NSObject <NSCopying, NSSecureCoding>

//楼层 地下室可能为负值

@property(readonly, nonatomic) NSInteger level;


@end

下面列举了CLLocation中封装的属性的方法:


//初始化方法

//通过经纬度初始化 CLLocationDegrees就是double类型

- (instancetype)initWithLatitude:(CLLocationDegrees)latitude

longitude:(CLLocationDegrees)longitude;

//初始化方法

/*

hAccuracy设置水平方向的精确度

verticalAccuracy 设置垂直方向的精确度

timestamp 设置时间戳

*/

- (instancetype)initWithCoordinate:(CLLocationCoordinate2D)coordinate

altitude:(CLLocationDistance)altitude

horizontalAccuracy:(CLLocationAccuracy)hAccuracy

verticalAccuracy:(CLLocationAccuracy)vAccuracy

timestamp:(NSDate *)timestamp;

/*

course设置方向

speed 设置速度

*/

- (instancetype)initWithCoordinate:(CLLocationCoordinate2D)coordinate

   altitude:(CLLocationDistance)altitude

   horizontalAccuracy:(CLLocationAccuracy)hAccuracy

   verticalAccuracy:(CLLocationAccuracy)vAccuracy

   course:(CLLocationDirection)course

   speed:(CLLocationSpeed)speed

   timestamp:(NSDate *)timestamp;

//获取位置对象的经纬度信息

@property(readonly, nonatomic) CLLocationCoordinate2D coordinate;

//获取海波高度

@property(readonly, nonatomic) CLLocationDistance altitude;

//水平方向精度

@property(readonly, nonatomic) CLLocationAccuracy horizontalAccuracy;

//垂直方向精度

@property(readonly, nonatomic) CLLocationAccuracy verticalAccuracy;

//方向值 0-360之间

@property(readonly, nonatomic) CLLocationDirection course;

//速度  单位m/s

@property(readonly, nonatomic) CLLocationSpeed speed;

//时间戳

@property(readonly, nonatomic, copy) NSDate *timestamp;

//楼层信息

@property(readonly, nonatomic, copy, nullable) CLFloor *floor;

//获取到某个位置之间的距离

- (CLLocationDistance)getDistanceFrom:(const CLLocation *)location;

- (CLLocationDistance)distanceFromLocation:(const CLLocation *)location;

五、航向信息模型CLHeading


     当使用CLLocationManager进行航向信息的请求时,代理回调中会获取到CLHeading对象,这个对象封装了航向相关数据,解析如下:


//地磁方向0-360

@property(readonly, nonatomic) CLLocationDirection magneticHeading;

//地理方向0-360

@property(readonly, nonatomic) CLLocationDirection trueHeading;

//航向精度

@property(readonly, nonatomic) CLLocationDirection headingAccuracy;

//x轴测量的原始值

@property(readonly, nonatomic) CLHeadingComponentValue x;

//y轴测量的原始值

@property(readonly, nonatomic) CLHeadingComponentValue y;

//z轴测量的原始值

@property(readonly, nonatomic) CLHeadingComponentValue z;

//时间戳

@property(readonly, nonatomic, copy) NSDate *timestamp;

目录
相关文章
|
4天前
|
IDE Android开发 iOS开发
探索Android与iOS开发的差异:平台选择对项目成功的影响
【9月更文挑战第27天】在移动应用开发的世界中,Android和iOS是两个主要的操作系统平台。每个系统都有其独特的开发环境、工具和用户群体。本文将深入探讨这两个平台的关键差异点,并分析这些差异如何影响应用的性能、用户体验和最终的市场表现。通过对比分析,我们将揭示选择正确的开发平台对于确保项目成功的重要作用。
|
13天前
|
开发框架 数据可视化 Java
iOS开发-SwiftUI简介
iOS开发-SwiftUI简介
|
4天前
|
开发框架 前端开发 Android开发
安卓与iOS开发中的跨平台解决方案
【9月更文挑战第27天】在移动应用开发的广阔天地中,安卓和iOS两大操作系统如同双子星座般耀眼。开发者们在这两大平台上追逐着创新的梦想,却也面临着选择的难题。如何在保持高效的同时,实现跨平台的开发?本文将带你探索跨平台开发的魅力所在,揭示其背后的技术原理,并通过实际案例展示其应用场景。无论你是安卓的忠实拥趸,还是iOS的狂热粉丝,这篇文章都将为你打开一扇通往跨平台开发新世界的大门。
|
1天前
|
开发框架 移动开发 Android开发
安卓与iOS开发中的跨平台解决方案:Flutter入门
【9月更文挑战第30天】在移动应用开发的广阔舞台上,安卓和iOS两大操作系统各自占据半壁江山。开发者们常常面临着选择:是专注于单一平台深耕细作,还是寻找一种能够横跨两大系统的开发方案?Flutter,作为一种新兴的跨平台UI工具包,正以其现代、响应式的特点赢得开发者的青睐。本文将带你一探究竟,从Flutter的基础概念到实战应用,深入浅出地介绍这一技术的魅力所在。
14 7
|
5天前
|
iOS开发 开发者 UED
探索iOS应用开发中的SwiftUI框架
【9月更文挑战第26天】 在iOS开发的海洋中,SwiftUI犹如一艘现代的快艇,引领着开发者们驶向更加高效与直观的编程体验。本文将带你领略SwiftUI的魅力,从其设计理念到实际应用,我们将一步步揭开它如何简化界面构建过程的面纱。通过对比传统方式,你将看到SwiftUI如何让代码变得像诗一样优美,同时保持强大的功能性和灵活性。准备好让你的iOS开发技能加速升级,一起驾驭这股新潮流吧!
|
10天前
|
前端开发 iOS开发 开发者
探索iOS开发中的SwiftUI框架
【9月更文挑战第21天】在iOS应用开发的广阔天地中,SwiftUI框架如一股清新之风,为开发者带来了声明式语法的便捷与高效。本文将深入探讨SwiftUI的核心概念、布局方式及数据绑定机制,同时通过实例演示如何运用SwiftUI构建用户界面,旨在引领读者领略SwiftUI的魅力,并激发其对iOS开发新趋势的思考与实践。
28 6
|
10天前
|
安全 Swift iOS开发
探索iOS开发之旅:Swift语言的魅力与挑战
【9月更文挑战第21天】在这篇文章中,我们将一起潜入iOS开发的海洋,探索Swift这门现代编程语言的独特之处。从简洁的语法到强大的功能,Swift旨在让开发者能够以更高效、更安全的方式构建应用程序。通过实际代码示例,我们会深入了解Swift如何简化复杂任务,并讨论它面临的挑战和未来的发展方向。无论你是初学者还是有经验的开发者,这篇文章都将为你提供新的视角和知识。
26 4
|
19天前
|
API Android开发 iOS开发
安卓与iOS开发中的线程管理对比
【9月更文挑战第12天】在移动应用的世界中,安卓和iOS平台各自拥有庞大的用户群体。开发者们在这两个平台上构建应用时,线程管理是他们必须面对的关键挑战之一。本文将深入探讨两大平台在线程管理方面的异同,通过直观的代码示例,揭示它们各自的设计理念和实现方式,帮助读者更好地理解如何在安卓与iOS开发中高效地处理多线程任务。
|
5天前
|
iOS开发 Python
6-8|如何使用Python语言开发IOS混淆工具
6-8|如何使用Python语言开发IOS混淆工具
|
存储 iOS开发
iOS开发之EventKit框架的应用(一)
iOS开发之EventKit框架的应用
735 0
iOS开发之EventKit框架的应用(一)