[Objective-C] GPS情報を扱うときのkey はImageIO のヤツを流用する

投稿者: | 2014/01/05

GPS情報はNSDictionary に格納する

GPS情報には、緯度経度の他にも標高やタイムスタンプなど複数の項目が存在します。

それらをひとまとめにして格納しておくには、NSDictionary を使うのが便利です。

NSDictionary はkey と呼ばれる見出しを使って目的の項目を自由に出し入れできるので便利なのです。

 

画像にはkCGImagePropertyGPS というkeys がある

ちなみに画像にはkCGImagePropertyGPS というkey郡が予め用意されています。

ヘッダーファイルで #import <ImageIO ⁄ ImageIO.h>してやることで、そのキーを利用できます。

 

別に画像を扱わなくてもkCGImagePropertyGPS を使いたい

GPS情報は画像だけでなくCLLocationManager.location などからも取得できるわけですが、それらを同時に扱うなら、見出しであるkey は揃っている方が何かと便利です。

そんなわけで、私は別に画像を扱わなくてもGPS情報を扱うときはImageIO をインポートしてkey を流用しています。

CLLocation から主要な項目(経度、緯度、標高、タイムスタンプ)を引っこ抜いて、kCGImagePropertyGPS をキーにして自前のNSDictionary に放り込むわけです。

 

例:CLLocation で得た東経情報をkCGImagePropertyGPS 用に変換

CLLocation とkCGImagePropertyGPS はデータの格納形態が微妙に異なります。

例えば、CLLocation の場合東経と西経はグリニッジ子午線を0度として、それぞれプラス値(東経)とマイナス値(西経)で表されます。
しかしkCGImagePropertyGPS では、kCGImagePropertyGPSLongitudeRef に「E(東経)」ないしは「W(西経)」の識別を持ち、値はkCGImagePropertyGPSLongitude に東経西経関係なく絶対値を持ちます。


ですから、CLLocation から位置情報を得た場合は、NSDictionary への格納時に少々加工が必要です。

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations {
	NSDictionary* gps = [NSDictionary new];

	CLLocation* location = locations.lastObject;
	
	// 経度情報を取得
    CGFloat longitude = location.coordinate.longitude;
	// 東経西経
    NSString *gpsLongitudeRef;
    if (longitude < 0) {	// 西経
        longitude = -longitude;	// マイナス値はプラス値に反転
        gpsLongitudeRef = @"W";
    } else {				// 東経
        gpsLongitudeRef = @"E";
    }
	// それぞれ(東経西経、経度絶対値)をkCGImagePropertyGPS をkey に格納
    (NSMutableDictionary*)gps[(NSString *)kCGImagePropertyGPSLongitudeRef] = gpsLongitudeRef;
    (NSMutableDictionary*)gps[(NSString *)kCGImagePropertyGPSLongitude] = @(longitude);
}

 

kCGImagePropertyGPS について

参考以下。

https://developer.apple.com/library/ios/documentation/GraphicsImaging/Reference/CGImageProperties_Reference/Reference/reference.html#//apple_ref/doc/constant_group/GPS_Dictionary_Keys

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください