2014/02/03

Stravaのセグメントに残らなかったログを修正して残す方法

昨日のサイクリングで白石峠に行ったログを Strava で確認したら、自己ベスト2位のはずが、自己ベスト扱いになっていた。

Stravaという自転車系のサービスは、バーチャル競走ができる機能があり、セグメントと呼ばれる区間を、他人や過去の自分と競うことが出来る。

登り以外の平坦のセグメントもあるが、風向きや複数人でのローテーションでもタイムが出てしまうし、登りであっても、知らない人のタイムはあまり興味が無い。

興味があるのは、過去の自分の記録との比較と、一緒に走った人のタイムだ。

自己ベストにならなかった記録

過去の白石峠の記憶に残っているログを探したら、途中からGPSデータの位置情報がずれてしまっていて、セグメントとして認識されなかったみたいだ。

これはMacのAscentというアプリで、白石峠の区間だけログを切り出したもの。

これをtcx形式でエクスポートし、位置情報の修正をしてあげたデータがこちら。

この部分のみを Strava にアップロードして無事記録が残りました。

ログの修正方法

目視で確認したところ、後半の位置がずれてしまっているだけなので、ずらしてあげることにします。

tcxを見やすくする

tcx形式の中身は独自形式のxmlです。

Ascentでエクスポートしたファイルは、改行が含まれていないので、処理しやすいようにします。Macのターミナルアプリで以下を実行。

xmllint --format FILE_NAME.tcx --output FILE_NAME.tcx

修正するズレ幅を調べる

tcxファイルの最後の方を確認して、Google Mapsで本来の位置との差を調べます。

          <Trackpoint>
            <Time>2013-08-31T04:50:31Z</Time>
            <Position>
              <LatitudeDegrees>35.998108</LatitudeDegrees>
              <LongitudeDegrees>139.180954</LongitudeDegrees>
            </Position>
            <AltitudeMeters>783.800049</AltitudeMeters>
            <DistanceMeters>-3218611000.000000</DistanceMeters>
            <HeartRateBpm xsi:type="HeartRateInBeatsPerMinute_t">
              <Value>185</Value>
            </HeartRateBpm>
            <Cadence>82</Cadence>
            <Extensions>
              <TPX xmlns="http://www.garmin.com/xmlschemas/ActivityExtension/v2">
                <Watts>227</Watts>
              </TPX>
              <TPX xmlns="http://www.garmin.com/xmlschemas/ActivityExtension/v2" CadenceSensor="Bike">
                <Speed>5.4910003</Speed>
              </TPX>
            </Extensions>
          </Trackpoint>

元の位置

本当の位置はクリックして調べる

差分

139.180954 - 139.179513 = 0.0014410000000282253
35.998108 - 35.997895 = 0.00021300000000223918

データ修正をする

同じような方法で修正する点を調べて簡単なスクリプト組んで修正。
今回は、 139.194693 の地点以降を修正しました。

<?php
$file_name = 'FILE_NAME';

$buf = file_get_contents("$file_name.tcx");
$lines = split("\n", $buf);

$flg = false;
$ret = '';
foreach ($lines as $line) {
    if (preg_match('/<LongitudeDegrees>([\.\d]+)<\/LongitudeDegrees>/', $line, $m)) {
        if ($flg) {
            $line = str_replace($m[1], ($m[1] - 0.0014410000000282253), $line);
        } elseif ($m[1] < 139.194693) {
            $flg = true;
        }
    } elseif ($flg && preg_match('/<LatitudeDegrees>([\.\d]+)<\/LatitudeDegrees>/', $line, $m)) {
            $line = str_replace($m[1], ($m[1] - 0.00021300000000223918), $line);
    }
    $ret.= "$line\n";
}
file_put_contents("${file_name}_2.tcx", $ret);

使い捨てなのでphpで。

Stravaにprivateでアップロード

作成したログをStravaにアップロードして、無事に My Results に記録が残りました。
まだまだ遅いけど、このタイムを目標に次に行った時はがんばろうというモチベーションアップの糧にします。

0 件のコメント :

コメントを投稿