あむたブログ

旅とか趣味とかいろいろ

Google Mapのロケーション履歴から訪れた全市区町村を取得する


こんにちは!

あむたと申します。

 

最近旅行欲が突き抜けています。

ある日ふと思いました。

「私はどれぐらいの市区町村を訪れてきたのだろう」

都道府県単位くらいであれば何となく覚えているものだが市区町村単位では流石に出てこない。

できれば私は、いったことがない市区町村に行っていきたい

それを一覧でみたい...

 

こんな時、まず思い浮かぶのはGoogle Mapのタイムライン機能である。

f:id:shaream:20221214224303j:image

タイムライン機能はおよそ7年前からサービスが始まっており、私は7年間利用しているので7年間の間に訪れた都市が表示されている(途中なぜか途切れたりしているが)

 

230の市町村に訪れているらしい。

 

しかし、この機能では地図上で行った都市を見ることができても一覧を見ることは出来ません。

 

そこで今回利用するのは、Google takeout

こちらの機能はGoogleに蓄積されている我々の情報をエクスポートする機能...

 

https://takeout.google.com/settings/takeout

こちらのページからロケーション履歴を選択します。

デフォルトで全てにチェックが入っているので、目的のもの以外エクスポートしないよう注意して下さい。

エクスポートの準備ができたら、メールでダウンロードリンクが送られてきます。

 

中身はこんな感じ

それぞれの中に月ごとのjsonファイルが入っています。

 

あとはこれをえっちらおっちらと加工すれば目当てのデータを得られるという訳です。

こういう雑な感じでやるときはPythonですね。

ソースコードはこちら

import json
import re
import requests
import glob


# エクスポートしたファイルを全てリストにいれる
file_list = glob.glob('./Semantic Location History/*/*.json')
# 市区町村を格納するset
s = set()
for file in file_list:
  # jsonファイルを取り込む
  json_open = open(file, 'r', encoding="utf-8")
  json_load = json.load(json_open)

  for data in json_load["timelineObjects"]:
    try:
      # データから住所がある箇所をたどる
      address = data["placeVisit"]["location"]["address"]
      # 住所から郵便番号を探す
      post_code = re.search(r'[0-9]{3}-?[0-9]{4}', address)
      if post_code != None:
        # APIで郵便番号から住所を取得する
        apiAddress = api + post_code.group()
        address_data = requests.get(apiAddress).json()
        if address_data["results"] != None:
      # 都道府県 + 市区町村
          s.add(r["results"][0]["address1"] + r["results"][0]["address2"])
    except KeyError:
      print('No such key')
print(s)

 

多分もっとスマートなやり方はあると思うのですが

そもそも住所のデータ表記がバラバラなせいで一番信じられるのが郵便番号でした。

 

データエクスポートもAPI利用も無料でできるのでぜひぜひ

ちなみにこちらの方法で得られた、私の訪れた市区町村は294

Google Mapとの違いは、東京以外の区持ちの大都市(横浜とか名古屋とか)がGoogle Mapでは考慮されていないため。

 

これで自分が行った場所は分かったので、どんどん行ったことのない場所にでかけよう。