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

ソース

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情報を更新。ということをしたい。

コメント

このブログの人気の投稿

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

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