转载]IOS LBS功能详解[0](获取经纬度)[1](获取当前地理位置文本 )

原文地址:IOS LBS功能详解[0](获取经纬度)[1](获取当前地理位置文本作者:佐佐木小次郎

因为最近项目上要用有关LBS的功能。于是我便做一下预研。

一般说来LBS功能一般分为两块;一块是地理定位,就是获取当前精度、纬度和地理位置的功能,这一部分功能主要用到CoreLocation.Frameworks。一部分就是显示地图信息、丰富地图内容等,这一部分主要用到MapKit.Frameworks。以上这几个功能的测试最好都要在真机上进行。模拟器上定位一般会在Apple的加州总部。

首先介绍CoreLocation。先说主要功能吧。

第一个功能,也是最基本的功能是获取经度纬度。

折腾了一早上原来是赋值的姿势不对,挫败感真心强烈啊。

好了言归正传,在IOS上获取经度纬度相当简单。

添加CoreLocation.Frameworks,并将其头文件放在需要引用的类的头文件中。创建一个CLLocationManager对象。为当前CLLocationManager对象设置代理。设置其他基本属性如下:

// 设置寻址经度

self.locManager.desiredAccuracy = kCLLocationAccuracyBest;

self.locManager.distanceFilter = 5.0;

然后调用 - (void)startUpdatingLocation;方法,开始更新当前坐标位置。

这样前期的准备工作就完成了。

然后就是要完成代理方法了。

如果只是要实现获取当前经纬度的功能,只要实现以下两个代理就好了。

- (void)locationManager:(CLLocationManager *)manager

didUpdateToLocation:(CLLocation *)newLocation

fromLocation:(CLLocation *)oldLocation;

- (void)locationManager:(CLLocationManager *)manager

didFailWithError:(NSError *)error;

第二个代理是在寻址失败的时候调用的。筒子们在里面做相应的处理就好了。

我们主要说说第一个代理。第一个代理方法传递给我们三个参数,manager,newLocation和oldLocation。如果只是定位的话,只要关心newLocation这个就好了。

我们要的经度维度放在什么地方呢?

CLLocation有一个属性叫做@property(readonly, nonatomic) CLLocationCoordinate2D coordinate;我们要的信息就存放在这里了。

typedef struct {

CLLocationDegrees latitude;

CLLocationDegrees longitude;

} CLLocationCoordinate2D;

CLLocationDegrees其实是double类型的,大家将其文字化即可。

注意:。第一次使用定位功能时使用startUpdatingLocation这个方法就好了。系统会自动弹出请用户授权使用的弹窗。在第二次使用时,判断用户是否打开定位功能使用+ (BOOL)locationServicesEnabled方法,以确定不会产生错误。在请求结束或者要进行第二次请求之前,请调用stopUpdatingLocation,以停止上一次请求。

以下附上实现代码:

// 初始化并开始更新

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

self.locManager.delegate = self;

self.locManager.desiredAccuracy = kCLLocationAccuracyBest;

self.locManager.distanceFilter = 5.0;

[self.locManager startUpdatingLocation];

// 代理方法实现

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation{

DebugLog(@"%f,%f",newLocation.coordinate.latitude,newLocation.coordinate.longitude);

}

- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error{

DebugLog(@"%@",error);

}

获取当前所在地的地理位置信息需要使用一个新的类,MKReverseGeocoder。这个类在MapKit.framework中。我们把框架加进来,并将头文件导入就可以用了。

敲了一会代码,结果发现这个类iOS5.0就不用了。真是的。为了照顾兼容性,我们先研究MKReverseGeocoder,等下再来研究这个新类,恩,名字叫做CLGeocoder,恩,没拼错。在CoreLocation里面。

MKReverseGeocoder *geocoder = [[MKReverseGeocoder alloc] initWithCoordinate:currentCoordinate2D];

geocoder.delegate = self;

[geocoder start];

调用以上代码后呢,会自动调用反向地址编码的API。我们这边使用代理来接收。至于代理方法么,我们要实现两个。

- (void)reverseGeocoder:(MKReverseGeocoder *)geocoder didFindPlacemark:(MKPlacemark *)placemark {

}

- (void)reverseGeocoder:(MKReverseGeocoder *)geocoder didFailWithError:(NSError *)error{

}

第一个方法是获取反向编码的。第二个是当反向编码失败时,处理错误使用的。

我们主要讨论第一个方法。

placemark(MKPlacemark类的对象)其实是geocoder(MKReverseGeocoder类的对象)的一个属性。从geocoder里面取placemark这个和直接取placemark这个其实区别不大。而我们需要的信息主要就在这个里面了。

// 这个字典存放基础数据

@property (nonatomic, readonly) NSDictionary *addressDictionary;

让我们试试看,能从这个字典里面倒出来些什么东西。

以下是我用这个addressDictionary属性倒出来的字典。我们分析看看。

{

City = "U897fU5b89U5e02";// 城市名字

Country = "U4e2dU56fd";// 国家名字

CountryCode = CN;// 国家编码

FormattedAddressLines =     (

"U4e2dU56fd",

"U9655U897fU7701U897fU5b89U5e02U96c1U5854U533a",

"U9ad8U65b0U516dU8def34U53f7"

); // 这个应该是格式化后的地址了

State = "U9655U897fU7701"; // 省

Street = "U9ad8U65b0U516dU8def 34U53f7";// 街道完整名称

SubLocality = "U96c1U5854U533a";//区名

SubThoroughfare = "34U53f7";//具体地址

Thoroughfare = "U9ad8U65b0U516dU8def";//街道名称

}

注意:上面的这个字典是可以直接转化为联系人的字典的,通过这个ABCreateStringWithAddressDictionary属性。

以下是placemark的其他属性。大家可以随意取用。

// address dictionary properties

@property (nonatomic, readonly) NSString *name; // eg. Apple Inc.

@property (nonatomic, readonly) NSString *thoroughfare; // street address, eg. 1 Infinite Loop

@property (nonatomic, readonly) NSString *subThoroughfare; // eg. 1

@property (nonatomic, readonly) NSString *locality; // city, eg. Cupertino

@property (nonatomic, readonly) NSString *subLocality; // neighborhood, common name, eg. Mission District

@property (nonatomic, readonly) NSString *administrativeArea; // state, eg. CA

@property (nonatomic, readonly) NSString *subAdministrativeArea; // county, eg. Santa Clara

@property (nonatomic, readonly) NSString *postalCode; // zip code, eg. 95014

@property (nonatomic, readonly) NSString *ISOcountryCode; // eg. US

@property (nonatomic, readonly) NSString *country; // eg. United States

@property (nonatomic, readonly) NSString *inlandWater; // eg. Lake Tahoe

@property (nonatomic, readonly) NSString *ocean; // eg. Pacific Ocean

@property (nonatomic, readonly) NSArray *areasOfInterest; // eg. Golden Gate Park

注意:我在使用的过程中发现,如果网络假死,则有可能较长时间无法获得逆向的结果。这一点可能需要大家注意。

IOS5下不推荐使用我上面讲的一大堆。我们需要用这个CLGeocoder类。

使用方法也很简单。参照如下步骤:

首先创建一个CLGeocoder对象,然后调用他的- (void)reverseGeocodeLocation:(CLLocation *)location completionHandler:(CLGeocodeCompletionHandler)completionHandler;方法。按照需要的参数类型传参。有的筒子会问这个CLGeocodeCompletionHandler东西怎么写?这个其实是IOS4之后就被官方大力推荐使用的BLOCK,不会用的同学快去看文档吧。

CLGeocodeCompletionHandler的定义就是这样的。typedef void(^CLGeocodeCompletionHandler)(NSArray *placemarks, NSError *error); 我们只要写好一个block对象传进去就好了。

以下是使用CLGeocoder的参考代码。不用代理了是不是很开心呢?

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

[geocoder reverseGeocodeLocation:newLocation completionHandler:

^(NSArray* placemarks, NSError* error){

NSLog(@"%@",placemarks);

}];

表示定位部分的内容就介绍到这里,至于什么正向编码,什么前面提到的速率,距离之类的,大家参看文档就好了。勤看文档的筒子才是好筒子嘛。、

iOS开发中,若想获得当前位置,只需以下几步:

首先,将CoreLocation framework导入到工程当中并且引用

[plain] view plaincopy

  1. #import <CoreLocation/CoreLocation.h>

然后,声明实现代理方法,

[plain] view plaincopy

  1. @interface LocationManager : NSObject <CLLocationManagerDelegate>

然后,开始更新位置信息:

[plain] view plaincopy

  1. locationManager = [[CLLocationManager alloc] init];
  2. locationManager.delegate = self;
  3. locationManager.desiredAccuracy = kCLLocationAccuracyBest;
  4. locationManager.distanceFilter = kCLDistanceFilterNone;
  5. [locationManager startUpdatingLocation];

locationManager需要定义为私有或者属性变量。每次位置更新后,将调用CLLocationManagerDelegate的- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation方法,方法中的newLocation即是当前位置。

获得位置后,如果想获得当前位置的地理信息,需要用到CLGeocoder(MKReverseGeocoder已经过时)。

[plain] view plaincopy

  1. CLGeocoder *geocoder = [[CLGeocoder alloc] init];
  2. [geocoder reverseGeocodeLocation: newLocation completionHandler:^(NSArray *array, NSError *error) {
  3. if (array.count > 0) {
  4. CLPlacemark *placemark = [array objectAtIndex:0];
  5. NSString *country = placemark.ISOcountryCode;
  6. NSString *city = placemark.locality;
  7. }
  8. }];

placemark包含了newLocation的地理信息。

时间: 2024-10-24 06:12:23

转载]IOS LBS功能详解[0](获取经纬度)[1](获取当前地理位置文本 )的相关文章

