プログラミングノート

一からものを作ることが好きなエンジニアの開発ブログです。

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 出来る限り正確
kCLLocationAccuracyNearestTenMeters 10m
kCLLocationAccuracyHundredMeters 100m
kCLLocationAccuracyKilometer 1km
kCLLocationAccuracyThreeKilometers 3km


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


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