以前の記事で「GPS週数ロールオーバー」については紹介しましたが、今回は一度記録してしまったログを2019年に修正する方法について、書きたいと思います。
一度読み込んでしまったら修正できないGPSログ
「GPS週数ロールオーバー」では1024週ずれているだけなので、時間をシフトするだけなのでMyTracksやGPSBabelで対応できるだろうと思っていたら、正確なGPSの時刻をシフトしようなんてソフトはありませんでした。ん〜どうしようか本当に悩む・・・
GPXファイルはXML形式
悩んでいたところ、MyTracksで出力するときに使う、GPXのファイルはXMLの形で構成されていることを発見。これは<time>タグ内だけ置換などで修正できそうです。しかしながら約20年の間にうるう秒が18秒挟まれており、単純な置換だと秒数がずれてしまいます。GPXをcatしてみると以下
<trkpt lat="13.485173045" lon="144.77695467"> <ele>35.62485299999999</ele> <time>1999-08-22T18:24:05Z</time> <desc>Lat.=13.485173, Long.=144.776955, Alt.=35.624853m, Speed=0.000000Km/h</desc> <extensions> <mytracks:speed>0</mytracks:speed> <mytracks:length>0</mytracks:length> </extensions> </trkpt>
スクリプトを作成して一発置換
XMLの形ならPythonで扱いやすいかもと思いつき、Pythonで調べていたところなんと、gpxpyというgpxを扱うためのライブラリを発見!これを使ってGPXファイルをrollover対応させてみました。
gpx-rollover.py # -*- coding: utf-8 -*- import gpxpy import gpxpy.gpx from datetime import datetime, timedelta gpx_file_r = open("1999.gpx","r") #元ファイル gpx_file_w = open("1999-after.gpx","w") #編集後ファイル gpx = gpxpy.parse(gpx_file_r) #読み込んだファイルをgpxpyでparse roll_delta = timedelta(weeks=1024) #1024週を換算 uruu_delta = timedelta(seconds=-5) #うるう秒を換算 1999年からなので5秒 #ループしながら時間を足し算 for track in gpx.tracks: for segment in track.segments: for point in segment.points: point.time = point.time + roll_delta + uruu_delta #ファイルを書き込んで終了 gpx_file_w.write(gpx.to_xml()) gpx_file_r.close() gpx_file_w.close()
いや〜簡単に作れてPython素晴らしい!上記は1サイクル(1024週)分しかずらしていませんが、2サイクル分(2048週)分ずらしたい場合はスクリプトないの各数字をいじってみてください。