GIS奮闘記

現役GISエンジニアの技術紹介ブログ。主にPythonを使用。

スポンサーリンク

Pythonで画像ファイルにジオタグ(geotag)を追加しよう!

本エントリー作成時にはサンプルコードが正しく動作したのですが、現状、正しく動作が判明しないことがわかりました。以下エントリーの方法で同じことが実現できますので、こちらを参照してください。

www.gis-py.com




さて、本日は「Pythonで画像ファイルにジオタグ(geotag)を追加しよう!」です。GPSを搭載したスマートフォンなどは、撮影時にその場所の緯度経度情報を写真データに埋め込むことが可能で、この位置情報を「ジオタグ」と呼びます。このジオタグですが、注意が必要です。自宅で撮った写真をブログやSNSで公開する場合、ジオタグ付きの写真をそのままネットで公開してしまうと、撮影場所の緯度経度、つまりあなたの住所が丸わかりになってしまいます。悪用されたら怖いですね・・・

インストール

pyexiv2、PILが必要なので、インストールをお願いします。

サンプルデータ

神戸市のオープンデータを使用してみました。
f:id:sanvarie:20160120112028p:plain

サンプルコード

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)

結果を見ると、指定した緯度経度が設定されていますね。
f:id:sanvarie:20160120112441p:plain

ためしにArcMap上でジオタグ付き写真→ポイントに変換してみました。それっぽい場所に配置されましたね。
f:id:sanvarie:20160120113036p:plain

ポイントをクリックすると写真のポップアップを起動することもできます。これはサイズ調整が必要ですが・・・
f:id:sanvarie:20160120113139p:plain

これをうまく活用すれば震災マップなども作成することができますね。

以上、簡単ではありますが、「Pythonで画像ファイルにジオタグ(geotag)を追加しよう!」でした。