写真のGPSタグ(位置情報)をCSV出力
最終的にはGPSタグをつけ忘れた写真にGoogle location historyの位置情報を付加したいのだが、今回は写真情報からGPS情報をCSV出力してみた。
目次
ソース
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'が空辞書になってました。
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)
コメント
コメントを投稿