blog.tmp.tokyo

No Promises Await at Journey's End

複数の GPS データ群から必要な部分だけを抽出するスクリプトを Ruby で書く

お疲れ様です。本日は島根に復帰して最初の土曜日であり、天気も微妙に曇りでしたので家で先日届いた荷物の片付けなどを行いました。東京で買ったテレビを設置したり、PlayStation4 を設置したりと割と忙しかったのです。

夜になって片付けもひと段落したので、最近飛行機に乗った時に記録していた GPS データを mac に取り込んで確認してみました。

f:id:tomohiko37_i:20160423232658p:plain

Oh...

何度か島根と東京を行き来したときのデータが消さずに追記されていたようです。単に前のを消してから記録していなかっただけですね。

そもそも何をやっている?

私が飛行機に乗る時に GPS レシーバを持って乗り込んでいるのです。詳細は以下の記事を参照ください。

tomohiko37-i.hatenablog.jp

tomohiko37-i.hatenablog.jp

簡単に言えば飛行機に乗った時にどこから離陸して、どのあたりを飛んでどの滑走路に着陸したかを記録しているのです。iPhone でやってもいいのですがバッテリの問題などから専用の GPS ロガーを 1 万円くらいで買って利用しています。

プログラムで分割

詳しく Google Earth を見てみると、どうやら 2016/3/5 に仕事で島根へ行った時の記録からずっとそのままでした。2 往復半くらいです。Google Earth 上からもいじれるようなのですが、いかんせん似たような場所を移動しているのとポイントの点が多すぎるのでプログラムでやるしかないと思いました。

とりあえず Ruby でさくっとスクリプトを書くことにしました。

得意の Java でもいいんですが、XML 読み込みが面倒なんです。C/C++ だと早いなぁと思いつつも XML を扱うのは難しいです。そう考えると Ruby はすごいなぁと思います。さくっと数行書けば読み込めますからね。

require 'rexml/document'
require 'time'

# 読み込む KML ファイルのパスの定義
KML_FILE_PATH = "/Users/xxxxxx/Desktop/2016-04-16 14_13_44 +0000.kml"

# KML の読み込み
doc = REXML::Document.new(open(KML_FILE_PATH))

# 最上位層からタグをたどっていく
doc.elements.each('kml/Document/Folder/Folder') do |element|

    # 各トラックの名前を取得
    puts element.elements['name'].text

    # そのトラックの開始日時
    # m-241 で記録される日時は UTC のため JST に変換する必要がある
    begin_time = element.elements['TimeSpan/begin'].text
    begin_time_jst = Time.parse(begin_time).getlocal
    puts "記録開始日時(JST):#{begin_time_jst}"

    # そのトラックの終了日時
    end_time = element.elements['TimeSpan/end'].text
    end_time_jst = Time.parse(end_time).getlocal
    puts "記録終了日時(JST):#{end_time_jst}"

end

うーん。これだけで XML 読めるのがスゴイ。タグを上から辿って取得した日時を UTC から JST に変換しただけ。これを実行すると、

track-1
記録開始日時(JST):2016-03-05 06:29:23 +0900
記録終了日時(JST):2016-03-05 07:23:22 +0900
track-2
記録開始日時(JST):2016-03-05 09:57:33 +0900
記録終了日時(JST):2016-03-05 11:57:11 +0900
track-3
記録開始日時(JST):2016-03-07 19:03:02 +0900
記録終了日時(JST):2060-09-25 13:18:50 +0900
track-4
記録開始日時(JST):2016-04-09 14:35:53 +0900
記録終了日時(JST):2016-04-09 16:14:13 +0900
track-5
記録開始日時(JST):2016-04-10 19:10:03 +0900
記録終了日時(JST):2016-04-10 20:52:13 +0900
track-6
記録開始日時(JST):2016-04-16 14:05:33 +0900
記録終了日時(JST):2016-04-16 16:58:13 +0900

こんな感じで記録された日時が取得できます。

続きます。