[Objective-C][Evernote SDK] kCGImageProperty 形式の位置情報をEDAMNote にセットする

投稿者: | 2014/01/06

Evernote のノート位置情報はkCGImageProperty と異なる

Evernote のノートは位置情報を持っています。

それはEDAMNote というクラスのattributes というプロパティ内に格納されているのですが、画像に使われているkCGImagePrperty の位置情報と微妙に形式が異なります。

内容的にはCLLocation と同じ。
東経および北緯をプラス値、西経および南緯をマイナス値で格納しているのです。 *01ちなみにkCGImageProperty は値はプラス値のみで、東経西経および北緯南緯を識別するプロパティを別途持っています。

 

kCGImageProperty の方がキーが共有できて便利

私は位置情報を扱うにはkCGImageProperty の方が便利だと考えています。

理由は位置情報を扱う際のキーが共有できるからです。


 

Evernote に位置情報をセットする際はCLLocation 形式に直してやる

そんなわけで、Evernote のノートに位置情報をセットするときは、kCGImageProperty 形式からCLLocation の形式に直してから格納してやります。

以下コード。

- (void)createNoteAtGPS {
	// kCGImageProperty 形式の位置情報(事前に用意済み)
	NSDirectory* gpsDict = gpsDict_; 
	
	// 位置情報を格納するプロパティ
    EDAMNoteAttributes* attr = [EDAMNoteAttributes new];	
    
    // 経度
    double latitude = [[gpsDict objectForKey:(NSString *)kCGImagePropertyGPSLatitude] doubleValue];
    if ( [[gpsDict objectForKey:(NSString *)kCGImagePropertyGPSLatitudeRef] isEqualToString:@"W"] ) {
    	// 西経
        latitude = -latitude;
    }
    [attr setLatitude:latitude];
    
    // 緯度
    double longitude = [[gpsDict objectForKey:(NSString *)kCGImagePropertyGPSLongitude] doubleValue];
    if ( [[gpsDict objectForKey:(NSString *)kCGImagePropertyGPSLongitudeRef] isEqualToString:@"S"] ) {
    	// 南緯
        longitude = -longitude;
    }
    [attr setLongitude:longitude];
    
    // 標高
    double altitude = [[gpsDict objectForKey:(NSString*)kCGImagePropertyGPSAltitude] doubleValue];
    if ( [[gpsDict objectForKey:(NSString*)kCGImagePropertyGPSAltitudeRef] isEqualToString:@"1"] ) {
    	// 海抜0m より下
        altitude = -altitude;
    }
    
    [attr setAltitude:altitude];	
    
    // EDAMNote を生成
    NSMutableString* ENML = @"<?xml version="1.0" encoding="UTF-8"?>";
    [ENML appendFormat:%@", @"<!DOCTYPE en-note SYSTEM "http://xml.evernote.com/pub/enml2.dtd">"];
    [ENML appendFormat:%@", @"<en-note>テスト</en-note>"];
    
    EDAMNote* newNote = [[EDAMNote alloc] initWithGuid:nil
                                                 title:@"hoge"
                                               content:(NSString*)ENML
                                           contentHash:nil
                                         contentLength:(int)ENML.length
                                               created:0
                                               updated:0
                                               deleted:0
                                                active:YES
                                     updateSequenceNum:0
                                          notebookGuid:nil
                                              tagGuids:nil
                                             resources:nil
                                            attributes:attr
                                              tagNames:nil];

    // EDAMNote をアップロード
    [[EvernoteNoteStore noteStore] createNote:newNote success:^(EDAMNote *note) {
        NSLog(@"Note created : %@",note);
    } failure:^(NSError *error) {
        NSLog(@"Error : %@",error);
    }];
}

 

最初からCLLocation 使えば?

「最初からCLLocation 使えよ!」というツッコミが聞こえてきそうですが、画像から位置情報を取得してノートの位置情報に転記したい場合などもあるので、こーゆーのも「あり」かなと。

と言いますか、しつこいですが「キー値を共有できる」って楽じゃないですか?
だめ?

 



 

脚注

脚注
01 ちなみにkCGImageProperty は値はプラス値のみで、東経西経および北緯南緯を識別するプロパティを別途持っています。

コメントを残す

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

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