HERE Geocoding & Search API と SORACOM GPSマルチユニットと SORACOM Beam と Node-RED と LINE Notify で、とっさに周辺の公園を検索するファミリーテックアプリを試作したメモです。
HERE Advent Calendar 2022 の 12 日目の記事です。
背景
休日は、家族で自転車や電車で大きな公園に繰り出して遊んだりするのですが、息子が1 つの公園では満足しきれず「ほかの公園はー(圧)」と言って、息子から私に替え公園(ラーメンの替え玉的ニュアンス)を依頼されることがあります。
知っている場所ならいいのですが、やはり遠出をしていると、土地勘がないので「うおお、息子の希望に答えねば!」と、めっちゃ焦ります。
そういうとき、とっさに周辺の公園情報を直近 3 件とかですぐに調べられるような仕組みを作れないか考えてみたのが、今回の記事です。
GPSマルチユニットSORACOM Edition(バッテリー内蔵タイプ)というデバイスは GPS とマルチセンサのデータを計測して SORACOM Beam というサービスを使って、任意の場所にデータを送ってくれます。
このように動きます
GPSマルチユニットSORACOM Edition は、このようにボタンプッシュで現在の位置情報を送ることができます。もちろん、定期実行もすることができますが、今回は明確なボタンプッシュを使うほうに注目します。
そして SORACOM の SORACOM Beam というサービスを使って任意の場所にデータを送る先を、今回は Node-RED サーバーにしています。
その Node-RED でデータをこねこねして、LINE Notify にまわりの公園情報を直近 3 件でお知らせするようにしています。これは家のめっちゃ近くで、やってみたので、ぼかしで伏せていますがちゃんと動いています。
HERE Geocoding & Search API の準備
地図 位置情報サービス HERE 無料アカウント有効化手順 – Qiita
とても分かりやすいこちらの記事でアカウント登録をしました。
登録完了。
サブスクリプションも済ませました。
API キーを作成して Geocoding & Search API にアクセスできるようになりました。
SORACOM の設定
SORACOM では SORACOM GPSマルチユニットと SORACOM Beam の設定をします。
- Getting Started: センサーデータを SORACOM Beam でサーバーに転送する | GPS マルチユニット SORACOM Edition ユーザーガイド | ソラコムユーザーサイト – SORACOM Users
- Getting Started: GPS マルチユニットからデータを送信する | GPS マルチユニット SORACOM Edition ユーザーガイド | ソラコムユーザーサイト – SORACOM Users
こちらの記事を元に、以下のように SORACOM Beam を設定しました。
このあと準備する Node-RED のサーバーへの転送先へ向けてデータを送った設定です。
Node-RED の準備
Node-RED のサーバーは Azure の VM に立てています。
こちらのフローはこのような流れです。
前半のフローで SORACOM GPSマルチユニットから POST リクエストでもらった後は、センサーの中身が Base64 なので変換をかけます。
こちらの function ノードで JavaScript で書いていて、
msg.payload = JSON.parse(new Buffer(msg.payload.payload, 'base64').toString()); return msg;
このように変換してます。愚直な Buffer クラスでの変換です。
変換すると、センサー値や lat lon で位置情報が取得できます。
後半のフローです。位置情報が null で来る場合があるのでチェックをしつつ、最後の緑色の Notify というのが LINE Notify ノードです。 LINE Notify のアクセストークンを設定してあります。
HERE API 設定という名前のデータを設定する change ノードで API につながる設定をしていて、http request ノードと書かれているノードで実際に HERE Geocoding & Search API に接続しています。
HERE API 設定という名前のデータを設定する change ノード の前半の設定です。 msg.url で API の問い合わせ先であったり msg.apiKey で HERE 側で取得した API キーを準備しています。あとは msg.payload に SORACOM Beam からきた位置情報やセンサーデータが入っているので、このあとの HERE API に送るデータで上書きしないよう msg.payloadGPSUnit に移動して避難させています。
後半の設定は、実際に API に送るデータです。
- msg.payload.at
- msg.payloadGPSUnit にある実際の位置情報をカンマ区切りで設定しています
- msg.payload.q
- 検索するクエリで今回は「公園」にしています
http request ノードの設定です。
さきほど msg.payload にぶらさげたデータをクエリパラメータとして使います。
http request ノードでは msg.payload をクエリパラメータに追加をチェックしておくと、msg.payload にぶらさげたデータをクエリパラメータとして使えます。
これで Node-RED の設定は完了です。
余談:公園検索は英語名より日本語名での検索で精度が上がった
実はクエリは当初 playgroud という英語で調べていたのですが、英語名の訳がある?の遠くの公園や英語を含めたお店の名称が引っ張られすぎて、思うような結果にならなりませんでした。
ただ、ピンと来て日本語で「公園」にしたら意図通りの結果ができてうれしかったです。
一応、英語でも park は良い感じに出るときもありましたが「公園」やはり一番いいかんじでした。
このあたりのチューニングは楽しいですね。
動かしてみる
これで、準備は完了です!
これを、ちょうど東中野の某所でボタンを押してみました。
無事、周辺の公園が良い感じに表示されました!これだけでもだいたいの目星がつくので、あとは詳細の情報を別途調べて補強すれば、実際に息子の「ほかの公園はー(圧)」にも対応できそうな気がします!
また、位置情報がうまく取れない時や、周辺に公園がないときが、うまく情報なしメッセージが出ました。
やってみて
HERE Geocoding & Search API すごいですね、ちゃんとクエリが合えば意図通り公園情報が出てくれましたし、距離情報も取得しやすくて使いやすかったです。アカウント登録や API キーも難しいことなく取得でき、すぐ使えました。
HERE さんのグローバルな位置情報・地図データサービスで、かつ、日本にも進出していて、日本にも得意そうな位置情報の API だったので SORACOM GPSマルチユニットのような IoT デバイスとつなげてみたかったですし、位置情報 API としっかりつなげてプロトタイピングしてみたかったのが、うまくできました。
ほかにも、面白そうな API が HERE さんにはありそうなので、また試してみます!