ジオコーディングとは
住所などのキーワードから緯度・経度を求めることをジオコーディングといます。PowerAppsでは標準でBingMapsでジオコーディングできますが日本語への対応はいまいちです。そこで、無料で使えるジオコーディングサービスGeocoding.jp API をPowerAutomateクラウドフローで試してみました。
※PowerAutomate クラウドフローでHTTPコネクタを使用、Power Appsで対話型マップコントロールを仕様するためPower Automate Premium等の単体ライセンスが必要になります。
今回の想定
今回のクラウドフローはPowerAppsから呼び出す想定のフローです。
アプリで入力されたキーワードをクラウドフローで検索して緯度・経度を取得し、アプリで地図上に表示します。
- Power Apps:検索キーワードを入力
- Power Apps:キーワードを引数にクラウドフローを呼び出し
- Power Automate:ジオコーディングサービスで緯度経度を取得
- PowerApps:返された緯度・経度を基に地図を表示
動作イメージ
こんな感じで動作させてみました。
動作イメージ pic.twitter.com/mR5klgLbYh
— ささみ@転職活動中 (@sasami_axis) 2024年2月27日
geocoding.jpとは
個人で運営されているジオコーディングのサイトです。
登録なしで使用できます。
「検索の頻度を、10秒に1回程度に抑えてください。」と制限が明記されています。
API仕様
http://www.geocoding.jp/api/?q={query}
認証不要なためとてもシンプルに使えます。
レスポンスはXML形式で下記のような値が返ってきます。
[正常な応答]
<?xml version="1.0" encoding="UTF-8" ?> <result> <version>1.2</version> <address>富士山</address> <coordinate> <lat>35.360625</lat> <lng>138.727363</lng> <lat_dms>35,21,38.25</lat_dms> <lng_dms>138,43,38.508</lng_dms> </coordinate> <open_location_code>8Q7W9P6G+6W</open_location_code> <url>https://www.geocoding.jp/?q=%E5%AF%8C%E5%A3%AB%E5%B1%B1</url> <needs_to_verify>yes</needs_to_verify> <google_maps>静岡県富士宮市北山 富士山</google_maps> </result>
[キーワードに該当する情報が存在しなかった場合]
<?xml version="1.0" encoding="UTF-8" ?> <result> <address>存在しないキーワードの何か</address> <error>001</error> </result>
Power Automate フロー全体図
Power Automate フロー解説
1.[Power Apps] PowerApps (V2)
Power Appsからキーワードを引数として渡すためのトリガーです。
- 入力1
- 文字列
- UserInput
2.[変数]変数を初期化する-Response_XML
Power Appsへ解す値を格納する変数を定義します。初期値として取得できなかった場合に返すXMLを設定します。
- 名前
- Response_XML
- 種類
- 文字列
- 値
-
<?xml version="1.0" encoding="UTF-8" ?> <result> <address>@{triggerBody()['text']}</address> <error>error</error> </result>
-
3.[コントロール]スコープ
エラー処理の為、スコープを配置しています。
3-1.[HTTP]HTTP
APIを呼び出します。
- 方法
- GET
- URI
- https://www.geocoding.jp/api/?q=@{triggerBody()['text']}
3-2.[コントロール]条件-HTTPstatusCode
HTTPアクションから返される状態コードが正常(200)かどうかで分岐します。
- 条件
- @{outputs('HTTP')['statusCode']}
- 次の状態に等しい
- 200
3-3.(はいの場合)[変数]変数の設定
状態コードが正常(200)の場合、HTTPアクションの出力をResponse_XML変数に格納します。
- 名前
- Response_XML
- 値
- @{body('HTTP')}
XML形式のままでは扱いづらいため、json形式に変換します。
実行条件の構成で「失敗しました」にもチェックします。今回のフローはPower Appsから呼び出す想定の為、スコープ内でエラーが発生した場合にも実行されるようにして、PowerApps側でエラーを判断します。
- 入力
-
json(xml(variables('Response_XML')))
-
{ "?xml": { "@version": "1.0", "@encoding": "UTF-8" }, "result": { "version": "1.2", "address": "富士山", "coordinate": { "lat": "35.360625", "lng": "138.727363", "lat_dms": "35,21,38.25", "lng_dms": "138,43,38.508" }, "open_location_code": "8Q7W9P6G+6W", "url": "https://www.geocoding.jp/?q=%E5%AF%8C%E5%A3%AB%E5%B1%B1", "needs_to_verify": "yes", "google_maps": "静岡県富士宮市北山 富士山" } }
5.[PowerApps]PowerApps または Flow に応答する
JSONに変換した結果をPower Appsに返します。
Power Apps アプリ概要
フロー動作確認用の簡易アプリです。
- 使用するコントロール
- Map1の主なプロパティ
- Items
- colMapPins
- ItemAddress
- ”Address”
- ItemName
- "Name"
- ItemLatitudes
- ”Latitude”
- ItemLingitude
- "Longitude"
- Items
- ButtonCanvasの主なプロパティ
- onSelect
-
UpdateContext({ Response:'Geocoding.jpでジオコーディング'.Run(TextInput1.Text) }); IfError(Response, Notify("検索中にエラーが発生しました"),"" ); UpdateContext({ Response_json:ParseJSON(Response.response) }); ClearCollect( colMapPins,{ Name:Text(Response_json.result.google_maps), Latitude:Value(Response_json.result.coordinate.lat), Longitude:Value(Response_json.result.coordinate.lng), Address:Text(Response_json.result.address) } ); If(IsMatch(Response.response,".*error.*"),Notify("キーワードに該当する地点は見つかりませんでした"))
-
- onSelect
参考にしたページ
いつも参考にさせていただいています。ありがとうございます。
さいごに
Geocoding.jp はこれだけのサービスを個人で運用されていることに大感謝です。
「検索の頻度を、10秒に1回程度に抑えてください。」と制限を守って利用しましょう。