2008年11月30日日曜日

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

Nikon COOLPIXP6000のGeoTagはExifに入るため、そのままflickrに写真をUploadしてもGeoTagがつかないので、Pythonを使ってFlickrに公開しているNikon COOLPIXP6000のGeoTagを一括登録するスクリプトを書いてみた。

ちなみにFlickr APIのキーの取得にと、flickrapiのインストールが必要です。

※NikonP6000を修理に出したところ のGeoTagの仕様が変わったようです。Versionによっては動作しないものがあります。
詳しくはこちらから


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



プログラムの簡単な説明

flickrにあがっているGeo情報が付いていない画像をとってきてExIfにGeoTagがあるかどうかをチェック。
GeoTagが付いている場合は、Flickr形式に変換して、FlickrにGeo情報を付与。


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