jdk5.0 新增的 Concurrent包主要功能详解

我们都知道,在JDK1.5之前,Java中要进行业务并发时,通常需要有程序员独立完成代码实现,当然也有一些开源的框架提供了这些功能,但是这 些依然没有JDK自带的功能使用起来方便.而当针对高质量Java多线程并发程序设计时,为防止死蹦等现象的出现,比如使用java之前的wait(). notify()和synchronized等,每每需要考虑性能.死锁.公平性.资源管理以及如何避免线程安全性方面带来的危害等诸多因素,往往会采用 一些较为复杂的安全策略,加重了程序员的开发负担.万幸的是,在JDK1

iOS开发:详解Objective-C runTime

Objective-C总Runtime的那点事儿(一)消息机制 最近在找工作,Objective-C中的Runtime是经常被问到的一个问题,几乎是面试大公司必问的一个问题.当然还有一些其他问题也几乎必问,例如:RunLoop,Block,内存管理等.其他的问题如果有机会我会在其他文章中介绍. 本篇文章主要介绍RunTime. RunTime简称运行时.就是系统在运行的时候的一些机制,其中最主要的是消息机制.对于C语言,函数的调用在编译的时候会决定调用哪个函数( C语言的函数调用请看这里 ).编

使用【百度云推送】第三方SDK实现推送功能详解

