ヤマレコMAPのコースタイム表示機能の作り方

2018年10月12日

ヤマレコ代表のmatoyanです。こんにちは!

ヤマレコの登山地図アプリ「ヤマレコMAP」のiOS/Androidの最新バージョンでは、コースタイムの表示機能に対応しました。
今回はこのコースタイム表示機能をどうやって作っているのかを紹介したいと思います。

まずコースタイムを表示するには「コース」が必要になります。
こちらはヤマレコの社内だけで使える、コースの整備ツールを開発して使っています。

最初に白い丸のポイントを作ってから、地図上をポチポチとマウスでクリックして白丸をつなぐように線を引いていきます。
この辺の裏話については「らくルート」の紹介記事もご覧になってみてください。

コースが出来上がったあと、そのコースの内容を確認すると自動で計算したコースタイムが表示されます。

実際に掛かる時間がこの計算したコースタイムと大きくズレる箇所では、手動でコースタイムの補正を行っています。こんな感じでコースとコースタイムをデータとして保存していきます。
この「コース」というのは、保存するデータの形式でいうと「緯度・経度」の点の集合になります。コースに国土地理院の標高データを合わせて保存しておき、傾斜や道の種類、距離などを考慮して独自のアルゴリズムでコースタイムを計算しています。

データの格納方法としては、PostgreSQLというオープンソースのデータベースの拡張機能の一つであるPostGISを活用しています。PostGISにGeometryという位置情報を格納するための特殊な形式でデータを入れておき、pgRoutingという拡張機能を使うことで、コスト(コースタイムや距離など)が一番小さくなるルートを自動で探してくれます。このpgRoutingはダイクストラ法を始めとしたいわゆる最短経路探索のアルゴリズムがあらかじめ準備されているので、どのアルゴリズムを使うかを選ぶだけでコストが最短になる経路を探索してくれます。「らくルート」の線を引く機能はこのpgRoutingのルーティング機能と連携して作ってあります。

さて、アプリ上にコースタイムを表示する機能についてですが、ルートに対して誤読をしないように適切な位置に表示する必要があります。
いわゆる紙の地図の場合は、人手でコースタイムの表示位置を調整することになりますが、日本全国をカバーする膨大なデータに対して少人数のヤマレコのスタッフで微調整をするのは現実的ではありません。
そのため自動で表示する位置を計算して求めることにしています。

まずコースを双方向に歩く前提で考えたときに、どちらに歩いてもコースタイムが同じ場合。
こちらは簡単です。コースの中心(50%)の位置にそのまま数字だけを表示します。

問題は登りと下りでコースタイムが違う場合です。この場合はコースタイムがどちら側がどのコースタイムなのか、視覚的に理解できる位置に表示してあげる必要があります。
表示位置としては、最初から20%の位置に順方向、最初から80%の位置に逆方向のコースタイムを表示することにしたので、その緯度経度を求めることで表示位置を確定させることが出来ます。

実際は「順方向」はコースをポチポチとクリックして作った方向でしかないので、右から左の場合もあるし、左から右の場合も、上から下の場合も、下から上の場合もあります。
そこで例えば20%の位置に表示するコースの場合は、その前後15%と25%の位置にある座標を求めて、その角度を求めます。

数学でいう逆正接(アークタンジェント)を求めることで角度を導けるのですが、この計算はプログラム言語にatan2という関数があり簡単に求めることが出来ます。
ここで求めた角度を考慮して文字を回転して表示してあげると、その場所の道の方向に沿ってコースタイムを表示できるようになります。

ただし回転角が大きすぎると文字が逆転してしまうので、文字の上下が逆転しないように-90度から90度までの間になるように回転角を調整する必要があります。
またその回転角に応じて、コースタイムの左右に表示している「>」や「<」の記号を文字の右につけるのか左につけるのかを計算して決定します。

ここまでの処理がひと通り終わると、コースタイムの座標・回転角・文字(<>の記号の位置)が確定するので、やっと地図上に表示することが出来ます。

このような処理を「らくルート」で整備しているすべてのコースに対して事前に行っておき、その情報に基づいてアプリ上でコースタイムを表示することで、大量のコースタイムのデータをアプリ上で誤読しないように表示できるようになっています。

あと最後に、分岐が多くてコースの区切りが短い場所では、タイムがゴチャゴチャに表示されて見にくい場合があります。
タイムを見たい場合は地図を2本指で広げる操作をして拡大して見ていただき、タイムを見たくない場合はストップウォッチのボタンを押して非表示にして使ってみてください。

いまはこのコースタイムを使って、登山中にもっとわかりやすく表示できる方法を検討しています。
近日公開できればと考えていますので、また公開したあとに裏話をこの場で紹介できればと思います。楽しみにお待ち下さい!

by matoyan

Share on Facebook0Tweet about this on Twitter

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です