背景

2020年3月末でルートラボがサービスを終了して、ルート作成サービスはRide with GPSに乗り換えた。
表示するeTrexにはポイント数制限があり、1つのファイルで10000ポイントを超える場合そこから先は表示してくれない。
コースにも依るが100km未満でも10000ポイントを超えたりする。
そして、Ride with GPSでポイント数を減らす機能は課金しないと使えない。


作ったもの

・10000ポイント毎に区切ってファイルを分割してくれるプログラム

プログラムを実行して開くウィンドウでRide with GPSから出力したgpxファイルを選択すると、元ファイル名のあとに「_01」「_02」…と順に付いたファイルを自動生成し分割される。
ついでに毎回手動で入れていたルートの表示色を緑に変更する呪文も埋め込んだ。 
分割ではなくポイントを間引く方法もあるのだが、距離が長くなったときに表示がカクカクになるのを避けるために分割方式にした。

これでロングライドやブルベのルートデータ準備の手間が減って楽になるので嬉しい。

ソースコード

# モジュールのインポート

import os, tkinter, tkinter.filedialog, tkinter.messagebox

 

# ファイル選択ダイアログの表示

root = tkinter.Tk()

root.withdraw()

 

# 拡張子指定

fTyp = [("","*.gpx")]

 

iDir = os.path.abspath(os.path.dirname(__file__))

tkinter.messagebox.showinfo('gpxトラック分割プログラム','処理ファイルを選択してください!')

file = tkinter.filedialog.askopenfilename(filetypes = fTyp,initialdir = iDir)

 

# 処理ファイル名の出力

tkinter.messagebox.showinfo('gpxトラック分割プログラム',file)

 

header=[]

point_limit = 10000

file_index = 0

footer = "    </trkseg>
  </trk>
</gpx>"

line_color = "      <extensions><gpxx:TrackExtension><gpxx:DisplayColor>Green</gpxx:DisplayColor></gpxx:TrackExtension></extensions>
"

 

#file_name = "sample.gpx"

file_name = file

with open(file_name,'r') as f:

    # header 読み込み

    for line in f:

        l = line.strip()

        header.append(line)

        if l.startswith("<trkseg>"):

            header_num = len(header)

            header.insert(len(header) - 1, line_color)

            break

    lines = f.readlines()

f.close()

 

while len(lines) >= header_num + file_index * 3 * point_limit:

    file_index += 1

    new_file = file_name.rstrip(".gpx") + "_" + str(file_index).zfill(2) + ".gpx"

    with open(new_file,'w') as f2:

        for headline in header:

            f2.write(str(headline))

        for line in lines[header_num + (file_index - 1) * 3 * point_limit : header_num + file_index * 3 * point_limit]:

            f2.write(line)

        else:

            f2.write(footer)

            print(new_file)

    f2.close()

else:

    print("Finish!")