写真のGPSタグ(位置情報)をCSV出力

最終的にはGPSタグをつけ忘れた写真にGoogle location historyの位置情報を付加したいのだが、今回は写真情報からGPS情報をCSV出力してみた。

目次

  1. ソース
  2. 補足説明

ソース

import os
import piexif
import csv
import datetime

class placetime(object):
    def __init__(self, exif_dict):
            self.btime = exif_dict['Exif'][piexif.ExifIFD.DateTimeOriginal]
            self.time = datetime.datetime.strptime(self.btime.decode('utf-8'), '%Y:%m:%d %H:%M:%S')
            if len(exif_dict['GPS']) > 0:
                self.longitude = \
                    exif_dict['GPS'][1], \ # N/S
                    exif_dict['GPS'][2][0][0]/exif_dict['GPS'][2][0][1], \ # hour
                    exif_dict['GPS'][2][1][0]/exif_dict['GPS'][2][1][1], \ # minute
                    exif_dict['GPS'][2][2][0]/exif_dict['GPS'][2][2][1] # second
                self.latitude = \
                    exif_dict['GPS'][3], \ # E/W
                    exif_dict['GPS'][4][0][0]/exif_dict['GPS'][4][0][1], \ # hour
                    exif_dict['GPS'][4][1][0]/exif_dict['GPS'][4][1][1], \ # minute
                    exif_dict['GPS'][4][2][0]/exif_dict['GPS'][4][2][1] # second
                self.hmslongtitude = \
                    (1 if self.longitude[0] == b'N' else -1) * \
                    (self.longitude[1] + self.longitude[2] / 60 + self.longitude[3] / 3600)
                self.hmslatitude = \
                    (1 if self.latitude[0] == b'E' else -1) * \
                    (self.latitude[1] + self.latitude[2] / 60 + self.latitude[3] / 3600)
            else:
                self.longitude = None
                self.latitude = None
                self.hmslongtitude = None
                self.hmslatitude = None

def main():
    dir = "C:\\Path\\To\\Folder"    with open('filename.csv', 'w', newline='') as f:
        csvfile = csv.writer(f, delimiter=',')
        for name in os.listdir(dir):
            if os.path.isdir(os.path.join(dir, name)):
                continue
            file, ext = os.path.splitext(name)
            if ext.upper() == '.JPG' or ext.upper() == '.JPEG':
                exif_dict = piexif.load(os.path.join(dir, name))
                p = placetime(exif_dict)
                csvfile.writerow([file, p.time, p.longitude, p.latitude, p.hmslongtitude, p.hmslatitude])
if __name__ == '__main__':
    main()

補足説明

piexifモジュールを使ってJPEGファイルのexif情報を読み込んでます。
exif情報から位置情報の取り出しは自作placetimeクラスに任せて、位置情報はcsvファイルに書き出し。
def main():...
                exif_dict = piexif.load(os.path.join(dir, name))
                p = placetime(exif_dict)
                csvfile.writerow([file, p.time, p.longitude, p.latitude, p.hmslongtitude, p.hmslatitude])

先ずは撮影日時の取得とdatetime形式に変換
class placetime(object):
    def __init__(self, exif_dict):
            self.btime = exif_dict['Exif'][piexif.ExifIFD.DateTimeOriginal]
            self.time = datetime.datetime.strptime(self.btime.decode('utf-8'), '%Y:%m:%d %H:%M:%S')
            if len(exif_dict['GPS']) > 0:

取り出したexif情報は辞書型(dict)で、'GPS'で位置情報が取り出せる。Exif情報は以下で確認できる。
http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/gps.html
時・分・秒の形式で格納されている。ソース下部は10進法に直している。因みに位置情報がなかった場合は'GPS'が空辞書になってました。
class placetime(object):
    def __init__(self, exif_dict):...
            if len(exif_dict['GPS']) > 0:
                self.longitude = \
                    exif_dict['GPS'][1], \ # N/S
                    exif_dict['GPS'][2][0][0]/exif_dict['GPS'][2][0][1], \ # hour
                    exif_dict['GPS'][2][1][0]/exif_dict['GPS'][2][1][1], \ # minute
                    exif_dict['GPS'][2][2][0]/exif_dict['GPS'][2][2][1] # second
                self.latitude = \
                    exif_dict['GPS'][3], \ # E/W
                    exif_dict['GPS'][4][0][0]/exif_dict['GPS'][4][0][1], \ # hour
                    exif_dict['GPS'][4][1][0]/exif_dict['GPS'][4][1][1], \ # minute
                    exif_dict['GPS'][4][2][0]/exif_dict['GPS'][4][2][1] # second
                self.hmslongtitude = \
                    (1 if self.longitude[0] == b'N' else -1) * \
                    (self.longitude[1] + self.longitude[2] / 60 + self.longitude[3] / 3600)
                self.hmslatitude = \
                    (1 if self.latitude[0] == b'E' else -1) * \
                    (self.latitude[1] + self.latitude[2] / 60 + self.latitude[3] / 3600)

コメント

このブログの人気の投稿

Python SQLite スレッド間でコネクションの使いまわしは出来ない

slackでgeneralの投稿を全削除する

Google location history(JSON形式)をCSVファイルにする