Hatena::Diary

プログラミングノート RSSフィード

2009-02-28

[]GPSを利用する方法

GPS測位はどんな感じでできるのか試してみたのですが、下記の手順だけでよかったので簡単に測位できました。


1. CoreLocation.frameworkを追加します。

2. CLLocationManagerを生成して測位開始します。


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]);	
}
...

測位精度には下記の種類があります。上位ほど電池を食うようです。

kCLLocationAccuracyBest出来る限り正確
kCLLocationAccuracyNearestTenMeters10m
kCLLocationAccuracyHundredMeters100m
kCLLocationAccuracyKilometer1km
kCLLocationAccuracyThreeKilometers3km

測位間隔の指定は、APIを見る限りdistanceFilterでのみ制御できるような感じです。デフォルトでは位置が取得できる度に(前回測位地点と異なる場合?)イベントが発生するようですが、ここで距離を指定しておくとその距離を超えた場合にのみイベントが発生するようです。


Doja(iアプリ)のGPS関連APIは結構難しかったんですが、iPhoneでのGPS取得はかなり簡素化されているし、誰でも利用できるのでありがたいですね。あとはシミュレータでテスト用の緯度経度を設定できないのがちょっとイタイところなので、専用のクラスとか作っとくとよいかもしれません。

griffin-stewiegriffin-stewie 2009/03/01 18:39 シミュレータの時は下記のリンクでで紹介されてるような実機とシミュレータを判別するマクロでシミュレータの時は任意の緯度経度を返すようにするのが一番手軽かも知れません。

シミュレータと実機を区別するためのマクロ - iPhoneアプリケーション開発
http://d.hatena.ne.jp/iphone_dev/20080925/1222336515

ntakuntaku 2009/03/01 19:36 griffin-stewieさんありがとうございます。
ご紹介いただいたマクロで試してみようと思います。ただ連続測位のイベントが発生しないと思うので、ここら辺は少し工夫が必要そうですね。

ゲスト