概要
iphoneで写真を撮影するにあたり位置情報を埋め込む設定を有効にしていると、撮影した写真に埋め込まれているEXIFと呼ばれるメタデータに位置情報が記憶されるようです。
そこで今回はiphoneで撮影した写真(HEIC形式)からpythonを用いて位置情報を抽出してみます。
使用環境
- OS:macOS Ventura 13.2.1
- Pythonバージョン:3.12.3
使用するライブラリ
exifread
TIFF, JPEG, PNG, Webp, HEIC形式の画像ファイルからExifメタデータを抽出するPythonモジュールです。
pipでインストールできます。
$ pip install exifread
なお、exifreadのバージョン3.0.0を使用したところ、HEIC形式の画像ファイルからEXIFデータを読み込もうとする際に以下のエラーが発生したため、今回は無事動作が確認できたバージョン2.3.2を使用しました。
Traceback (most recent call last):
File "/Users/{ユーザー名}/python_project/gps_from_heic/.venv/lib/python3.12/site-packages/exifread/heic.py", line 171, in get_parser
return defs[box.name]
~~~~^^^^^^^^^^
KeyError: 'hdlr'
写真のEXIFから緯度経度を抽出してみる
先日、華厳滝で撮影した写真を使用します。
import exifread
def read_exif_from_image(image_path):
"""画像ファイルからEXIFデータを読み込む"""
try:
with open(image_path, "rb") as f:
exif_data = exifread.process_file(f)
return exif_data
except FileNotFoundError:
print(f"ファイルが見つかりません: {image_path}")
return None
except IOError:
print(f"ファイルの読み込みに失敗しました: {image_path}")
return None
def dms_to_decimal(dms):
"""度分秒(DMS)リストから10進数の座標に変換する関数"""
degrees, minutes, seconds = dms
return degrees + (minutes / 60) + (seconds / 3600)
def get_coordinates(exif_data):
"""EXIFタグから緯度と経度を抽出してタプルで返す"""
try:
pre_latitude = eval(exif_data["GPS GPSLatitude"].printable)
pre_longitude = eval(exif_data["GPS GPSLongitude"].printable)
latitude = dms_to_decimal(pre_latitude)
longitude = dms_to_decimal(pre_longitude)
return (latitude, longitude)
except KeyError:
print("必要なGPS情報が含まれていません。")
return None
def main():
image_path = "sample.HEIC"
exif_data = read_exif_from_image(image_path)
if exif_data:
coordinates = get_coordinates(exif_data)
if coordinates:
print("緯度経度:", coordinates)
else:
print("GPS情報の取得に失敗しました。")
else:
print("EXIFデータの読み込みに失敗しました。")
if __name__ == "__main__":
main()
出力
緯度経度: (36.737991666666666, 139.50366111111111)
google mapで見たところ、正しく抽出できてそうです!
おわりに
思いの外簡単に写真のメタデータを抽出できました。
最近SNSに位置情報のデータを含む写真をうっかりあげてしまって悪用された等の物騒な話も聞きますが、自分で撮影した写真の位置情報や撮影時間を使って旅の軌跡を振り返る等の楽しみ方もできそうですね。