ささみ学習帳 - sasami's study book

ささみ学習帳

Microsoft365 や Power Platform について学んだこと・アイデアのメモ

ジオコーディングサービスGeocoding.jp APIをPower Automate クラウドフローから利用する💎

 

ジオコーディングとは

住所などのキーワードから緯度・経度を求めることをジオコーディングといます。PowerAppsでは標準でBingMapsでジオコーディングできますが日本語への対応はいまいちです。そこで、無料で使えるジオコーディングサービスGeocoding.jp API をPowerAutomateクラウドフローで試してみました。

※PowerAutomate クラウドフローでHTTPコネクタを使用、Power Appsで対話型マップコントロールを仕様するためPower Automate Premium等の単体ライセンスが必要になります。

 

今回の想定

今回のクラウドフローはPowerAppsから呼び出す想定のフローです。

アプリで入力されたキーワードをクラウドフローで検索して緯度・経度を取得し、アプリで地図上に表示します。

  1. Power Apps:検索キーワードを入力
  2. Power Apps:キーワードを引数にクラウドフローを呼び出し
  3. Power Automate:ジオコーディングサービスで緯度経度を取得
  4. PowerApps:返された緯度・経度を基に地図を表示

 

動作イメージ

こんな感じで動作させてみました。

 

geocoding.jpとは

個人で運営されているジオコーディングのサイトです。

登録なしで使用できます。

検索の頻度を、10秒に1回程度に抑えてください。」と制限が明記されています。

www.geocoding.jp

 

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を設定します。

  • 名前
  • 種類
    • 文字列
    • <?xml version="1.0" encoding="UTF-8" ?>
      <result>
      <address>@{triggerBody()['text']}</address>
      <error>error</error>
      </result>

 

3.[コントロール]スコープ

エラー処理の為、スコープを配置しています。

 

3-1.[HTTP]HTTP

APIを呼び出します。

 

3-2.[コントロール]条件-HTTPstatusCode

HTTPアクションから返される状態コードが正常(200)かどうかで分岐します。

  • 条件
    • @{outputs('HTTP')['statusCode']}
    • 次の状態に等しい
    • 200

3-3.(はいの場合)[変数]変数の設定

状態コードが正常(200)の場合、HTTPアクションの出力をResponse_XML変数に格納します。

  • 名前
    • @{body('HTTP')}

4.[データ操作]作成-xml to json

XML形式のままでは扱いづらいため、json形式に変換します。

実行条件の構成で「失敗しました」にもチェックします。今回のフローはPower Appsから呼び出す想定の為、スコープ内でエラーが発生した場合にも実行されるようにして、PowerApps側でエラーを判断します。

  • 入力
    • json(xml(variables('Response_XML')))

この処理でXMLは次のようなJSONに変換されます。

{
  "?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に返します。

  • 出力1
    • 文字列
    • Response
    • @outputs('作成-xml_to_json')

 

Power Apps アプリ概要

フロー動作確認用の簡易アプリです。

  • 使用するコントロール
    • マップコントロール
      • Map1
    • ボタン
      • ButtonCanvas1
    • テキスト入力
      • TextInput1
    • Power Automateクラウドフロー
      • "Geocoding.jpでジオコーディング"

 

  • Map1の主なプロパティ
    • Items
      • colMapPins
    • ItemAddress
      • ”Address”
    • ItemName
      • "Name"
    • ItemLatitudes
      • ”Latitude”
    • ItemLingitude
      • "Longitude"
  • 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("キーワードに該当する地点は見つかりませんでした"))

 

参考にしたページ

いつも参考にさせていただいています。ありがとうございます。

qiita.com

 

learn.microsoft.com

 

さいごに

Geocoding.jp はこれだけのサービスを個人で運用されていることに大感謝です。

検索の頻度を、10秒に1回程度に抑えてください。」と制限を守って利用しましょう。

www.geocoding.jp