Google Maps の行動ログを抽出する

Google Mapsには行動ログを残すオプションがあります。正式名称はタイムラインで、これをオンにしておくと行動・滞留・滞在等の状態をよしなに判断して行動の履歴を残してくれます。

タイムラインをオンにする方法はこの辺を参考にしてください。で、このログはJSON形式でエクスポート出来たりします。

タイムラインのエクスポート

Googleの各種サービスはtakeout.google.comからエクスポートできます。ブラウザで自分のアカウントにログインした状態で以下のURLにアクセスしてみてください。

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

タイムラインの情報は比較的下の方にあります。「ロケーション履歴」の項目のみにチェックを入れて次に進みます。

f:id:kazutaka83:20171119235255p:plain

ファイル形式、サイズ等の選択画面が出てきますのでいい感じに設定します。「アーカイブを作成」を押すと準備画面に遷移し、終わればダウンロードが始まります。

f:id:kazutaka83:20171119235546p:plain

takeout-hogeのファイルを開くとJSON形式のログを見ることができるはずです。あとはこれを加工・編集するとGISデータとして使うことができますね。

f:id:kazutaka83:20171119235718p:plain

Pythonを使ってZIPファイルを解凍する

ZIPファイルの解凍作業は面倒くさいです。なのでPythonを使ってZIPファイルを解凍しましょう。動作環境はPython3.6以上推奨。標準ライブラリだけでやっていきます。

  1. 1つのZIPファイルを解凍

  2. フォルダ内のZIPファイルをまとめて解凍

  3. 階層構造が複雑なフォルダのZIPを解凍

1つのZIPファイルを解凍

os、zipfileを使います。最も基本的な処理なので、2・3の操作でもこれを使いまわしていきます。わからなければここに立ち返りましょう。

import os
import zipfile

with zipfile.ZipFile('sample.zip', 'r') as zf:
    for f in zf.namelist():
        if not os.path.basename(f):
            os.mkdir(f)
        else:
            with open(f, 'wb') as uzf:
                uzf.write(zf.read(f))

複数ファイルを圧縮したZIPの場合を考慮し、os.path.basenameを使って条件分岐をかけています。これが基本。

フォルダ内のZIPファイルをまとめて解凍

globを使ってzipファイルを探し、個々に解凍処理を行います。上でやった処理にforをかけて回す感じです。

import os
import zipfile
import glob

for i in glob.glob('*.zip'):
    with zipfile.ZipFile('i', 'r') as zf:
        for f in zf.namelist():
            if not os.path.basename(f):
                os.mkdir(f)
            else:
                with open(f, 'wb') as uzf:
                uzf.write(zf.read(f))

これで作業ディレクトリ上に解凍されたファイルが生成されます。

階層構造が複雑なフォルダのZIPを解凍

これは以下のような状況で使います。稀に良くあります。

f:id:kazutaka83:20170908203313p:plain

globを使ってzipファイルを探しに行きますが、今回は再帰的にディレクトリを深掘りしていくように指定します。

import os
import zipfile
import glob

for i in glob.glob('**\*.zip', recursive=True):
    with zipfile.ZipFile('i', 'r') as zf:
        for f in zf.namelist():
            if not os.path.basename(f):
                os.mkdir(f)
            else:
                with open(f, 'wb') as uzf:
                uzf.write(zf.read(f))

この処理だと作業ディレクトリに解凍ファイルが作成されます。各々のディレクトリ下に解凍ファイルを置きたい場合には、os.path.splitを使うと良いでしょう。

import os
import zipfile
import glob

for i in glob.glob('**\*.zip', recursive=True):
    with zipfile.ZipFile('i', 'r') as zf:
        for f in zf.namelist():
            d = os.path.split(i)[0] + '\\' + f
            if not os.path.basename(f):
                os.mkdir(d)
            else:
                with open(d, 'wb') as uzf:
                uzf.write(zf.read(f))

