快速たぬたぬの自転車日記

自転車って楽しい

GARMIN沈黙しちゃったからGoogle MapsのタイムラインからデータをサルベージしてStravaに記録する

走っているとGARMINが沈黙してしまった。
でもせっかくのライド、Stravaに記録が残らないのはいやだ。
それ、Perlで(ry

書き捨てスクリプトを書きました。汎用性とか綺麗に書くこととか微塵も考えてないのでコードの内容については突っ込み無用です。
Google MapsのタイムラインからKMLデータを取得し、このスクリプトに食わせてGPXに変換することでStravaに取り込むことができます。

#!/usr/bin/perl

# kml2gpx.pl

# settings
$kmlfile = 'timeline.kml';
$gpxfile = 'out.gpx';
$usefrom = '2018-02-04T23:10:00Z';	# GMT
$useto = '2018-02-05T00:20:00Z';	# GMT

open($fout, "> $gpxfile");
print $fout qq(<?xml version="1.0" encoding="UTF-8"?>\n);
print $fout qq(<gpx creator="StravaGPX" version="1.1" xmlns="http://www.topografix.com/GPX/1/1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd http://www.garmin.com/xmlschemas/GpxExtensions/v3 http://www.garmin.com/xmlschemas/GpxExtensionsv3.xsd http://www.garmin.com/xmlschemas/TrackPointExtension/v1 http://www.garmin.com/xmlschemas/TrackPointExtensionv1.xsd http://www.garmin.com/xmlschemas/GpxExtensions/v3 http://www.garmin.com/xmlschemas/GpxExtensionsv3.xsd http://www.garmin.com/xmlschemas/TrackPointExtension/v1 http://www.garmin.com/xmlschemas/TrackPointExtensionv1.xsd">\n);
print $fout qq( <metadata><time>$usefrom</time></metadata>\n);
print $fout qq(  <trk>\n);
print $fout qq(   <name>Import From Google Location History</name>\n);
print $fout qq(   <trkseg>\n);

$usefrom =~s/\D//g;
$useto =~s/\D//g;
open($fh, "tac ${kmlfile} |");
while(<$fh>){
	if(/<gx:coord>([\d\.]+) ([\d\.]+) [\d\.]+<\/gx:coord>/){
		$lon = $1;
		$lat = $2;
	}
	if(/<when>(.+)<\/when>/){
		$when = $1;
		$whencode = $when;
		$whencode =~s/\D//g;
		next if($whencode < $usefrom);
		last if($whencode > $useto);
		print $fout qq(    <trkpt lat="${lat}" lon="${lon}"><time>${when}</time></trkpt>\n);
	}
}
close($fh);

print $fout qq(  </trkseg>\n);
print $fout qq( </trk>\n);
print $fout qq(</gpx>);
close($fout);

exit;

なお、出来るデータはかなり荒いので「リーダーボードに不参加」にしておきましょう。
やくそくだぞ!

初めてのPerl 第7版

初めてのPerl 第7版