3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Pythonを使ってiphoneで撮影した写真から位置情報を抽出する

Last updated at Posted at 2024-04-25

概要

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)

スクリーンショット 2024-04-25 21.51.32.png
google mapで見たところ、正しく抽出できてそうです!

おわりに

思いの外簡単に写真のメタデータを抽出できました。
最近SNSに位置情報のデータを含む写真をうっかりあげてしまって悪用された等の物騒な話も聞きますが、自分で撮影した写真の位置情報や撮影時間を使って旅の軌跡を振り返る等の楽しみ方もできそうですね。

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?