1999年と記録されたGPXファイルを2019年に修正する

以前の記事で「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週)分ずらしたい場合はスクリプトないの各数字をいじってみてください。

投稿を作成しました 95

コメントを残す

関連する投稿

検索語を上に入力し、 Enter キーを押して検索します。キャンセルするには ESC を押してください。

トップに戻る
%d人のブロガーが「いいね」をつけました。