os.path.splitはなかなか便利なモジュールで、ファイルパスを食わせるとディレクトリ部分とファイル名に切り分けてくれます。

第一引数からディレクトリパスを持ってきて、そこに解凍後のファイル名を繋げています。

これで単純作業が減らせますね。

参考

Python で zip ファイルの解凍 - へたれプログラマな日々

Estimote社のBeaconについて調べた

Beaconを使った屋内測位、センサーデータ収集をやってみたいのでEstimote社から機器を取り寄せようかと思っています。現在EstimoteのBeaconは5種類あり、内屋内測位に使えそうなものが2種。他の3種はちょっと特殊な用途で使う用みたい。

ロケーションビーコン(Location Beacon)

定点設置型で位置情報を取得するビーコンには二種類あり、公式ページでは『Location UWB Beacon』と『Location Beacon』という名前になっています。

この2つの違いはAutoMappingかManualMappingかという点。Location UWB Beaconは専用のiPhoneアプリを使って建物の地図を生成できるようです。Location Beaconはその機能を持たず、自身で地図を生成する必要があるようで。

ともにバッテリーは5年もつとのことなので、一度設置をすると暫くは放置で大丈夫。非公式ではありますが電池交換も出来るみたいですね。


How To Change Estimote Beacon Battery

ステッカービーコン(Sticker Beacon)

上の2種は三角測量で端末の位置をとってくるのに対して、このステッカービーコンは貼ってあるモノの電波を受けて場所を特定します。ステッカーを貼った自転車が特定の場所に入ったときに信号を飛ばすような用途で使用できるため、常に位置を取れるわけではありません。

んで何を買うか

今回はLocation UWB Beaconを購入してみます。2014年時点では技適が無く、国内では使えない状態でしたが、どうやら最近のBeaconは技適とってるみたい。アプリを使った地図作成も気になるのでUWBの方を輸入して遊びます。

ちょっと却下。UWB Beaconで屋内地図作るには結構な数のBeaconを設置しないと駄目っぽい。自宅のCADデータ使って地図を作って、Location Beaconで動態分析するところから始めます。

来月は引っ越しを控えてるんで、できるだけ早く届いてほしいなあ。

Python(pandas)を使ってテーブル間の差分を取り出す

同じ列(カラム)を持っているCSVファイルが複数あり、その差分を取りたいときの手法をメモっておきます。一年前の売上と比較したいとか、前年度の従業員リストと比較したい場合なんかに使えるかと。

続きを読む

音声読み上げ機能(iPhone)を使って効率的に読書する

KindleやReader Storeで電子書籍を買っておくといつでもどこでも読書ができます。

電車の待ち時間や休み時間で読書が捗る一方で、とうぜんのこと運転中は使えません。不便はしてなかったものの、娘が生まれて読書量も減って来た最中、こんな発言を見かけまして。

そういえばiPhoneAndroidには音声読み上げ機能があったじゃん。これを使えば電子書籍を音読させることもできんの?と言う感じでやり方を調べた次第です。使ってみるとかなり便利なんで、皆さま色々活用してみませんか。

続きを読む

コマンドプロンプトとpg_dumpを使ってデータベース単位でのバックアップを取得する

前のエントリの続きです。

コマンドプロンプトでデータベースの一覧を取ってきたのは、データベース単位でダンプしたいからでした。PostgreSQLにはpg_dumpallという全バックアップの方法があるんですが、個別のデータベースを復旧させたい(それ以外のデータベースに影響を与えたくない)という状況には向いていません [^1] 。

先のエントリで取ってきたデータベースのリストを使い、個々のデータベースごとにバックアップファイルを作ります。

続きを読む

Windowsのコマンドプロンプト上でPostgreSQLのDBリストを取得する

pgAdminを使うとGUI上でDB一覧を見ることができますが、バッチ処理などで使いたい場合文字列で引き出す方が利便性が高いです。コマンドプロンプトを使ってデータベースのリストを文字列出力します。

続きを読む

スポンサード リンク