まえがき
生活に不便を感じたらその不便さをwrap
するためにラッパライブラリ等を作ることが私のプログラミングの動機となることが多く、
- 写真を
写真.app
で管理していたがPython
などのスクリプトを使った一括編集などが難しいためDjango
を用いて自作 - 画像の変換が右クリメニューからできるソフトがあるのだが
.avif
や.webp
など次世代形式に対応していないため自作 - SNSの交換の際にQRコードそのものが送られてくることが多々あったので画面上のQRコードを読み取りクリップボードにコピーするソフトを自作
- マイクラ鯖の
rcon
が生では使いにくすぎたのでDjango
でラッパを自作
などのツール系の自作が多くくも、去年はPC98でマインスイーパを自作しその続きをやろうと思っていたが、文化祭片付け後にPC98が死亡していたためジョークRFCのパロディでも書こうと思っていたのだが面白さがイマイチ伸びなかった上PC98を秋葉原最終処分場。で二台購入し動作確認もしたためPONG
でも作る気概であったけれども夏休みが多忙を極めていた挙句外が暑すぎて部活に行きたくなかったので簡単に作れそうな
- Google Mapの
location-history.json
を解析して地図に表示するツール
を自作することとした。
献立
実行されたらオプションを解析、不足しているなら対話シェルを呼び出しユーザに情報を求める。その後はデータを解析しブラウザに表示し待機、ブラウザのタブが閉じられたらプログラム終了となる。また、急いで製作したものであるので、大半が「なんか知らんけど動いた」ゾーンに属していることを留意してもらいたい。
util.py, logger.py
ベクトル計算の支援を主とするライブラリとロギング用のライブラリを自作して使用している。util.py
にて定義されているVector
ついて解説すると、Vector
は四則演算が大体行列計算と同じものとなる。ただし、乗算は横ベクトルと縦ベクトルの積として計算される。つまりVector(a,b)*Vector(x,y)=Vector(ax,by)
となり、除算もこれに倣う。logger.py
は、ほぼ想像できるような内容しか書かれていないので深くは解説しないが、StreamHandler
とFileHandler
で標準入出力とファイルにログを流している。
解析
location-history.json
はactivity
,timelinePath
,visit
の三種類うちどれか一つを持つデータの配列であり、activity
は移動手段と移動元/先の座標、timelinePath
は移動時のパス、visit
は訪れた定点と訪れた時間帯が記録してある。今回移動手段はあまり気にしていない上Googleの推測が精度を欠いており、海上を車で移動していたりするので移動はtimelinePath
を採用した。
座標は全て"geo:<lat>,<lng>"
という形式で記録されていたので、geo_resolver
関数を作成し効率化を図った。
|
|
また、データの特性上(datetime, (lat, lng))
という形式のオブジェクトを扱う機会が多いのでNamedTuple
を利用してリーダブルなコードにした。
|
|
markers
辞書は同じ座標のmarker
が重なって読めないという事態を防ぐために座標をキーにした辞書型で格納しその後for
を回してfolium.Map
に載せている。座標をキーにする際に処理を簡潔に.append()
で済ませるためにdefaultdict
を使用した。
|
|
|
|
|
|
また、データ構造の記述時に<float>
などが記述されているが全て値はダブルクオーテーションで括られていることは記載していない。
timelinePath
データ構造
|
|
timelinePath
は現地時間で記録されているのでdatetime.timedelta
を加算して時差補正をする必要がない。startTime
からdurationMinutesOffsetFromStartTime
分後のlat
とlng
が格納されている。
解析
|
|
for
ループを回してpoints
に格納。以上。
visit
データ構造
|
|
解析
|
|
前述のtimelinePath
と比べ僅かに複雑になっている。visit
は長時間を記録するため日付をまたぐことが多いのでその日付を補正する部分と、マップ表示用のデータの作成の部分が増えている。
表示
|
|
データがイカれていると表示中にエラーを吐くことが多いのでtry
~except
文を使っている。また、Chrome
以外のブラウザではエラーで何も表示されないバグがあるそうなのでChrome
を名指ししている。defaultdict
を回している部分が少し引っかかると思うがそれぐらいだろう。
おわりに
締切の日の深夜にこの文を書いているため、最後のほうが駆け足になったことを許してもらいたい。これだけでは「Googleがサ終しなかったら意味ないじゃん」と思うかもしれないが、移動経路のグラフから撮影時間をクエリにして座標を返すプログラムに発展させることができ、これができるとGPSモジュールがついていない一眼の写真にGPS情報をつけることができる。ソースコードの全文は追ってWeb版で公開される思うので、よかったらWeb版も見てもらっていきたい。会場の部屋の何処かでQRコードが配布されていることだろう。