乗換検索APIをサービスに組み込んでみた



こんにちは。ナビタイムジャパンの新卒エンジニアです。
ナビタイムジャパンでは、NAVITIMEなどの各種サービスで使われているルート検索等の機能をAPI形式で外部提供しています。

今回は、新卒エンジニアの目線で、乗換検索のAPIを使ってサービスに組み込んでみた際の使い方や注意などをまとめお伝えいたします。皆様の開発の参考になれば幸いです。




ナビタイムの乗換検索APIでできること

ナビタイムでは、出発地から目的地まで、徒歩+公共交通機関を組み合わせて最適な移動経路を検索する「トータルナビ(R)」というコア技術があります。
最寄り駅がどこかを地図上で確認する必要なく、出発地と目的地に地点を指定するだけで検索可能ですが、駅を指定して、駅to駅の乗換検索を行うことも可能です。

はじめて行く訪問先への行き方を調べる、あらかじめ決まった駅を利用する、など利用者側のシーンによらず検索ができるので、どちらも想定される場合に適しています。

関連記事
トータルナビのルート検索で移動を最適化 トータルナビのルート検索で移動を最適化
近年、「MaaS(Mobility as a Service)」という言葉を耳にする機会が増えています。あらゆる移動を1つのサービスとして統合し、移動全体の最適化をはかるという概念のもと、日常の移動や観光の最適化を目的とした実証実験 ... 続きを読む



サービスの特長

開発に活用する上でポイントとなる点は以下が挙げられます。

・徒歩+公共交通機関のトータルナビ検索、駅間の乗換検索が可能
・全国の路線バス、コミュニティバスに100%対応している ※
・専門のデータの部門がいるため、運賃が正確
・サービスの開発サンプル、Tipsが充実している

※2022年9月時点ナビタイムジャパン調べ。保有台数5台未満の路線バス、高速バス、シャトルバス、デマンドバスを除く。路線バス511社、コミュニティバス1193自治体に対応



乗換検索に関連するAPI

様々なAPIがありますが、乗換検索と合わせて活用できそうなAPIは以下の通りです。必要に応じて組み合わせて活用されるとよいかと思います。

最寄り駅・最寄りバス停検索 :指定した緯度経度の最寄り駅・バス停の一覧を取得
駅・バス停名検索 :キーワードや住所など、条件に該当する駅・バス停の一覧を取得
路線検索 :キーワードに合致する路線の一覧を取得
駅出口検索 :駅ID等を指定して駅出口の情報を取得
定期券払い戻し計算 :指定した鉄道区間の定期券払い戻し金額を計算し出力
地図スクリプト取得 :ブラウザ上で動作するタイル地図を制御するJavaScriptファイルを取得



乗換検索APIの仕様書

乗換検索含め、NAVITIME APIの仕様書はWeb上で一般公開されています。
乗換検索を行うには「ルート検索(トータルナビ)」の仕様書をご確認ください。

特長でも触れた通り、開発サンプルやTipsなどが充実しているため、参考にしながら実装ができます。



乗換検索APIの利用開始方法

NAVITIMEの各種APIを使うには、以下の2種類方法があります(2022年12月現在)。

◆APIマーケット「RapidAPI」から直接プランに登録する
◆ナビタイムジャパンに問い合わせる(直販)

いずれも、APIを使うためのキーを取得し、それを使ってリクエストすることで、必要な情報を取得することができます。
RapidAPIでは、500アクセスまで無料のプランがありそれを使ってテスト頂くことが可能です。
また、ナビタイムジャパンの直販では、導入検討目的であれば90日間の無料お試し利用ができます。

個人ではRapidAPIのみ利用可、提供機能に差分がある、など違いがありますので、ご確認ください。

詳細の手順は以下ページに記載がありますので、ご参考にしてください。

関連記事
ナビタイムのルート検索APIを使って開発してみた(インターン基礎編) ナビタイムのルート検索APIを使って開発してみた(インターン基礎編)
ナビタイムジャパンでは、年に数回、エンジニア体験インターンシップを開催しています。今回は、2021年2月に実施した、インターンシップ基礎編での、ルート検索APIを使ったWebアプリケーション開発に関して、開発の流れや、APIを使ってみた ... 続きを読む




PoCなど短期間での利用、月間アクセス数が少ない場合、個人でのご利用の場合


アクセス数が多い、オプション機能の利用を想定、技術サポートや案件のご相談が必要な場合

トライアルボタン



Webサービス上に乗換検索・運賃計算を組み込んでみた

成果物イメージ


乗換検索APIを使った成果物イメージ 乗換検索・運賃計算サイトを作成してみました。
サンプルを参考にして実装したため、数時間で完成させることができました。
文系出身でプログラミング未経験の私が少し躓いてしまった部分を踏まえて、乗り換え検索サイトを作成する際に押さえておきたいポイントを以下にまとめます。

✓ポイント1: /transport_node(駅/バス停名検索)の利用

いきなりroute_transitに検索したい駅名を渡しても駅と駅の乗り換え検索はできません! なぜなら、駅node_idなどの駅に紐づいた項目をパラメータとして渡さなければ駅から駅の検索にならないからです。

    // パラメータ生成
    params = {
        'word': $("#start_name").val() // 検索ワード
    }
    //通信
    $.ajax({
        url: 'https://XXXXXXXXXX/XXXXXXXXX/v1/transport_node?',
        data: params,
        type: 'GET',
        dataType: 'jsonp',
        jsonp: 'callback', // jsonpリクエストのコールバック関数名を上書き(固定)します
        jsonpCallback: 'spotSearch', // callback関数名を固定します(関数名は任意です。デフォルトはランダムな関数名となります)
        contentType: 'application/json; charset=utf-8',
    }).done(searchRoute)