之前介绍过如何使用shareSDK实现新浪微博分享功能,今天介绍如何使用百度云推送SDK实现Android手机后台推送功能. 运行效果如下 第一步,如果使用百度的SDK,当然要先成为百度的开发者啦,这个就不详述了.成为开发者之后,我们要建立一个应用,如下图所示 第二步,创建好应用之后,我们点击开方者服务管理,进入工程管理页面,然后点击左侧云推送,进入云推送功能页面,具体如下图 进入云推送详细页面之后,我们点击推送设置,设置好我们的应用的包名,然后点击快速实例,将系统给我们产生的示例代码下载下来

.Net的Oracle数据库ORM控件dotConnect for Oracle下载地址及功能详解

原文来自龙博方案网http://www.fanganwang.com/product/1330转载请注明出处 dotConnect for Oracle完全基于ADO.NET方法,因此您完全可以采用标准ADO.NET数据提供的方法来使用它.是一款为Microsoft .NET Framework提供直接Oracle数据库连接的数据发生器控件. 具体功能: 无需Oracle客户端,采用直接模式提供数据库连接 100%代码管理 具有高表现性能 支持Oracle 10g, 9i, 8i 和 8.0,包

转:iOS中socket详解

一.网络各个协议:TCP/IP.SOCKET.HTTP等 网络七层由下往上分别为物理层.数据链路层.网络层.传输层.会话层.表示层和应用层. 其中物理层.数据链路层和网络层通常被称作媒体层,是网络工程师所研究的对象: 传输层.会话层.表示层和应用层则被称作主机层,是用户所面向和关心的内容. http协议   对应于应用层 tcp协议    对应于传输层 ip协议     对应于网络层 三者本质上没有可比性.  何况HTTP协议是基于TCP连接的. TCP/IP是传输层协议,主要解决数据如何在网络

