HERE-APIを使ってQGISでルートマッチングができるプラグインを開発しました

![mov.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73197/d35f0a03-32ec-64b8-1872-9e3502c3b996.gif)


## はじめに

GIS技術においては、GPS測定値をはじめとした一連の経緯度情報を、道路などに「フィットさせる」処理というものがあり、`map matching`だとか`route matching`などと呼ばれます。

![スクリーンショット 2022-07-06 18.20.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73197/f2683318-8ad0-0767-07fb-ad978043f8f6.png)


最も単純には、ある点があったとしてその最近傍の地物に寄せるという処理になります。しかし下図のとおり、これだけでは「適切な経路」にはなり得ません。一連の点の順序や誤差を考慮したマッチングが必要です。

![スクリーンショット 2022-07-06 18.25.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73197/a65bee18-f8f4-c4a9-b32a-c407b172d84b.png)


この問題に対応するには経路検索技術が必要です。調べると[自前で経路検索サーバーを立てる方法](https://towardsdatascience.com/map-matching-done-right-using-valhallas-meili-f635ebd17053)が出てきたりしますが、これは一般のGISユーザーにとって（あるいは技術者であっても）容易ではありません。一方この処理は「一連の点を入力として、もっともらしい線分を返す処理」と言い換えることができ、これをWebAPIで提供しているサービスは複数あります。

- [HERE Route Matching](https://developer.here.com/documentation/route-matching/dev_guide/index.html)
- [Mapbox Map Matching](https://docs.mapbox.com/api/navigation/map-matching/)
- [いつもNAVI](https://support.e-map.ne.jp/manuals/v3/?q=road_path_drive_api_man)

今回、QGISプラグイン開発を得意とする弊社で、こういったサービスを用いてQGIS上でルートマッチングを実現するプラグインを開発しました。その際もちいるサービスは、経路検索に最も強いと思われる（後述）HEREのAPIを採用しました。本記事ではAPIの技術情報やプラグインの使い方を紹介します。

## HEREのAPIについて

HEREは位置情報に関する一般的なAPI、たとえば背景地図配信・ジオコーディング・経路検索など…これら全てを取り揃えています。また、経路検索（Routing）という括りだけでも以下の5つのAPIが存在します（2022年7月現在、deprecatedの2つを除く）。

- HERE Routing API v8 (経路検索)
- HERE Isoline Routing API v8 (到達圏)
- HERE Matrix Routing API v8 (多数の出発地・目的地からなる行列の経路検索)
- **HERE Route Matching v8**
- HERE Waypoints Sequence v8 (多数の地点に対し最適な訪問順を求める、巡回セールスマン問題)

種類だけでいえば、[Mapbox](https://docs.mapbox.com/api/navigation/directions/)も同等のAPI群を提供しています。しかしHEREの経路検索は、リアルタイムの信号の状況や、トラックが通行できるルートに限定した検索、はたまたEV（電気自動車）向けに充電状況を考慮するなど、極めて高機能といえます（なおMapboxも[EV対応](https://docs.mapbox.com/api/navigation/directions/#electric-vehicle-routing)は進んでいる模様）。とりわけ運送業、いわゆるロジスティクス向けにフォーカスした機能が多いように見受けられます。

今回開発したプラグインには**HERE Route Matching v8**との連携機能が実装されています。他のAPIもニーズがあったら追加していく方針です。

## HERE Route API Plugin

https://github.com/MIERUNE/qgis-here-api-plugin

プラグインの使用には、事前にQGISをインストールしておく必要があります。3.x系であれば特にバージョンの指定などはありませんが、よっぽど古いと動作しないことがあり得ますので、直近のLTRを推奨します。

### 使い方

#### インストール

1. プラグインの管理とインストールを開く
![スクリーンショット 2022-07-08 9.35.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73197/e39a032b-8912-9076-a164-7b2f0ecdf066.png)
1. 一覧から`HERE Route API Plugin`を選択し、インストール
![スクリーンショット 2022-07-08 9.35.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73197/e3c8684c-ebd5-b870-da3a-f65589b0bfc3.png)
1. メニューバーの「プラグイン」に`HERE Route API Plugin`が追加されていることを確認
![スクリーンショット 2022-07-08 9.36.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73197/9b7c72e6-c2ae-0fb9-4edd-ca81b2683224.png)


#### APIキーの設定

1. [HERE Platform](https://platform.here.com/)でAPIキーを発行
1. メニューバーから「プラグイン」「HERE Route API Plugin」「Config」を開き、APIキーを入力し「OK」をクリック
![スクリーンショット 2022-07-06 18.29.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73197/414f7eb8-cd3b-1eea-bb9b-5cc33ceb9e74.png)
![スクリーンショット 2022-07-06 18.29.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73197/9baede90-9974-a7b6-29c3-e40c3350f7a4.png)


#### Route Matching

![スクリーンショット 2022-07-06 21.03.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73197/9bc63987-624c-22a1-155c-830eb519dfb2.png)

本プラグインのルートマッチングは「任意の点レイヤーを入力とし、もっともらしい線分を線レイヤーとして出力」という処理を行います。したがって、何らかの点レイヤーが存在することを前提とします（なお地物数は1万未満とします）。以下の説明では上記の画像のポイントレイヤーを用います。また、APIが一度に受け取れるポイントの数が概ね400個程度なので、これを上回るレイヤーの場合はリクエストを分割します。具体的には、一度リクエストで400個ずつルートを計算し、すべての処理結果をひとつに結合します。メニューバーから「プラグイン」「HERE Route API Plugin」「Route Matching」を開きます。

![スクリーンショット 2022-07-06 21.07.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73197/67fec6b7-8caa-0cc5-ea73-c7ff0b87eb03.png)

1. Layerで処理対象の点レイヤーを選択する
1. Sort Fieldで順序を示す属性を選択する（オプション項目、空欄の場合は`fid(地物の登録順)`が用いられる）
1. Modeで、車(car)バス(bus)自転車(bicycle)歩き(pedestrian)からいずれかを選択
1. OKをクリックし処理を実行する
1. 完了後、処理結果が表示される

![スクリーンショット 2022-07-06 21.06.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73197/2a96d9b8-9769-bac4-e977-82bb9d38d327.png)

ある程度の誤差を許容しながら、最もそれらしいルートが表示されていることがわかります。

![スクリーンショット 2022-07-06 21.08.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73197/3e609960-90f3-785c-3140-aa622faef64b.png)

## おわりに

実はRoute Matching APIにはプラグインでは扱いきれていない非常に多くの計算パラメータが存在し、その中から汎用的な引数のみを採用しています。すべてを使いこなすのは難しいですが、それだけ高機能で多様なユースケースをサポートしていると言えます。今回のプラグインでカバーしているのはそのほんの一部ですが、ぜひ使ってみてください！