HEREのAPIをQGISから叩いてみた話

# はじめに
オンラインの地図・位置情報サービスといえばGoogle Maps Platform（旧Google Maps API）やMapboxが有名ですが、ここ数年、日本市場でもHERE Platformが存在感を増しています。

私自身、HEREのサービスは「試しに触れてみた」程度で、業務や自作アプリでの利用経験はありませんでしたが、HERE Advent Calendar 2022 :santa_tone2: を機に再履修したところ、その使いやすさと進化に驚きました。
今回はQGISやPythonと組み合わせながら、HEREの特徴的なAPIについて解説していきます。

# HERE Platformで何ができるの？
HEREは1986年に創業した位置情報技術の老舗企業で（当時の社名はNAVTEQ）、カーナビ用のデジタル地図を核に成長してきた歴史を持ちます。

そのため、位置情報サービス会社の中でも、物流最適化や自動運転向けナビゲーションの領域で頭一つ抜けており、「地図配信」「ルート検索」「ジオコーディング」といった基本的な機能はもちろん、__配送ルートや配車計画の効率化__ 、__車両のリアルタイム追跡__ といった高度な機能を提供しているのが特徴です。（※有料機能あり）

また、昨今のMaaS（Mobility as a Service）の流れに合わせて、__複数の交通手段を組み合わせたルート検索__ への対応も進めています。

これらの機能はREST APIやAndroid / iOS / Flutter SDKとして提供されていますし、HERE Studioというツールを用いて、ノーコードで地図アプリを開発することも可能です。

## HERE Platformの主な機能

以下は代表的な機能の抜粋です。フリーミアムプラン（無料枠のついた従量プラン）でも多くの機能を使えるのが今時のサービスって感じですね。

