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 について
参考以下。