Google location history(JSON形式)をCSVファイルにする
前回の挫折から、今度はJSON形式で出力したGoogle locaiton historyを、まずはCSVに吐き出すことをしてみた。時間、緯度、経度、高度以外の情報はバッサリ切り捨て。
参考サイト(コード)はこれ
https://github.com/Scarygami/location-history-json-converter/blob/master/location_history_json_converter.py
参考サイト(コード)はこれ
https://github.com/Scarygami/location-history-json-converter/blob/master/location_history_json_converter.py
ソース
import json import datetime import csv class placetime(object): def __init__(self, je): self.time = je['timestampMs'] self.longitude = je['longitudeE7']/1e7 self.latitude = je['latitudeE7']/1e7 self.altitude = je['altitude'] if 'altitude' in je else None def __lt__(self, other): return self.time < other.time def __str__(self): return "{t} {lg} {lt} {al}".format(t=self.ftime, lg=self.longitude, lt=self.latitude, al=self.altitude) @property def ftime(self): return datetime.datetime.fromtimestamp(int(self.time)/1e3).strftime("%Y-%m-%d %H:%M:%S") @property def flongitude(self): ilongtitude = math.floor(self.longitude) degree = (self.longitude - ilongtitude) * 60 idegree = round(degree, 0) minutes = round((degree - idegree) * 60, 5) return """{x}°{y}'{z}"{ew}""".format(x=ilongtitude, y=idegree, z=minutes, ew='E' if self.longitude > 0 else 'W') @property def flatitude(self): ilatitude = math.floor(self.latitude) degree = (self.latitude - ilatitude) * 60 idegree = round(degree, 0) minutes = round((degree - idegree) * 60, 5) return """{x}°{y}'{z}"{ns}""".format(x=ilatitude, y=idegree, z=minutes, ns='N' if self.latitude > 0 else 'S') def main(): with open('LocationHistory.json', 'r') as f: data = f.read() jsondata = json.loads(data) plist = [placetime(e) for e in jsondata['locations']] plist.sort() with open('LocationHistory.csv', 'w', newline='') as f: csvfile = csv.writer(f, delimiter=',') for p in plist: url = 'https://www.google.co.jp/maps/place/{lt}+{lg}'.format(lg=p.flongitude, lt=p.flatitude) csvfile.writerow([p.ftime, p.longitude, p.latitude, p.altitude, url]) if __name__ == '__main__': main()
補足説明
JSONの読み込み部分。jsonモジュールで読み込み、loations以下のデータを取得し、placetimeクラスのコンストラクタで時間・緯度・経度・高度の取得を実行。
緯度・経度は少数点なしの整数で格納されているので、桁を直している。
def main(): with open('LocationHistory.json', 'r') as f: data = f.read() jsondata = json.loads(data) plist = [placetime(e) for e in jsondata['locations']]
class placetime(object): def __init__(self, je): self.time = je['timestampMs'] self.longitude = je['longitudeE7']/1e7 self.latitude = je['latitudeE7']/1e7 self.altitude = je['altitude'] if 'altitude' in je else None
見た感じ時系列にデータが格納されているように見えたけど、念のため時間でソートする処理を入れている。placetimeクラスにlt(less than)メソッドにて時間で大小比較されるように組み込んでおくことで、sort()にて時間でのソートが実行される仕組み。
def main(): ... plist.sort()
class placetime(object): def __lt__(self, other): return self.time < other.time
緯度と経度が数字で表示されてもよくわかんないのでGoogle Mapsへのリンクも自動生成してる。
以下のメソッドにて10進法の緯度・経度を時分に計算し直してGoogle Map用の検索文字列に変換処理を定義。csv書き込み時にurlを生成して書き出し。
@property def flongitude(self):
@property def flatitude(self):
def main(): ... for p in plist: url = 'https://www.google.co.jp/maps/place/{lt}+{lg}'.format(lg=p.flongitude, lt=p.flatitude) csvfile.writerow([p.ftime, p.longitude, p.latitude, p.altitude, url])
今後したいこと
時間・緯度・経度(・高度)情報の一覧化ができるようになったので、あとは、写真の撮影日付から、近しい(もしくは補間した)時間の緯度・経度を検索、EXIF情報を更新。ということをしたい。
コメント
コメントを投稿