本記事のソースコードはGistでも公開しています.
gist9edf8ff48c8a64351994141b51d0bb9d
導入
基本的に上記サイトのままですが, 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に読み込み,以下の手順を実施する.
- [シンボロジ] タブを開き,[単一定義]を選択し, [シンボルレイヤタイプ] を [ラスタ画像マーカー]にする.
- 図★箇所をクリックして,[属性の型]-[fullpath]を選択する .
- 必要に応じてサイズを調整
※日本語のファイルパスは使用できません.
上手く調整すると以下のようになる.
参考サイト
なお,上記サイトではImportPhotosプラグインが使用されていましたが,QGIS3.28では動きませんでした.
- モザイク処理 GIMP モザイクをかけてみよう