transport_nodeで駅名を検索することで、駅のnode_id即ち駅に紐づいたIDを返却値として受け取ることができます。 そのnode_idをroute_transitのパラメータとして渡すことで駅間の乗り換え検索ができます。

//出発駅のnodeを取得
    let startNodeID = response.items[0].id;
    // パラメータ生成
    routeParams = {
        'start': startNodeID,//出発地

✓ポイント2: 経由駅情報の場所について

出発駅と到着駅は直感的にitemsの中にあるstartとgoalだとすぐにわかりました。しかし、経由駅の特定ができませんでした...
経由駅はレスポンス内のsectionsという項目の中に存在します。itemsの中のsectionsには、徒歩や電車などの移動方法から使用する駅などの乗り換え検索に必要な情報が全て詰まっています。

そのsectionsの中にtypeとnode_typesという項目があります。typeがpointのものは移動方法ではなく移動方法が切り替わる地点を表し、node_typesがstationのものは駅を表します。つまり、「typeがpoint」かつ「node_typesがstation」になっているものが駅となります。

    //結果のリストの1番目を取得
    let item = response.items[0];
    //経由駅取得のために駅名の入っているsectionsを取得
    const sections = item.sections;
    // 経由駅の名称リストを生成
    let stationNameList = [];
    for (let i = 0; i < sections.length; i++) {
        if (i != 0 && i != sections.length - 1) {
            if (sections[i].type == 'point' && sections[i].node_types == 'station') {
                stationNameList.push(sections[i].name);
            }
        }
    }
    // 各名称をレスポンスから取得
    const startName = item.summary.start.name;
    const goalName = item.summary.goal.name;
    let viaName = '';
    if (stationNameList.length == 0) {
        viaName = 'なし'
    } else {
        viaName = stationNameList.join(',');
        console.log(stationNameList.join(','));
    }

✓ポイント3: 地図の表示領域調整

乗り換え検索を行ったのち、shape_transitを利用しなければ地図上ではルート線が表示できません。 そのことは知っていたため、ルート線自体は描画できたのですが、うまく地図の表示範囲内にルート線を収めることができない!という問題に直面しました。
その時に出発から目的地までをちょうど良く地図上に表示してくれる機能があるということを先輩から教わりました。GeoJSONの中にあるbboxという項目があり、これを利用することでルート線を地図の表示領域内に収めることができます。

    // 地図の表示領域の調整
    // bbox から LatLngRect オブジェクトを生成
    const [lng1, lat1, lng2, lat2] = response.bbox;
    const rect = mapscript.util.locationsToLatLngRect([
        new mapscript.value.LatLng(lat1, lng1),
        new mapscript.value.LatLng(lat2, lng2)
    ]);
    // LatLngRectが画面内に収まる位置に移動
    map.moveBasedOnLatLngRect(rect, true);
    map.addGeoJsonFigure(route);

解説が仕様書にありますので、詳しくはこちらをご覧ください。



REST API以外の便利なサービス

ここまで、REST API(JSON形式で必要な情報が取得できるサービス)を使った組み込みの例をご紹介してきましたが、実はこのほかにも、画面付きの「NAVITIME Widget API」というサービスがあります。

REST APIは、画面のUIを自由に設計したい人向けで、NAVITIME Widget APIはあらかじめ決まった画面でも問題なく、開発コストを抑えたい人向けです
機能も限定されているため、要件が合うかどうかも確認いただければと思います。

※RapidAPIでは、「NAVITIME Widget API」の提供はしていません。

※ナビタイムジャパンとの直販でご利用頂く場合、オプション機能扱いとなります。


関連記事
ローコードで交通費計算が実装できる、NAVITIME Widget APIとは? ローコードで交通費計算が実装できる、NAVITIME Widget APIとは?
2021年9月、新サービス「NAVITIME Widget API」の提供を開始しました。これまでなかった「Web画面付きのAPI」です。どんなことが実現できるのか、提供開始の背景など、本ページにてご紹介します。「NAVITIME Widget API」は、 ... 続きを読む





まとめ

ナビタイムの乗換検索APIを使う場合の、利用方法や実装例、ポイントなどをお伝えいたしました。開発未経験者でもサンプルなどを活用し、ポイントを抑えることで扱うことが可能です。
API形式での提供のため、Webサービスのほか、アプリで活用でき、移動を支援するサービスや、交通費の計算システムなど様々な用途で利用頂けます。

乗換検索ができるAPIはいくつかの会社から提供されていますので、実際に試してみて、求めている結果が得られるのか、仕様書やサンプル含めて使い勝手はどうかなどを検証されることをオススメいたします。



PoCなど短期間での利用、月間アクセス数が少ない場合、個人でのご利用の場合


アクセス数が多い、オプション機能の利用を想定、技術サポートや案件のご相談が必要な場合

トライアルボタン



NAVITIME API/SDK 記事編集部イメージ

【この記事の執筆】 NAVITIME API/SDK 記事編集部

株式会社ナビタイムジャパン ソリューション事業

お客様の開発を強力にサポートするAPI/SDKなどのサービスを展開しているソリューション事業部。 サービスのサポートチームや開発担当者が、APIを中心に、その選定方法や使い方など様々な記事をご紹介しています。


NAVITIMECopyright © NAVITIME JAPAN Co., Ltd. All rights reserved.