2009年2月4日水曜日

Nikon p6000のGeoTagをflickrに登録するその2 はてなブックマークに追加

年末にNikon COOLPIXP6000を子供が落として壊してしまい、修理に出したところGeoTagの使用が変わったようだ。(ファームウェアのバージョンもNikonのサイトを見ても特に何も変わっていないのでflickr側の仕様変更かも)
以前作成したスクリプトがエラーで動作しなくなってしまったためそこで変わった版で修正。
しかし、落下は保険が効かなくて1万7千円も修理費がかかってしまった。1万7千といえばGPSロガーがかえる金額...

自分が把握している修正内容
■Tagが 「Latitude」から 「GPS Latitude」というようにGPS関連のタグに「GPS 」の接頭語が付いた
■緯度経度の表示が度分から度分秒になった。

ぱっと見た感じ標準っぽいフォーマットになり使いやすくなったと思います。(プログラムも正規表現で短くなりました)

  1. import flickrapi  
  2. import re  
  3.   
  4. api_key = 'XXXXXXXXXXXXXXXXXXXX'  
  5. secret_key = 'YYYYYYYYYYYYYYY'  
  6. my_id = 'ZZZZZZ@N00'  
  7.   
  8.   
  9. flickr = flickrapi.FlickrAPI(api_key,secret_key)  
  10.   
  11. #auth  
  12. (token, frob) = flickr.get_token_part_one(perms='write')  
  13. if not token: raw_input("Press ENTER after you authorized this program")  
  14. flickr.get_token_part_two((token, frob))  
  15.   
  16.   
  17. search = flickr.photos_getWithoutGeoData( sort='date-posted-desc',page=2,per_page=45)  
  18.   
  19. for photo in search.photos[0].photo:  
  20.    print photo['id'] + " " + photo['title']  
  21.    getexif = flickr.photos_getExif(photo_id = photo['id'] )  
  22.    if( getexif.photo):  
  23.      try:  
  24.        lat = lon = ""  
  25.        for exif in getexif.photo[0].exif:  
  26.            if( exif['label'] == 'GPS Latitude' ):  
  27.                lat = ( exif.raw[0].text )  
  28.            if( exif['label'] == 'GPS Longitude' ):  
  29.                lon = ( exif.raw[0].text )  
  30.            if( exif['label'] == 'GPS Altitude' ):  
  31.                alt = ( exif.raw[0].text )  
  32.            if( exif['label'] == 'GPS Time (atomic clock)' ):  
  33.                time = ( exif.raw[0].text )  
  34.            if( exif['label'] == 'Direction of Image' ):  
  35.                dire = ( exif.raw[0].text )  
  36.   
  37.   
  38.        rLat = re.compile("([\d]{2,3}) deg ([\d]{2}).+ ([\d]{2}.[\d]*).*").match(lat)  
  39.        rLon = re.compile("([\d]{2,3}) deg ([\d]{2}).+ ([\d]{2}.[\d]*).*").match(lon)  
  40.        if( rLat.group() and rLon.group()  ):  
  41.                lat =  int(rLat.group(1) ) + float(rLat.group(2))/60 + float(rLat.group(3))/3600  
  42.                lon =  int(rLon.group(1) ) + float(rLon.group(2))/60 + float(rLon.group(3))/3600  
  43.                print lat  
  44.                print lon  
  45.               
  46.                #lon =  int(db[0]) +float( mb[0] )  /float(mb[1]) / 60  
  47.                print "http://maps.google.co.jp/?ie=UTF8&ll="+str(lat)+","+str(lon)+"&spn=0.001073,0.002006&z=19"  
  48.                #flickr.photos_geo_setLocation(photo_id = photo['id'],lat=lat,lon = lon)  
  49.                #print a[0]  
  50.   
  51.      except AttributeError:  
  52.          #print "error"  
  53.          continue  



GeoTagが付いている場合は、Flickr形式に変換して、FlickrにGeo情報を付与。


※2009/03/03 修正
 APIを利用しなくてもGeoTagを自動で付与するオプションがあります。