ルート前後検索の実装方法
乗換検索で経路を調べる際に、もう1本後だと何時出発で何時に着くか、確認したくなるときがあります。 そんなときに便利なのが、調べた経路の前後の検索ができる機能です。
▲ナビタイムジャパンの個人ユーザー向けWebサービスの乗換検索結果の機能例
ここでは「ルート前後検索(/route_slide)」APIを使って前後の検索機能を実装する方法をご紹介いたします。
※「ルート前後検索(/route_slide)」のご利用は、オプションの時刻表データ利用の契約が前提となります。
事前準備
まずは「ルート検索(トータルナビ)(/route_transit)」APIを使って、元になるルートを検索し、必要な情報を抽出します。
1. ルートを検索します
リクエスト例(表参道〜登戸、2020年07月30日8:00出発)
/route_transit?start=00007820&goal=00006541&start_time=2020-07-30T08:00:00&train_data=timetable
抽出する情報
- ルート前後検索の対象となる出発ノード、列車ID
- ルート前後検索の対象となる出発時間 ※時刻表の出発時間
- 基準経路(元の経路の対象区間)
- 公共交通を利用する全ての区間(transportオブジェクトがあるsection)を指定
公共交通を利用する区間の出発ノード及び出発時間を抽出してください。
徒歩や自転車等の出発ノード及び出発時間を抽出すると、適切なルート前後検索を行うことができません。
実際のレスポンス例
{
"items": [
{
"summary": {
// 一部省略
},
"sections": [
{
"type": "point",
"coord": {
"lat": 35.665777,
"lon": 139.711294
},
"name": "表参道",
"node_id": "00007820", // ← ① 対象となる出発ノード
"node_types": [
"station"
],
"start_platform": "1番ホーム",
"numbering": {
// 一部省略
}
},
{
"next_transit": true,
"transport": {
"fare": {
// 一部省略
},
"color": "#00BB85",
"destination": {
"name": "代々木上原",
"id": "00005508"
},
"type": "普通",
"fare_break": {
"unit_0": true,
"unit_48": true,
"unit_128": true,
"unit_130": true,
"unit_133": true,
"unit_136": true,
"unit_138": true,
"unit_141": true
},
"getoff": "前・中・後",
"name": "東京メトロ千代田線",
"fare_season": "normal",
"self_id": "008501cc", // ← ② 対象となる列車ID
"company": {
"id": "00000113",
"name": "東京地下鉄(メトロ)"
},
"links": [
{
"id": "00000769", // ← ③-1 基準経路の路線ID
"name": "東京メトロ千代田線",
"direction": "up", // ③-2 基準経路の方向
"destination": {
"name": "代々木上原",
"id": "00005508"
},
"from": {
"name": "表参道",
"id": "00007820" // ← ③-3 基準経路の出発駅ID
},
"to": {
"name": "代々木上原",
"id": "00005508" // ← ③-4 基準経路の到着駅ID
},
"is_timetable": "true" // ← is_timetabeleがtrueであれば1本前後検索が可能ということを示す
}
],
"id": "00000566",
"train_id": "A727S",
"fare_detail": [
// 一部省略
]
},
"type": "move",
"move": "local_train",
"from_time": "2020-07-30T08:01:00+09:00", // ← ④ 出発時間
"to_time": "2020-07-30T08:07:00+09:00",
"time": 6,
"distance": 3100,
"line_name": "東京メトロ千代田線",
"transfer_seconds": 60
},
{
"type": "point",
"coord": {
"lat": 35.66898,
"lon": 139.679598
},
"name": "代々木上原",
"node_id": "00005508",
"node_types": [
"station"
],
"start_platform": "1・2番ホーム",
"goal_platform": "2番ホーム",
"numbering": {
// 一部省略
}
},
{
"transport": {
"fare": {
// 一部省略
},
"color": "#3CB9FB",
"destination": {
"name": "小田原",
"id": "00003742"
},
"type": "急行",
"fare_break": {
"unit_0": true,
"unit_48": true,
"unit_128": true,
"unit_130": true,
"unit_133": true,
"unit_136": true,
"unit_138": true,
"unit_141": true
},
"name": "小田急小田原線急行",
"fare_season": "normal",
"self_id": "820600d5",
"company": {
"id": "00000073",
"name": "小田急電鉄"
},
"links": [
{
"id": "00000686", // ← ➄-1 基準経路の路線ID
"name": "小田急小田原線",
"direction": "down", // ← ➄-2 基準経路の方向
"destination": {
"name": "小田原",
"id": "00003742"
},
"from": {
"name": "代々木上原",
"id": "00005508" // ← ➄-3 基準経路の出発駅ID
},
"to": {
"name": "登戸",
"id": "00006541" // ← ➄-4 基準経路の到着駅ID
},
"is_timetable": "true"
}
],
"id": "00002859",
"train_id": "1221",
"fare_detail": [
// 一部省略
]
},
"type": "move",
"move": "local_train",
"from_time": "2020-07-30T08:09:00+09:00",
"to_time": "2020-07-30T08:23:00+09:00",
"time": 14,
"distance": 11700,
"line_name": "小田急小田原線急行"
},
{
"type": "point",
"coord": {
"lat": 35.621018,
"lon": 139.56943
},
"name": "登戸",
"node_id": "00006541", // ← ⑥ 到着ノード
"node_types": [
"station"
],
"goal_platform": "1・2番ホーム",
"numbering": {
// 一部省略
}
}
]
},
ルート前後検索にリクエストする
事前準備で抽出した情報を、以下のパラメータに指定して、ルート前後検索を行います。
- ①:対象となる出発ノード → start_node、start
- ②:対象となる列車ID → train_id
- ③-1:基準経路の路線ID → basis_routeのlink
- ③-2:基準経路の方向 → basis_routeのdirection
- ③-3:基準経路の出発駅ID → basis_routeのstart
- ③-4:基準経路の到着駅ID → basis_routeのgoal
- ④:出発時間 → start_time
- ⑤-1~4 については、③-1~4 と一緒にbasis_routeに指定
- ⑥:到着ノード → goal
リクエスト例(対象経路の3本後までを出力)
/route_slide?start=00007820&goal=00006541&start_time=2020-07-30T08:01:00&start_node=00007820&train_id=008501cc&range=3&basis_route=[{"start":"00007820","goal":"00005508","link":"00000769","direction":"up"},{"start":"00005508","goal":"00006541","link":"00000686","direction":"down"}]
まとめ
サービスを利用される方の利便性向上に是非活用してみてください。