マップマッチング技術をAPI化した話
皆さん初めまして、物欲MAXと申します。
ナビタイムジャパンにて、NAVITIME APIの開発 / 運用を行っています。
本日は、NAVITIME APIから最近リリースされました「マップマッチングAPI」についてご紹介します。
マップマッチングって?
ご存知の方も多いかもしれませんが、はじめにマップマッチング技術について簡単にご説明いたします。
マップマッチングとは、GPSなどから取得した緯度経度情報を道路情報(リンク)と比較し、どこにいるのか、どこを通ったのかを補完する技術になります。
GPSなどは周囲の環境によっては位置が大きくずれてしまうことが多々あります。マップマッチング技術があることで、カーナビなどで正確に自分の位置を示すことができるのです。
なぜマップマッチング技術をAPI化したの?
一般的にマップマッチング技術は、ナビゲーションサービスにて自位置の補正として使われています。
つまり「移動中(リアルタイム)」の活用が主でした。
しかし昨今では、「ビッグデータ」や「MaaS」などの分野において、「移動後」に、走行した様子を振り返ったり、走行データから分析を行うことが増えてきました。
こうした際には、マップマッチング技術を単体で使用したいというニーズが多いため、APIにすることでマップマッチング技術のみを簡単に提供できると考えました。
ナビタイムのマップマッチングAPIってどんなもの?
今回作成したマップマッチングAPIは、走行データ(=GPSで取得した緯度経度の点列)をリクエストとして受け取り、マップマッチング結果の配列をレスポンスとして返却するシンプルなAPIになります。
マップマッチング技術については、ナビタイムジャパンがこれまでGPS搭載のモバイル向けカーナビサービス等で培ってきたコア技術を活用しているため、高精度の位置補正を実現しています。
ここからは、マップマッチングAPIをリクエストとレスポンスに分けて詳しくご紹介します。
①リクエスト
緯度経度の点列という、比較的多くのデータを一度に送信するためPOSTでリクエストするAPIとなっていますが、
送信データのフォーマットをJSON形式とCSV形式から選ぶことができるように設計しました。これにより利用者は、パスやクエリを都度変更することなく、送信データのフォーマットを自由に変更することができます。
さらに、CSV形式で送信する場合は、文字列として送信できるほか、ファイルで送信することもできるようになっています。こちらももちろん、リクエストパラメータなどを変える必要はありません。
さまざまなパターンのリクエスト方法を用意することで、幅広い方に使っていただけるものと考えました。
またこのAPIは、1リクエストあたり最大1000地点まで送信することが可能です。処理上どうしてもfor文を使う部分が出てきますが、バリデーション方法や各処理の実施タイミングを整理することで、パフォーマンスを落とすことなく実現することができました。
②レスポンス
続いてレスポンスについてです。
なんといってもレスポンスの特徴は、リクエストの送信データと同じフォーマットでレスポンスが返却される点です。レスポンスの形式は、リクエストと同じもので受け取りたいというパターンがほとんどなので、自動で判定する仕組みにしました。
リクエストで送信されたデータフォーマットがJSONなのかCSVなのか内部で判断し、フラグを保持しています。このフラグをレスポンスを生成する際に参照し、対応するフォーマットの処理を行う流れになっています。
// 言語はPython
// request_formatフラグを見て処理を振り分け
if request_format == 'csv':
return utils.MultipartFormDataResponse(create_response_csv(...))
elif request_format == 'json':
return utils.JsonResponse(create_response_json(...))
実際のレスポンス例はこのような形です。こちらはJSON形式のレスポンス例になります。これらが1オブジェクトとなり、配列で返却されます。
マッチング前後の緯度経度に加え、マッチングした道路の情報を返却しています("road_info"オブジェクト、現在は最高速度情報と一時停止線情報を利用可能)。
後で自分の走行記録を見返す際の地図表示など道路状況を可視化したり、一時停止線付近の走行の様子を分析することなどにご活用いただけると考えています。
まとめ
いかがでしたでしょうか。
少しでもAPIの工夫を感じていただけましたら幸いです。WEBで仕様書を公開していますので、こちらもぜひご覧ください。
まだまだ出来立てのAPIですので、これからさまざまなブラッシュアップを続けてより良いものにしていく予定です。(年明けにもアップデートを予定しています!!)
ご興味があればぜひご利用ください!