趣味で計算流砂水理

趣味で計算流砂水理 Computational Sediment Hydraulics for Fun Learning

数値計算とか河川工学とかプログラミングのことを書いています

MENU

修正版:Pythonで写真からExif情報を抽出する

スポンサーリンク

本記事のソースコードはGistでも公開しています.

gist9edf8ff48c8a64351994141b51d0bb9d



導入

news.mynavi.jp

基本的に上記サイトのままですが, Pillow==7.2.0以降では仕様変更に伴い,元のままだと動かないので一部修正しました.

  • 仕様変更:公式

7.2.0 - Pillow (PIL Fork) 10.3.0 documentation

  • 仕様変更:参考サイト

PillowでExif情報を遊ぶ ~辞書の復習を兼ねて~ #Python - Qiita

修正したプログラム

修正したプログラムは以下のとおりです.

"GPSLatitude"タグ,"GPSLongitude"タグの表記が変わったので,それに対応するように修正しました.

from PIL import Image
import PIL.ExifTags as ExifTags

def get_gps(fname):
    im = Image.open(fname)
    # EXIF情報を辞書型で得る
    exif = {
        ExifTags.TAGS[k]: v
        for k, v in im._getexif().items()
        if k in ExifTags.TAGS
    }
    # GPS情報を得る --- (*2)
    gps_tags = exif["GPSInfo"]
    gps = {
        ExifTags.GPSTAGS.get(t, t): gps_tags[t]
        for t in gps_tags
    }
    
    # 変更箇所
    conv_deg = lambda v : v[0] + (v[1] / 60.0) + (v[2] / 3600.0)
    
    lat = conv_deg(gps["GPSLatitude"])
    lat_ref = gps["GPSLatitudeRef"]
    if lat_ref != "N": lat = 0 - lat
    lon = conv_deg(gps["GPSLongitude"])
    lon_ref = gps["GPSLongitudeRef"]
    if lon_ref != "E": lon = 0 - lon
        
    return lat, lon
fname = 'XX.JPG'
get_gps(fname)

# (36.62291111111111, 138.24255277777777)

応用編:フォルダ内の全JPGファイルのEXIF情報を取得し,geojson形式で出力

作成した関数を用いて,フォルダ内の全JPGファイルのEXIF情報を取得して,位置情報をgeojson形式で出力するプログラムを作成しました.

import os
import glob
import pandas as pd
import geopandas as gpd
import numpy as np


#  ファイルリストを取得
path = r'C:\\Users'
fnames = glob.glob(path + '\\*.JPG')

# 位置情報を取得し,GeoDataFrameに格納
coords = [get_gps(f) for f in fnames]
c = np.array(coords)

df = pd.DataFrame({
'lat':c[:,0] ,'lon':c[:,1]
,'filename':[os.path.basename(f) for f in fnames]
,'fullpath': fnames
})

geometry = gpd.points_from_xy(df.lon, df.lat, crs="EPSG:4326")
gdf = gpd.GeoDataFrame(df, geometry=geometry)

# geojson形式で出力
out = gdf.to_file('photo.geojson', driver='GeoJSON')
del out

おまけ:QGISに写真付きで表示する

上記で作成したphoto.geojsonをQGISに読み込み,以下の手順を実施する.

  1. [シンボロジ] タブを開き,[単一定義]を選択し, [シンボルレイヤタイプ] を [ラスタ画像マーカー]にする.
  2. 図★箇所をクリックして,[属性の型]-[fullpath]を選択する .
  3. 必要に応じてサイズを調整

※日本語のファイルパスは使用できません.

上手く調整すると以下のようになる.

参考サイト

なお,上記サイトではImportPhotosプラグインが使用されていましたが,QGIS3.28では動きませんでした.

Gist

gist9edf8ff48c8a64351994141b51d0bb9d