Exifに緯度経度記録されるよなぁ(2)

皮算用。

自分の興味範囲とは少々ズレるけれども、やってみればやってみた。Exif 扱うのなんか何年ぶりだ、たぶん仕事で扱ってたのは15、16年前かしら。

撮影済みのには入ってなかったが、カメラの設定で「位置情報を記録する」があり、これを ON にしたら記録された。

Python だと PIL で出来るんだろうなぁと想像してたらやっぱり出来たんだが、目的の GPSInfo は入れ子になってて思ったよりは複雑。まぁでも一瞬ね:

StackOverflow だとか色んなとこに大量に元ネタあり
 1 # -*- coding: utf-8 -*-
 2 try:
 3     # 3.x
 4     import PIL.Image as Image
 5     import PIL.ExifTags as ExifTags
 6 except ImportError:
 7     # 2.x
 8     import Image as Image
 9     import ExifTags as ExifTags
10 
11 
12 def get_exif_data(image):
13     """Returns a dictionary from the exif data of an PIL Image item. Also converts the GPS Tags"""
14     exif_data = {}
15     info = image._getexif()
16     if info:
17         for tag, value in info.items():
18             decoded = ExifTags.TAGS.get(tag, tag)
19             if decoded == "GPSInfo":
20                 gps_data = {}
21                 for t in value:
22                     sub_decoded = ExifTags.GPSTAGS.get(t, t)
23                     gps_data[sub_decoded] = value[t]
24 
25                 exif_data[decoded] = gps_data
26             else:
27                 exif_data[decoded] = value
28 
29     return exif_data
30 
31 img = Image.open('DSC_0001.JPG')
32 d = get_exif_data(img)['GPSInfo']
33 print("\n".join(["{}: {}".format(k, repr(d[k])) for k in sorted(d.keys())]))

GPSTags を入れ子で辿らずに辞書にするだけでいいならこんなんでラクチンなんだけどね:

StackOverflow より
1 exif = {
2     ExifTags.TAGS[k]: v
3     for k, v in img._getexif().items()
4     if k in ExifTags.TAGS
5 }

あとはリファレンス読みゃぁわかる、と。小さく詰め込むバイナリ仕様、なのでちょっくら面倒なのは仕方あるめぇ、とは思うが、なぜだかどこいっても「この緯度経度のフォーマット、どうしてくれんじゃぁ」と大騒ぎしておって笑える。RATIONAL、つまり分数の形で「度=(135,1), 分=(24,1), 秒=(33,1)」てな形、なのでこれを degrees に直すのは簡単デショ。簡単なんだけど…どういうわけかこのことについての情報と言うかプチ論争があったりする。んなもん一撃で書けや、とも思うし、んなもんどんなに愚直だろうがスマートだろうが誰も気にせんよ、とも思う。

さて。これあたりからの派生で考えた場合、なんつーか「写真を撮った位置」の情報、実はあんましなくても良かったりするんだよね。だって時刻がお互いわかってるからさ、時刻で紐付けちゃった方が早い。であれば位置情報記録のない動画でもシームレスに扱えるであろうしの。

ちぅわけで、やっぱし個人情報を曝しまくるのもやなんで、「位置情報を記録する」を ON にしとくのはやめようっと。

なんぢゃそりゃ。


2018年の追記(2月4日):
どういうわけか最近このネタに人が集まってるみたいで、自分でも読み返したら、「当時は知らなかった間違い」に気付いた。

StackOverflow だとか色んなとこに大量に元ネタあり
1 # -*- coding: utf-8 -*-
2 try:
3     # 3.x
4     import PIL.Image as Image
5     import PIL.ExifTags as ExifTags
6 except ImportError:
7     # 2.x
8     import Image as Image
9     import ExifTags as ExifTags

ここなんだけど、「コメントが」間違ってる。これは Python 2.x と 3.x の差ではなくて、「PIL の successor」であるところの Pillow と オリジナル PIL の差。3.x で Pillow 入れて忘れてたんだろうね。