NAVITIME_Tech NAVITIME_Tech
見出し画像

乗り鉄の開発者が欲しいものを作りました。『NAVITIME』オリジナルルート作成機能

こんにちは、揚げ銀杏です。
ナビタイムジャパンでiOS版『NAVITIME』アプリの開発を担当しています。

『NAVITIME』アプリでは先日、ヘビーユーザー向けに提供している「プレミアムプラスコース」に以下の新機能を追加しました。

  • 経由地の設定可能数を最大8箇所までに拡大

  • 多数の地点を効率的に巡回するルートが検索できる「巡回経路検索」機能

  • 自分だけのルートが作れる「オリジナルルート作成」機能

この中でも「オリジナルルート作成」機能は、既に決まっている移動経路の乗換時間が知りたい方や、特定の列車・路線に乗りたい鉄道好きの方など、移動する際の経路にこだわりがある方のニーズにお応えする機能として開発したものです。

今回は、この機能を開発した経緯や、どのような点にこだわって作ったのかについてお話ししていきたいと思います。

なぜ作ったのか

私は鉄道旅行・乗りつぶしが趣味で、日本各地の様々な路線に乗るためによく出かけています。旅先での移動には『NAVITIME』をフル活用していますが、このような場面でアプリの改善点や新機能のアイデアが浮かぶことはよくあります。

2023年の夏、私は奥羽本線の普通列車で秋田から山形に向かっていました。この時は行き先を特に決めていなかったので、新庄から陸羽東線に乗ろうか、そのまま山形まで南下しようか、時間があるならどこか寄れるところはないか、電車に乗りながら考えていました。

『NAVITIME』を開いて、時刻表を何度も行ったり来たりしながらルートを検討するのですが、いくつか出てきた乗り継ぎの候補をどこかに控えておかなければなりません。メモアプリや紙媒体に転記するのは手間ですし、頭で覚えておくのも大変です。
時刻表検索で辿った乗り継ぎがそのまま見られれば便利じゃないか、そんな機能が欲しいなと思いついたのがこの時でした。

通常のルート検索との違い

出発地と目的地を入力し、出発時刻や移動手段を設定して検索ボタンを押す、というのが通常のルート検索です。
何通りもある目的地までの行き方の中から、経路探索エンジンは所要時間や運賃、乗換回数などのバランスを考慮してルートを探索します。

ルートの途中でどんなところを通るのかは、入力された検索条件や時刻によって変わります。なぜなら、経路探索は「この場所に行きたい」というニーズに応える目的で作られているからです。

しかし、目的地まで効率的に行ければ、そこまでのルートはなんでも良いという移動ばかりではありません。鉄道旅行のように移動自体が目的となる場合はもちろん、いつもの移動経路で途中どこかに立ち寄るとか、この駅の乗り換えだけ余裕を持たせたいといった、移動中に目的やこだわりがある場合に求められるのは、通常のルート検索結果とは異なります。

画像

思った通りの経路を出すために経由地や滞在時間を設定して試行錯誤するのには工夫が必要ですし、そもそも移動経路は決まっているのですから、知りたいのは乗り継ぎと時間だけです。
このような用途においては、経路探索とは違ったアプローチが必要になります。

どうやって作ったのか

時刻表を辿ればルートになる

前述のような、移動経路にこだわりのあるルートはどう作るのか。既に多くの方が実践されている手法があります。
そうです、時刻表を辿る操作です。

冊子の時刻表であれば、乗りたい列車の時刻を順に追っていく動きになりますし、アプリの時刻表であれば列車を選択し、停車駅の一覧から降りる駅を選ぶ操作を繰り返すことになります。
こうして時刻表を辿っていくと「駅 → 列車 → 駅 → 列車…」の並びが得られます。これは移動経路そのものです。

しかも時刻表検索で表示される内容には、乗車区間・発着時刻・乗車便の名前や行き先といった、ルート検索結果を表示するのに最低限必要な情報が揃っています。つまり、時刻表から列車を指定していくだけで乗り換え経路を構築することが可能というわけです。

画像
青春18きっぷ利用時に、本数が少ない区間で1駅だけ新幹線や特急に乗るテクニック。
このような、通常のルート検索では出すのが難しいルートも作成できます。

シンプルに、そして自由に

「オリジナルルート作成」機能を開発するに当たって大切にしたのは、特別な操作をしなくても好きなルートが作れるUIにすることです。
移動経路の入力方法は従来からある時刻表検索の操作そのものですし、最終的に表示されるルートも、通常のルート検索結果画面に寄せた見た目としています。
初めからルートを作りたい、乗り継ぎ全体を見たいと思っているケースばかりではなく、どんな移動をしようか考えているうちに複雑な経路になってしまうこともありますので、時刻表検索の画面には辿ってきた乗り継ぎを表示できるボタンを配置し、そこからルートを見られるようにしました。

作成できるルートについても可能な限り制約を少なくし、自由度の高い機能とすることを目指しています。
例えば、乗り換え駅への到着時刻が10時だとしても、乗り継ぎ先の時刻表では9時に発車する便を選択することができてしまいますが、この状態でも経路入力を進められるようにしています。途中でもっと前の便に変えたくなった時でも、一からやり直すことなくルート作成を継続し、最後に区間ごとの変更ができるようにするためです。

画像
発着時刻が逆転している駅には警告が表示されます。
このような場合でも、あとから区間ごとに便を変更することが可能です。

また、隣接した駅などの路線を選択できる「近くの路線選択」機能により表示した時刻表もルートに追加することが可能です。この場合、駅の間に徒歩移動区間が入ります。こちらも同様に、必要な移動時間を下回る乗り換えが設定可能になりますが、入力の自由度を優先するため許容しています。
※実際に移動する際は、十分な乗り換え時間があるかどうかを確認してご利用ください

地味に苦労したポイント

「オリジナルルート作成」機能では、通常の時刻表検索と変わらない操作性で思い通りのルートを作れるようにしています。そのため、画面遷移がそのまま入力操作になるというのが大きな特徴です。
時刻表から乗車区間と便を選択して経路を構築するというロジック自体は比較的単純なのですが、画面遷移の状態と構築した経路の整合性が保たれるようにするのが思いの外大変でした。

各画面で路線や駅を選択した際は、それらの確定した情報を経路に追加していきます。逆に前の画面に戻った際は、その時点で確定していた情報だけが残るように経路を戻す必要があります。画面の移動は前後に1つずつとは限らず、OSの機能で遷移してきた画面をまとめて戻すこともできるため、どの画面まで戻ってきたのかを確実に検知する機構なども実装しました。

終わりに

人が移動に求めるものは様々で、それは同じ人でも目的や状況によって変わります。これまでも『NAVITIME』では多くの移動手段、多様な移動シーンに対応する経路検索サービスを提供してきましたが、今回新しくリリースした「オリジナルルート作成」機能により、さらに幅広い移動ニーズをカバーすることができるようになりました。

『NAVITIME』プレミアムプラスコースでは、今後もヘビーユーザーの方が移動に求めるこだわりに特化した様々な機能を提供してまいります。ご期待ください!

ピックアップされています

エンジニア系記事まとめ

  • 443本
乗り鉄の開発者が欲しいものを作りました。『NAVITIME』オリジナルルート作成機能|NAVITIME_Tech
word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word

mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1