PHP5.2至5.6的新增功能详解

截至目前(2014.2), PHP 的最新稳定版本是 PHP5.5, 但有差不多一半的用户仍在使用已经不在维护 [注] 的 PHP5.2, 其余的一半用户在使用 PHP5.3 [注].因为 PHP 那"集百家之长"的蛋疼语法,加上社区氛围不好,很多人对新版本,新特征并无兴趣.本文将会介绍自 PHP5.2 起,直至 PHP5.6 中增加的新特征. PHP5.2 以前:autoload, PDO 和 MySQLi, 类型约束 PHP5.2:JSON 支持 PHP5.3:弃用的功能,匿名函数

ServletContext作用功能详解

ServletContext作用功能详解 ServletContext,是一个全局的储存信息的空间,服务器开始, 其就存在,服务器关闭,其才释放.request,一个用户可有多个:session,一个用户一个:而servletContext,所有用户共用一 个.所以,为了节省空间,提高效率,ServletContext中,要放必须的.重要的.所有用户需要共享的线程又是安全的一些信息. 换一种方式说吧,运行在JAVA虚拟机中的每一个Web应用程序都有一个与之相关的Servlet上下文.Servle

iOS开发者证书-详解

iOS开发者证书-详解/生成/使用 本文假设你已经有一些基本的Xcode开发经验, 并注册了iOS开发者账号. 相关基础 加密算法 现代密码学中, 主要有两种加密算法: 对称密钥加密 和 公开密钥加密. 对称密钥加密 对称密钥加密(Symmetric-key algorithm)又称为对称加密, 私钥加密, 共享密钥加密. 这类算法在加密和解密时使用相同的密钥. 例如: 最常见的应用场景 - 系统登陆. 要成功登陆系统, 你必须输入正确的密码, 这密码是唯一的, 是与创建时一样的. 同样 的,

【转】 /etc/fstab功能详解

[转] /etc/fstab功能详解 最近去客户现场时,遇到 了一个关于挂载文件/etc/fstab文件的问题,就写了一下/etc/fstab文件的作用一个文件中各个参数的含义.供大家参考有不正确的地方敬请指正. 一./etc/fstab文件的作用 磁盘被手动挂载之后都必须把挂载信息写入/etc/fstab这个文件中,否则下次开机启动时仍然需要重新挂载. 系统开机时会主动读取/etc/fstab这个文件中的内容,根据文件里面的配置挂载磁盘.这样我们只需要将磁盘的挂载信息写入这个文件中我们就不需要