转自:http://www.cnblogs.com/syxchina/archive/2012/10/14/2723522.html
11.1 iOS定位服务
iOS中有三个定位服务组件:
Wifi定位,通过查询一个Wifi路由器的地理位置的信息。比较省电,iPod touch和iPad也可以采用。
蜂窝基站定位,通过移动运用商基站定位。也适合有3G版本的iPod touch和iPad。
GPS卫星定位,通过3-4颗GPS定位位置定位,最为准确,但是耗电量大,不能遮挡。
Core Location
Core Location是iPhone、iPad等开发定位服务应用程序的框架。我们要在Xcode中添加“CoreLocation.framework”存在的框架。
主要使用的类是:CLLocationManager,通过CLLocationManager实现定位服务。
CoreLocation.framework
定位服务实例
项目WhereAmI:
WhereAmIViewController.h
#import <UIKit/UIKit.h> #import <CoreLocation/CoreLocation.h> @interface ViewController : UIViewController<CLLocationManagerDelegate> { CLLocationManager* locationManager; } @property (strong, nonatomic) CLLocationManager* locationManager; @property (retain, nonatomic) IBOutlet UILabel *longitudeText; @property (retain, nonatomic) IBOutlet UILabel *latituduText; @property (retain, nonatomic) IBOutlet UIActivityIndicatorView *activity; - (IBAction)findMe:(id)sender; - (IBAction)webMap:(id)sender; @end
CLLocationManagerDelegate是定位服务的委托,常用的位置变化回调方法是:
locationManager:didUpdateToLocation:fromLocation: locationManager:didFailWithError:
CLLocationManager 是定位服务管理类,通过它可以设置定位服务的参数、获取经纬度等。
m中加载方法
- (IBAction)findMe:(id)sender {
self.locationManager = [[[CLLocationManager alloc] init] autorelease];
self.locationManager.delegate = self;
self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;
self.locationManager.distanceFilter = 1000.0f;
[self.locationManager startUpdatingLocation];
[activity startAnimating];
NSLog(@"start gps");
}
CLLocationManager 是的startUpdatingLocation方法启动所有定位硬件,对应的方法是stopUpdatingLocation,通过调用该方法关闭定位服务器更新,为了省电必须在不用的时候调用该方法关闭定位服务。
此外,我们还可以在这里设定定位服务的参数,包括:distanceFilter和desiredAccuracy。
distanceFilter,这个属性用来控制定位服务更新频率。单位是“米”。 desiredAccuracy,这个属性用来控制定位精度,精度
越高耗电量越大。
定位精度
desiredAccuracy精度参数可以iOS SDK通过常量实现:
kCLLocationAccuracyNearestTenMeters,10米
kCLLocationAccuracyHundredMeters ,100米
kCLLocationAccuracyKilometer ,1000米
kCLLocationAccuracyThreeKilometers,3000米
kCLLocationAccuracyBest ,最好的精度
kCLLocationAccuracyBestForNavigation,导航情况下最好精度,iOS 4 SDK新增加。一般要有外接电源时候才能使用。
委托方法用于实现位置的更新
-(void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {
latituduText.text = [NSString stringWithFormat:@"%3.5f",newLocation.coordinate.latitude];
longitudeText.text = [NSString stringWithFormat:@"%3.5f",newLocation.coordinate.longitude];
[activity stopAnimating];
[locationManager stopUpdatingLocation];
NSLog(@"location ok");
}
该委托方法不仅可以获得当前位置(newLocation),还可以获得上次的位置(oldLocation ),CLLocation 对象coordinate.latitude属性获得经度,coordinate.longitude属性获得纬度。
[NSString stringWithFormat:@"%3.5f”, newLocation.coordinate.latitude] 中的%3.5f是输出整数部分是3位,小数部分是5位的浮点数。