博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

iPhone开发进阶(10)--- 在程序中使用GPS

Posted on 2011-03-07 00:33  BradyChen  阅读(770)  评论(0编辑  收藏  举报
  • 原文链接 : http://www.yifeiyang.net/iphone-developer-advanced-10-use-gps/
  • 转载请保留上面文字。


  • iPhone开发进阶(10)--- 在程序中使用GPS

    这一回简单地介绍一下GPS的使用方法。使用GPS大致分下面两步。

    1. 添加 CoreLocation.framework。
    2. 生成 CLLocationManager 测量位置。

    测试代码如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    // LocationViewCtrl.h
    #import <UIKit/UIKit.h>
    #import <CoreLocation/CoreLocation.h>
    @interface LocationViewCtrl : UIViewController <CLLocationManagerDelegate>{
      CLLocationManager *man;
    }
    @property(nonatomic, retain) CLLocationManager *man;
    @end
    
    LocationViewCtrl.m
    #import "LocationViewCtrl.h"
    #import <CoreLocation/CoreLocation.h>
    
    @implementation LocationViewCtrl
    @synthesize man;
    
    - (void)viewDidLoad {
      [super viewDidLoad];
      man = [[CLLocationManager alloc] init];
    
      // 如果可以利用本地服务时
      if([man locationServicesEnabled]){
        // 接收事件的实例
        man.delegate = self;
        // 发生事件的的最小距离间隔(缺省是不指定)
        man.distanceFilter = kCLDistanceFilterNone;
        // 精度 (缺省是Best)
        man.desiredAccuracy = kCLLocationAccuracyBest;
        // 开始测量
        [man startUpdatingLocation];
      }
    }
    
    // 如果GPS测量成果以下的函数被调用
    - (void)locationManager:(CLLocationManager *)manager
      didUpdateToLocation:(CLLocation *)newLocation
          fromLocation:(CLLocation *)oldLocation{
    
      // 取得经纬度
      CLLocationCoordinate2D coordinate = newLocation.coordinate;
      CLLocationDegrees latitude = coordinate.latitude;
      CLLocationDegrees longitude = coordinate.longitude;
      // 取得精度
      CLLocationAccuracy horizontal = newLocation.horizontalAccuracy;
      CLLocationAccuracy vertical = newLocation.verticalAccuracy;
      // 取得高度
      CLLocationDistance altitude = newLocation.altitude;
      // 取得时刻
      NSDate *timestamp = [newLocation timestamp];
    
      // 以下面的格式输出 format: <latitude>, <longitude>> +/- <accuracy>m @ <date-time>
      NSLog([newLocation description]);
    
      // 与上次测量地点的间隔距离
      if(oldLocation != nil){
        CLLocationDistance d = [newLocation getDistanceFrom:oldLocation];
        NSLog([NSString stringWithFormat:@"%f", d]);
      }
    }
    
    // 如果GPS测量失败了,下面的函数被调用
    - (void)locationManager:(CLLocationManager *)manager
         didFailWithError:(NSError *)error{
      NSLog([error localizedDescription]);
    }
    ...

    测量精度有以下几类,精度越高越消耗电力。

    kCLLocationAccuracyNearestTenMeters 10m
    kCLLocationAccuracyHundredMeters 100m
    kCLLocationAccuracyKilometer 1km
    kCLLocationAccuracyThreeKilometers 3km

    因为在模拟器上不能设置经纬度,所以只能在实际设备中测试你的GPS程序。