* [HERE サービス一覧](https://jp.developer.here.com/documentation)：API・SDK・開発ツールの一覧
  * __フリーミアムプラン対応__
    * [HERE Routing API](https://jp.developer.here.com/documentation/routing-api)：経路探索API。移動手段にバスも選択できる。
    * [HERE Route Matching API](https://jp.developer.here.com/documentation/route-matching/dev_guide/index.html)：緯度経度の点列から移動経路を推定し、きれいな線に変換してくれる。
    * [HERE Geocoding & Search API](https://jp.developer.here.com/documentation/geocoding-search-api/dev_guide/index.html)：住所と緯度経度の相互変換、任意の地点の周りにあるPOIの検索など。
    * [HERE Public Transit API](https://jp.developer.here.com/documentation/public-transit/dev_guide/index.html)：公共交通によるルート検索。__日本非対応__ :cry:
    * [HERE Isoline Routing API](https://jp.developer.here.com/documentation/isoline-routing-api/dev_guide/index.html)：任意の地点から○分以内の到達圏を取得できる。__日本非対応__ :cry: 
  * __フリーミアムプラン非対応__
    * [HERE Tour Plannning API](https://jp.developer.here.com/documentation/tour-planning/3.9.0/dev_guide/index.html)：複数の地点を最短・最適に巡回できるルートを検索（巡回セールスマン問題）
* [HERE Studio](https://developer.here.com/products/platform/studio)：ノーコードの地図開発キット。Mapbox Studioに似ている。

## デモサイト
@kekomatさんの記事で、HEREを活用したデモサイトが紹介されていますので併せてご覧ください。

https://qiita.com/kekomat/items/b381f134cd1faf5b156c


# HERE APIをQGISで使ってみる
HEREの機能はREST APIで提供されていますので、Webアプリ開発者なら難なく利用できるでしょう。
HEREとGIS（QGIS, ArcGISなど）の連携についてはまだまだ発展途上ですが、ここ1～2年の間に__QGIS対応の便利なプラグイン__が出始めていますので、いくつか紹介します。

## HERE Route Matching APIで移動軌跡を滑らかにする
札幌で位置情報ソリューションを提供する株式会社MIERUNEさんが、HERE Route Matching APIをQGISから使えるプラグインを作ってくれました。

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

* `QGIS > プラグイン > プラグインの管理とインストール > 「HERE Route API Plugin」`でインストール可能です。

ルートマッチングとは、飛び飛びになっているポイント（緯度経度を表す点）を繋ぎ合わせて、移動経路を推測する技術です。
一般的に、GPSによる測距には数m～数十m程度の誤差がありますので、単に点と点を繋ぐだけでは実際の移動経路を再現できません（⇒ジグザグ状の経路になります）。そこで、道路や交差点のデータと照らし合わせてノイズを除去し、「自然な経路」をたどるように調整する必要があります。そのあたりのさじ加減に、サービス提供事業者の技術力が現れます。

### 初期設定
1. API Keyが無い人は [HERE Platform](https://platform.here.com/)で発行します。
発行方法については @kekomat さんの[こちらの記事](https://qiita.com/kekomat/items/d2e29bac84a27c1ec521)が詳しいです。
2. `QGIS > プラグイン > HERE Routing API Plugin > Config` よりAPI Keyを設定します。

### 使い方

1. ポイントで構成された移動軌跡データを用意します。
今回は筆者が愛用しているランニングログアプリ「Adidas Runnning」からエクスポートしたデータを使用します。 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982659/01c5bbc0-4939-e4fd-7015-1d24bd8ddf09.png)
2. `QGIS > プラグイン > HERE Route API Plugin > Route Matching` でルートマッチング機能を起動します。
3. 移動軌跡のレイヤー、ソート順を記したフィールド、移動手段を選択し、`OK` を押下すると移動軌跡が計算されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982659/120df2fe-28bd-7a0c-ad48-60aeb85e182b.png)

計算結果は新規レイヤーとしてメモリ内に保存され、太い赤線で表示されます。軌跡が道路に沿って綺麗に並ぶようになりましたし、大通りの「どちら側」を走ったのかも分かります。一部、実際と違うコースが判定されている場所（※地図の西端、駒沢陸橋あたり）もありますが、全体的には良い出来栄えです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982659/81cd6b99-cb8c-cc7f-0469-1c76733c8346.png)

別のデータですが、鉄道の高架下で測距精度が落ちているところを綺麗に繋いでくれています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982659/469c6dac-225e-17a6-90d7-a1ecbbc85a84.png)

東京近郊の市街地のデータで試してみた限り、公園などの歩行者専用道路のトレースには弱い印象。神奈川県内の登山コースもNGでした。HEREは国内カーナビソフトのジオテクノロジーズ株式会社（旧称：インクリメントP）と提携するなど、日本市場での機能強化を進めていますが、歩行者向けのナビについては、もう少し伸びしろがありそうです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982659/903cc547-cad7-e753-ad19-9589b0965e2d.png)

## Location Labで「徒歩15分圏」を可視化する
ある地点から一定時間でたどり着ける範囲を、等高線のように示す手法があります（等時間線）。[私のTwitterアカウント](https://twitter.com/ShinagawaJP) でもこのような地図を時々公開し、多くのインプレッションを頂いています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982659/d733da16-fbbd-0013-e2b0-bb3e232c282f.png)

HEREの場合、Isoline Routing APIを使うことで等時間線を描けるのですが、そのAPIをQGISから呼び出せる便利なプラグインが「__Location Lab__」 です。

* `QGIS > プラグイン > プラグインの管理とインストール > 「Location Lab」`でインストール可能です。
* 残念ながら日本国内には非対応。お楽しみは海外旅行の時に！

### 使い方

1. 出発地点を表す任意の点を用意します。ここではドイツのブレーメン中央駅前を起点とします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982659/b596c76f-57bc-e35f-0d24-6c2cd100cea7.png)
2. `QGIS > Location Lab > Catchments`でLocation Labのフロントエンドを呼び出します。
3. 以下のように設定し、`Get Catchments` を押すだけです。
    * API Provider：HERE
    * Key：HEREのAPI Key
    * Select point layer：出発地点のレイヤー
    * Select layer ID field：出発地点を一意に表す項目
（※複数の点を起点とする場合、このIDで各ポリゴンが区別されます）
    * Mode：Car（一般車） / Pedestrian（徒歩） / Truck（大型車）
    * Value and unit：分単位 / メートル単位

ブレーメン中央駅から歩いて15分の範囲が可視化されます。駅前のビジネスホテル街から川を渡り、ブレーメンの音楽隊のあるマルクト広場あたりまでが15分圏内に収まることが分かります。
  * 余談ですが、旧市街の南端 Schnoor地区のレストランで頂いたニシンの塩漬け（Herring）がとても美味でした。いつかまた行きたい。(･ㅅ･)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982659/b89308ea-f195-ecf4-48ee-fad4e4ecd589.png)

# HERE × QGISのさらなる可能性

2022年12月現在、HEREに対応したQGISプラグインはまだまだ少数ですが、国内でオープンソースGISの普及に尽力されているMIERUNEさんが参入したのは朗報と言っていいと思います。「HERE Route API Plugin」がルートマッチング以外のAPIにも対応する日が楽しみです。

また、HERE Platformではほとんどの機能をAPIや各種SDKとして提供していますので、PythonやQtの素養があれば、__痒い所に手が届く、高機能な位置情報プラグイン__ を開発することも夢ではありません。

* __CO2排出量やEVの電力消費を意識した効率的なドライブルート探索__ （HERE Routing API）
* __バスにも対応したルート探索__ （HERE Routing API）
* __任意の地点の近くにあるPOI（店舗や飲食店など）を検索・可視化__ （HERE Geocoding & Search API）
* __雨が降りそうなところを避けたルート探索__ （HERE Routing API + HERE Weather API）

今回は既製のプラグインの紹介にとどまりましたが、ゆくゆくはHERE APIを活用したプラグインの開発や、より踏み込んだAPI活用事例の提供を通じて、HEREのユーザーコミュニティを更に活性化できるといいなぁ･･･と思いました。

:::note warn
PythonからHERE APIを呼び出す方法を書き忘れました。後日別記事として投稿します。
:::