本エントリー作成時にはサンプルコードが正しく動作したのですが、現状、正しく動作が判明しないことがわかりました。以下エントリーの方法で同じことが実現できますので、こちらを参照してください。
さて、本日は「Pythonで画像ファイルにジオタグ(geotag)を追加しよう!」です。GPSを搭載したスマートフォンなどは、撮影時にその場所の緯度経度情報を写真データに埋め込むことが可能で、この位置情報を「ジオタグ」と呼びます。このジオタグですが、注意が必要です。自宅で撮った写真をブログやSNSで公開する場合、ジオタグ付きの写真をそのままネットで公開してしまうと、撮影場所の緯度経度、つまりあなたの住所が丸わかりになってしまいます。悪用されたら怖いですね・・・
インストール
pyexiv2、PILが必要なので、インストールをお願いします。
サンプルデータ
神戸市のオープンデータを使用してみました。
サンプルコード
1ファイルだけを対象としたサンプルコードです。
# -*- coding: utf-8 -*- import pyexiv2 from PIL import Image def to_deg(value, loc): if value < 0: loc_value = loc[0] elif value > 0: loc_value = loc[1] else: loc_value = "" abs_value = abs(value) deg = int(abs_value) t1 = (abs_value-deg)*60 min = int(t1) sec = round((t1 - min)* 60, 5) return (deg, min, sec, loc_value) def set_gps_location(file_name, lat, lng): lat_deg = to_deg(lat, ["S", "N"]) lng_deg = to_deg(lng, ["W", "E"]) # 緯度、経度を10進法→60進法(度分秒)に変換 exiv_lat = (pyexiv2.Rational(lat_deg[0]*60+lat_deg[1],60),pyexiv2.Rational(lat_deg[2]*100,6000), pyexiv2.Rational(0, 1)) exiv_lng = (pyexiv2.Rational(lng_deg[0]*60+lng_deg[1],60),pyexiv2.Rational(lng_deg[2]*100,6000), pyexiv2.Rational(0, 1)) metadata = pyexiv2.ImageMetadata(file_name) metadata.read() #メタデータを付与 metadata["Exif.GPSInfo.GPSLatitude"] = exiv_lat metadata["Exif.GPSInfo.GPSLatitudeRef"] = lat_deg[3] metadata["Exif.GPSInfo.GPSLongitude"] = exiv_lng metadata["Exif.GPSInfo.GPSLongitudeRef"] = lng_deg[3] metadata["Exif.Image.GPSTag"] = 654 metadata["Exif.GPSInfo.GPSMapDatum"] = "WGS-84" metadata["Exif.GPSInfo.GPSVersionID"] = '2 0 0 0' #メタデータを上書き metadata.write() #ファイル名、緯度、経度を指定 set_gps_location(r"D:\python\geotag\a020.jpg", 34.6874422,135.1758424)
結果を見ると、指定した緯度経度が設定されていますね。
ためしにArcMap上でジオタグ付き写真→ポイントに変換してみました。それっぽい場所に配置されましたね。
ポイントをクリックすると写真のポップアップを起動することもできます。これはサイズ調整が必要ですが・・・
これをうまく活用すれば震災マップなども作成することができますね。
以上、簡単ではありますが、「Pythonで画像ファイルにジオタグ(geotag)を追加しよう!」でした。