~ルートラボ 素朴な疑問編~
自転車で走って取得したGPSログを調べると、取得機器によってデータが微妙に異なる・・・ということに気が付きます。
機器内臓時計の安定度の良し悪しとか、OSの違いによるアプリケーション設計仕様の差、機器に実装したアプリケーションが機器内臓の演算パワーや記憶資源の多寡を忖度している、といったあたりが原因なのでしょうか?? GPS衛星は衛星自身の精密な位置と時間の情報を電波に乗せて決まった形式で衛星近傍宇宙に届けているだけなのだそうな。このGPSシステム自体が誤差要因を持つとはいえ、異なる機器で同時受信となれば、受信機器間のデータ差は、受信側の事情に依存しているのでしょう。というわけでGPS、、、、 あっ、いけね。GPSじゃなくてルートラボでした。
ところで、ルートラボという至極便利(最近ちょっと使いにくいようですが)なツールも、場合によっては獲得標高が少々、過大(まれに過小もあり)に表示されるんじゃないか?という気がしています。みなさん、どう思われますか。かつてのルートラボでは、険しい山を貫くトンネルを通過する場合に、不適切な処理(バグではありません)で派手に獲得標高が嵩増しされていましたが、今では出入り口を結んだ直線補間によってほぼ修正されているので、その過剰分はすっかり解消されています。しかしそれでも違和感を感じることがあります。
というわけで、実際にスマホアプリなどで得たGPSログを眺めて深みに嵌る前に、まず、ルートラボの「道ぴたモード」で作成したデータをGPXファイルで取得し、その素性を調べてみます。ここから先は完全に興味本位モードです。
(スミマセンちょっと長文になってます)
■■■ ルートラボのGPXファイルの構造 ■■■
機器で取得したGPSログは、GPSアプリに依存して生成されるGPXファイルで確認することが出来ますが、GPXファイルに含まれる時系列データは、
/緯度/経度/標高/時刻/
の4つです。一方、ルートラボの「道ぴたモード」では、GPXファイルに時刻データが存在しないので、
/緯度/経度/標高/
の3つとなります。
で、ルートラボから生成されるGPXファイルをプレーンテキストとして開いて確認してみると、基本的には次のようなデータセットが延々、ずら~りと並んでいました。
<trkpt lat="36.12156805555556" lon="137.62361">
<ele>1458.9</ele>
</trkpt>
これは、記述言語(XML)の文法を知らなくても見ての通り、というやつで、こんな風なんだろうなあ~。
trkpt:トラックポイント=通過点(trackpoint)
lat:北緯(latitude)
lon:東経(longitude)
ele:標高(elevation)
ルートラボの親サイト名はヤフーの≪LatLongLab≫ですが、この親サイト名は≪緯度・経度≫から来ているんでしょう(か)。つまり ≪緯度経度実験室≫
さて、このデータセット一組が、ひとつの通過点(トラックポイント)の
/緯度/経度/標高/
を示しています。つまりこれで
『地上の一点が決まる』
というわけです。この点を並べていくと、ルートラボの道ぴたモードの線になる、ということのようで。
■■■ 実例 ■■■
毎年8月に走っている長野県栄村の110kmアップダウンコース(栄村のサイクリングイベント)を例に、眺めてみます。
こちらが2017年のコースを「道ぴたモード」で描いた事例。
https://yahoo.jp/ryW-Mw村営スキー場をスタートし、新潟県境の山々に迫りつつ秘境・秋山郷に至り、ぐるっと村を周ってスタート地点に帰還します。獲得標高差は2800m程度であろうと私は勝手に思っていますが、ルートラボによれば、3003mとなっています。
■■ トラックポイントの配置 ■■
ごく普通に考えれば、トラックポイントの配置は直線部では疎らに、カーブ部分では細かくすることで、ルートラボ側の記憶資源の節約と走行距離計算の精度のバランスをとっていると思うわけです。また、トラックポイントを直線で結ぶのではなく、たとえば隣り合う3点毎に逐次、曲線で近似しながら距離を積算すればさらに精度が向上するでしょう。その場合の演算負荷もたいしたことはありません。
トラックポイントをカーブ部分では細かく配置するというルール。これはGPSアプリでは(アルゴリズムの違いはアプリ毎にあるでしょうがもしかしたらすべてのアプリで)適用されています。
じゃ、ルートラボのデータはどうなっているのか!?
栄村コースは結構なアップダウンが連続しますが、試しに、最高標高地点に至る手前の部分を拡大してみます。次の≪走行距離―標高≫プロフィールMAPの一番上のわずかに手前、青矢印の先端あたりに注目します。
この矢印先端付近のルートを拡大して東西1.3km、南北0.75km程度の範囲を平坦地面に投影したグラフで示すと、なるほど、次のグラフのように、カーブの部分では細かく、直線部分では疎らにトラックポイントが配置されていました。なお、全ルートで平均すると約26mにつきひとつのトラックポイントが配置されています。図で横軸が東西軸、縦軸が南北軸、赤い矢印は南北の方向を示します。なお、このグラフではスタート地点を原点(0,0)としています。
よく見ると、カーブの曲率半径に反比例してトラックポイントの配置が単純に密になっている、という以上の、もう少し手の込んだロジックでポイント配置のルールを設定しているような気がしなくもありません。
さて、上のグラフに相当する範囲の≪走行距離―標高≫プロフィールMAPは次の図です。矢印先端のトラックポイントで何やら鋭利な変化が。上の図の矢印と同じ場所です。ここに何か棲んでいるのか?
3次元図で表すとこんな風。
■■ とんがりトラックポイントの調査 ■■
先ほどの3つのグラフからもわかりますが、青矢印付近は左カーブ登坂となっています。
この飛び出たトラックポイントは、地理院地図では、ココになります。
http://maps.gsi.go.jp/#17/36.845229/138.645326/&base=std&ls=std&disp=1&vs=c1j0l0u0t0z0r0f1地理院地図によれば、この矢印辺りは法面を右手に見ながら左旋回して登坂する場面です。ルートラボのトラックポイントは道路を正確に参照しているようで、実はこのとんがりポイントで法面に乗り上げちゃっているのでは?とすら思えます。こういった険しい法面に位置する道路の場合、ルートラボの標高プロフィールは、どうもノイズっぽさが否めません。
ルートラボでは国土地理院のデータを参照して数値を決定しているのだそうですが、調べてみると、こんな記述が・・・。ルートラボサイトより引用します。
>>>> 引用開始
「ルートラボ」では「道ぴたモード」でルート作成をすると、クリックした地点間で経路 探索を行いルートの座標列を取得して、それらの各座標に該当する「10mメッシュ(標高)」データ※ を標高値として取得しています。
※「10mメッシュ(標高)」データは国土地理院より提供されています。
<<<< 引用終わり
*引用元
https://latlonglab.yahoo.co.jp/2010/06/post-5.html一方、WEBで公開されている地理院地図の現行版には10mではなく、5mメッシュデータが適用されています。国土地理院によれば
>>>> 以下引用
航空レーザ測量で計測した高さのデータから、建物、橋等の人工構造物や樹木等の植生を除去し、南北及び東西方向に5m間隔等で標高値を内挿補間により作成したデータを以下のとおり提供しています。
<<<< 引用終わり
*引用元
http://www.gsi.go.jp/kankyochiri/Laser_demimage.htmlというわけで、実際に地理院地図の機能を使って大真面目に当該道路をPC上でトレースして標高数値を拾ってみると、滑らかな登坂データを得ることが出来るなあ、という印象です。ルートラボは10mメッシュを使っている・・・どうもこの辺りに少々腑に落ちないガタガタが現れる原因があるような気がします。ん~、本当の原因は何なのか?
■■ まじめに計算した獲得標高 ■■
さてさて、ルートラボの栄村サイクリングルートの獲得標高は3003mでしたが、ルートラボのGPXファイルのトラックポイントデータを使って、大真面目に計算してみると、なんと6948m(笑)になってしまいます。次のグラフは横軸が走行距離で、青線が累積登坂量、赤線が累積降坂量です。もちろん、登坂中を示すデータ範囲、つまり青が増える範囲では、赤は減らずに真横に推移しています。(よ~く見ないとわかりません!) で、スタート地点に戻ってくるコースなので、登坂と降坂それぞれの最終値は符号が違うだけで大きさが同じとなります。また、青と赤を足し合わせると、スタート地点からの≪走行距離―標高≫プロフィールMAP(最初のグラフ)と同じ形になります。(ただしスタート標高がゼロになります)
それにしても獲得標高が6948mとはずいぶん過大(*)です。ルートラボが示す値の、実に2.3倍。実際に走行する路面に対して正負の雑音をもつデータが得られてしまうため、隣り合うトラックポイント間の標高差を大真面目に積算するとこんなことになってしまうというわけです。遠くから見ると滑らかに見えるけど、拡大してみると細かいアップダウンだらけ、という感じ。最近、復活気味とかいう噂のカセットテープ。あれは磁気記録媒体自体のヒステリシス雑音のおかげで高周波側に「サー」というノイズが重畳されるのですが、ルートラボのデータもそんな感じ(って、どんな感じかますますわからぬではないか!)
(*) 参考までに、iPhone SE+登山系アプリで採った実走ログから大真面目に積算した獲得標高は7097mです。で、この登山系アプリで生成したGPXファイルをスペインの汎用GPSアプリ ”wikiloc” に転用すると3500mほどに縮みました。どうやらwikilocは何かやっているようです。(妄想気味)
https://www.wikiloc.com/wikiloc/view.do?id=19713051・・・
さて、GPXデータ自体がすでにそのようになってしまっている以上、ルートラボの開発者さんとしては何とかして尤もらしい獲得標高に収斂させなければならないわけですが、一体どんな風に対処しているのでしょうか?
やり方としては、
① 移動平均など何らかのローパス・フィルタで細かい凸凹を緩やかにする
② くふうを凝らしたピークホールド/ディップホールドを行い、主要なピークとディップのみを抽出する
など、色々な手法が考えられることでしょう。①は、標高データを走行距離軸上で処理しても良いし、いったん、空間周波数軸上に変換してから、周波数の高い成分を除去して、再び走行距離軸上に戻すという方法もあります。
次のグラフは栄村ルートの46km付近。細かな凸凹ぱらつきを持って並ぶ〇印がルートラボのGPXデータ。これに対して空間周波数軸上で、高周波帯域の制限を適当に行い、再び走行距離軸上に戻して得た滑らかデータが青線です。例えば標高データをこんな風に滑らかにしてから登坂・降坂差分計算を実施するという手が考えられます。一つの事例として示します。
オオーっ!
これはまるで、磁気テープのヒスノイズを抑え込むために開発されたdolby NRやdbx、はたまた東芝のANRSといった追憶のノイズリダクションを思い出します。カセットテープ万歳!(何いってるんだ。全然違うし・・・)
・・・
GPSシステム自体の誤差に加えて、GPSロガー側のハードウエアが持つ誤差、ソフトウエアアプリケーションに起因する誤差が必ず存在し、ログデータに相応の雑音が紛れ込む以上、獲得標高なる数値を推定する機能を持つ類のGPSアプリの大半は、何らかの修正手段を持っているものと考えられます。具体的に何をどうしているかはわかりませんが、GPSアプリと同様に、ルートラボの開発者さんも、何らかの対応を行っているはずです。移動平均のような単純なものではなく、ずーっと手が込んでいると思いますヨ。そこが開発者の腕の見せ所、最大のノウハウなのでしょう・・・(100%妄想)
・・・
で、ルートラボで示される獲得標高3003mは、それでも少々大きいのではないか?という気がします。2800m位なんじゃないのかなあ? あのコースを走ったことのある方、どう思われますでしょうか?
■■ トラックポイント間の勾配を眺めてみる ■■
栄村の100キロコースを10回走った私の記憶によれば、精々、上りの瞬間最大勾配はいくら大きくても18%以下、下りも-20%までのような気がします。では、トラックポイント間の勾配頻度分布は如何に!?
次の図が結果。横軸の100%というのは、勾配角度で45度。二階建て木造家屋の階段並み!図では見えませんが、実はそういう数値があるんですよねぇ。20%を越える頻度も非常に高く、つまりかなりの雑音量という気がします。真面目に積算すると獲得標高が2.3倍になってしまうのですから、これも致し方ないところではあります。
・・・まあしかし、そもそもサンプリングしたデータの差分を見るなどというのは、分野を問わず、雑音まみれになることが多いものです。少々いじわる過ぎているのかも知れません。
■■ 走行距離から眺めてみれば ■■
ルートラボによると、2017年の栄村コースの走行距離は112.7kmです。一方で、ルートラボのGPXデータから真面目に計算した距離は、113.17kmで、その差は+0.4%です。真面目に計算、というのは標高も含めてトラックポイントの空間距離の差分を積算した、言ってみれば3次元距離(というか結局、普通の道のり)、という意味です。次の3次元グラフの黒線の長さに相当します(詳しい計算方法は一番最後に参考として書いてあります) 一方で、トラックポイントを東西南北の平面上に投影した場合を考えます。3次元走行ルートの黒線を、最低標高における東西南北面に投影したヤツ。つまり底面の薄い赤線。この赤線の長さ、すなわち2次元距離を真面目に計算すると、112.33kmとなります。獲得標高で約4000mも過大に見積もられるのに、走行距離に直すと、2次元と3次元の距離差は110km以上も走って839mにしかなりません。つまり、トラックポイントが標高方向に多少ばらついても、2次元と3次元の差はたったこれだけ。走行距離を考える場合、獲得標高簿ばらつきは気にする必要がほとんどないということになります。このあたりのからくりは、細長い直角三角形の長辺と二番目に長い辺の長さの差は思いのほか小さいことに起因しています。
で、タマタマだと思うのですが、ルートラボの走行距離は2次元距離と3次元距離の中間的な数値になっています。いずれにしても、ルートラボで示される距離は、GPXファイルから大真面目に計算した3次元距離と大差なし、という結果になりました。
■■ Google Map用KMLファイルとの違い ■■
GooglwMap上に描画する場合にはルートラボのKMLファイルを使いますが、これの中身を覗くと、緯度経度の順序が入れ替わっていたりする程度で、GPXファイルと似たようなもの。しかしよく見ると、標高データの粗さが違いました。GPXファイルの標高データは0.1m刻みですが、KMLファイルのデータは1m刻みです。0.1mのほうがいいように見えますが、まじめな3次元距離や獲得標高を計算すると、まあ、はっきり言って、どちらでも同じ、といってよい結果を得ることができます。
*─・‥…─*─・‥…─*─・‥…─*─・‥…─*─・‥…─*─・‥…─*
他にもいくつか、おや?と思う部分があります。何故か同じトラックポイントデータが2個並んでいる、とか、とか、とかとか々々ゝゝ・・・
しかし、ルートラボが便利なツールであることには変わりありません!!!
さてさて、せっかくGPXファイルを覗いているのですから、多少は面白そうなことをしてみたいと思うのであります。
■■■ 信州の4つの登坂を比較する ■■■
①全日本マウンテンサイクリング・イン・乗鞍
https://latlonglab.yahoo.co.jp/route/watch?id=f562d0d64460ab1ac9fe5c9159337011②JR小諸駅から車坂峠
https://latlonglab.yahoo.co.jp/route/watch?id=7baf8c03f0771c07b9844629fbe12afe③しなの鉄道滋野駅から地蔵峠
https://latlonglab.yahoo.co.jp/route/watch?id=b819a1766c7d4b9c6fc9ada35bf4d50e④JR八千穂駅から麦草峠
https://latlonglab.yahoo.co.jp/route/watch?id=c2ca610570dbd1fb7baf1c2ffbd4da6b以上の4ルートを眺めてみます。
■■≪走行距離―標高≫プロフィールMAPを比較する ■■
そのまま比較してみます。じゃじゃ~ん!
4本の線はそれぞれ以下の通り。
赤 → ①全日本マウンテンサイクリング・イン・乗鞍
青 → ②JR小諸駅から車坂峠
緑 → ③しなの鉄道滋野駅から地蔵峠
黒 → ④JR八千穂駅から麦草峠
・・・所見
●赤:乗鞍はスタートから空気が薄そう!
●黒:麦草峠の登坂はやや緩めですが、サイクリングとしては長くて楽しめそうですね!
なお、青線の道は誰が言ったのか知りませんが、「日本のラルプデュエズ」などと言われているようです。緑線の地蔵峠は、実は車坂峠のすぐ隣で、私は「裏ラルプデュエズ」と勝手に呼んでいます。
上のグラフのスタート地点の標高を一致させて、登坂標高という見方で書き直します。
・・・所見
●緑:わっ、地蔵峠の道は休むところが無い!
●青と緑の道は隣同士なので連続して両方上りたい!
●赤:乗鞍の空気の薄さがわからなくなるこのグラフに騙されるな!
(注)私は乗鞍を走ったことがありません
■■2次元図で比較する ■■
東西/南北の2次元図。出発点を一致させて上空から見下ろした場合を想定しています。
・・・所見
●赤:乗鞍ルートが随分短く見えるが、それは見た目だけで、他よりも九十九折れが深いんだろうなあ
●長野県は四方が山、というのが実感できる
・・・四方に聳ゆる山々は 御嶽乗鞍駒ヶ岳 浅間は殊に活火山 いずれも国の鎮めなり♪・・・県歌・信濃の国より
■■3次元図で無理やり比較する ■■
東西/南北/標高の3次元で無理やり比較してみます。(無理やり、ですよ!)
スタート地点の東西南北値をそれぞれゼロに設定していますが、標高はゼロに合わせず、素の値にしています。また、線だけだと何だかサッパリわからないので、東西南北に沿った立方体を設定し、それぞれの走行ルートをちょうどぴったり収めています。
・・・初見
●比類なき無理やり感で、作図した自分も騙されそう!
●乗鞍がやっぱり短く見えるが、景気など微塵もよくなっていないのに 「好景気が底辺まで広がって…」 という大本営発表にも似た人民を欺く図(笑)
*─・‥…─*─・‥…─*─・‥…─*─・‥…─*─・‥…─*─・‥…─*
というわけで、最後の3次元図は自爆気味でしたねぇ!(トホホ)
もう少しいろいろ試してみると、面白い発見があるかも知れません。
さあ、自転車大好きな良い子のみなさん、夏の自由研究はコレで決まりダーッ!
ところでルートラボの評価は・・・
価格評価→★★★★★
評 価→★★★★☆
年 式→2018
ここからは参考まで。
■■■ GPXデータの処理 ■■■
最初にチラと触れたルートラボのGPXデータですが、グラフを描くために次のような処理をしています。
■ 1 ■ データをEXCELなどで扱えるようにする
次のデータセットが一組で、これが乗鞍ヒルクライムだと全体で732組だけあります。まずはテキストでファイルを開いてMSワードなどにコピペします。実は、下の3行はワードにコピペした状態です。
<trkpt lat="36.12156805555556" lon="137.62361">
<ele>1458.9</ele>
</trkpt>
ここからXML言語部分を削除します。MSワードの検索置換機能を使って、取り除き、つぎのように半角スペースを挟んで3つの数値、つまり、北緯、東経、標高、を残します。
36.12156805555556 137.62361 1458.9
乗鞍ルートの場合、この3つの数字が縦に732行だけ、ずら~っと並びますので、これをEXCELシートに732行×3列で貼り付けたり、フリーソフトのSCILABやOctaveで読み込むなどして、数値計算・グラフ作成が可能な環境に持ち込みます。
■ 2 ■ 地球の定義(笑)
標高0mを与える基準としての地球半径を定義します。これには「ジオイド」「楕円体」「回転楕円体」「測地基準系」など、さまざまな定義があってクラクラしそうになりますが、回転楕円体である “GRS80 1980” の定義を使うことにします。
参考文献→
https://desktop.arcgis.com/ja/arcmap/latest/map/projections/about-the-geoid-ellipsoid-spheroid-and-datum-and-h.htm■ 3 ■ GPXデータの地球表面への貼り付け
以下の手順を踏みます
●GPXデータの隣り合う2つのトラックポイント間の差分値を以下のように定義します
緯度latの差分値をΔlat、
経度longの差分値をΔlong、
標高elevの差分値をΔelev
●回転楕円体 “GRS80 1980” の長半径Rpは6378137m、短半径Reは6356752.31425mです。
●当該トラックポイントでの地球半径を上記のRpとReと緯度から算出しこれをRとします
●≪地球半径R+標高elev≫と≪緯度差分Δlat, 経度差分Δlong, 標高差分Δelev≫を使って、走行距離差分Δxを算出します
●同じく、半径Rの地球の表面に投影した ≪緯度方向投影距離差分Δxlat≫ と ≪経度方向走行距離差分Δxlong≫ を算出します
●走行距離差分Δxは標高も含めた3次元の距離であり、次の関係があります
Δx^2 ≒ Δxlat^2 + Δxlong^2 + Δelev^2
ただし、上記の近似等号(≒)は等号(=)として全く差支えありません。
●上式で求めたΔxを逐次加算すると、最終的な走行距離が判明します
●Δelevが正数の場合に関してΔelevをすべて加算すれば、最終的な獲得登坂標高が得られ、Δelevが負数の場合に関してΔelevをすべて加算すれば、最終的な獲得降坂標高が得られます
*─・‥…─*─・‥…─*─・‥…─*─・‥…─*─・‥…─*─・‥…─*
なお、EXCELによる3次元プロットは
http://www.doka.ch/Excel3Dscatterplot.htmの
http://www.doka.ch/Excel3Dscatterplotv2_1.zipが便利そう。
汎用的な3次元プロットは、フリーの技術計算ソフト「Scilab」や「Octave」が便利です。こういう強力な計算ツールがフリーソフトだなんて、不思議な時代になったものですねぇ。
https://www.scilab.org/https://www.gnu.org/software/octave/