stravaのgpxファイルをcsvへ

 FTP値を出すためには時間内のパワーの平均を出す必要がある。そのためにはスプレッドシートに読み込む必要がある。となるとcsv化。

 gpxはxmlファイルの一種だからsimplexmlで簡単に行けると思ったらちょっと引っかかった。
 stravaからダウンロードしたgpxの先頭部分(最初の要素まで)はこんな感じ。

<?xml version="1.0" encoding="UTF-8"?>
<gpx creator="StravaGPX" 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" version="1.1" xmlns="http://www.topografix.com/GPX/1/1" xmlns:gpxtpx="http://www.garmin.com/xmlschemas/TrackPointExtension/v1" xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3">
 <metadata>
  <time>2021-03-30T11:44:33Z</time>
 </metadata>
 <trk>
  <name>onelap 12 All-round Capacity Test</name>
  <type>17</type>
  <trkseg>
   <trkpt lat="36.1344890" lon="120.5331290">
    <ele>101.0</ele>
    <time>2021-03-30T11:44:33Z</time>
    <extensions>
     <power>0</power>
     <gpxtpx:TrackPointExtension>
      <gpxtpx:hr>0</gpxtpx:hr>
      <gpxtpx:cad>0</gpxtpx:cad>
     </gpxtpx:TrackPointExtension>
    </extensions>
   </trkpt>

 要素を一つvar_dumpで取り出してみる。

object(SimpleXMLElement)#2 (4) {
  ["@attributes"]=>
  array(2) {
    ["lat"]=>
    string(10) "36.1344230"
    ["lon"]=>
    string(11) "120.5331050"
  }
  ["ele"]=>
  string(5) "101.0"
  ["time"]=>
  string(20) "2021-03-30T11:44:38Z"
  ["extensions"]=>
  object(SimpleXMLElement)#5 (1) {
    ["power"]=>
    string(1) "0"
  }
}

 @attributesのところはそのままやっても取り出せない。検索。なるほど、@を取って()をつけるとな。
www.searchlight8.com

 次に、extensions。powerはvar_dumpで出てくるけど、hrとcadは出てこない。これも検索。ほう、このタイプのやつ、名前空間というのか。ちょっと文字数が多くなりそう。
www.terakoya.work

 で、完成。ファイル名はstrava.gpxで固定。

#!/usr/bin/php
<?php
#stravaからエクスポートしたgpxファイルをcsvとして標準出力へ
error_reporting(E_ALL);
$xml = simplexml_load_file("strava.gpx", 'SimpleXMLElement', LIBXML_NOCDATA);	#ファイル名固定	
$items = $xml->trk->trkseg->trkpt;

foreach( $items as $item){
	echo strftime("%Y/%m/%d",strtotime($item->time));
	echo ",";
	echo strftime("%H:%M:%S",strtotime($item->time));
	echo ",";
	echo $item->attributes()->lat; 
	echo ",";
	echo $item->attributes()->lon; 
	echo ",";
	echo $item->extensions->power;
	echo ",";
	echo $item->extensions->children("gpxtpx",true)->TrackPointExtension->hr;
	echo ",";
	echo $item->extensions->children("gpxtpx",true)->TrackPointExtension->cad;
	echo "\n";
}
?>

 onelapからstravaに自動同期したデータが前提なので、他では不都合が出るかも。