【Power Apps】現在地の住所を取得する方法(APIなし)

【Power Apps】現在地の住所を取得する方法(APIなし)

Power Appsで現在地を取得し、その現在地の住所を取得する方法を紹介します。この記事ではAPIを使わず、Power Appsだけで完結する方法を紹介します。Power Automateのプレミアムなどが契約できない場合など、できるだけ費用を抑えて実行する方法です。

住所データの準備

緯度・経度と住所情報が紐づいているデータとして、株式会社 Geoloniaが作成している(https://japanese-addresses-v2.geoloniamaps.com/api/ja.json)を利用します。

詳しい内容はこちら(https://github.com/geolonia/japanese-addresses-v2)を確認してください、

データをPower Appsで扱う形に変換する

https://github.com/geolonia/japanese-addresses-v2 から取得したデータをPower Appsで使える形へと変換します。

Pythonで下記ライブラリを使います。事前にpip installしてください。

コピーしました!

pip install
pip install requests
pip install json

コピーしました!

Python
import requests
import json
import os
# JSON取得
url = "https://japanese-addresses-v2.geoloniamaps.com/api/ja.json"
response = requests.get(url)
response.encoding = "utf-8"
data = response.json()
# 'data' の中を処理
collection_data = []
for pref_data in data["data"]: pref_name = pref_data.get("pref", "") pref_k = pref_data.get("pref_k", "") pref_r = pref_data.get("pref_r", "") pref_point = pref_data.get("point", []) # 緯度・経度 pref_lat, pref_lon = pref_point if len(pref_point) == 2 else (None, None) for city in pref_data.get("cities", []): city_name = city.get("city", "") city_ward = city.get("ward", "") city_point = city.get("point", []) # 緯度・経度 city_lat, city_lon = city_point if len(city_point) == 2 else (None, None) # データをコレクションに追加 collection_data.append( { "prefecture": pref_name, "pref_k": pref_k, "pref_r": pref_r, "city": city_name, "ward": city_ward, "prefecture_latitude": pref_lat, "prefecture_longitude": pref_lon, "city_latitude": city_lat, "city_longitude": city_lon, } )
# 結果確認(最初の10件)
print(json.dumps(collection_data[:10], ensure_ascii=False, indent=2))
# 出力ファイルのパスを.pyファイルと同じフォルダに設定
script_dir = os.path.dirname(os.path.abspath(__file__))
output_path = os.path.join(script_dir, "powerapps_clearcollect.txt")
# Power AppsのClearCollect形式で保存
with open(output_path, "w", encoding="utf-8") as f: f.write("ClearCollect(AddressCollection,\n") for item in collection_data: line = ( f' {{prefecture: "{item["prefecture"]}", city: "{item["city"]}", ward: "{item["ward"]}", ' f"prefecture_latitude: {item['prefecture_latitude']}, prefecture_longitude: {item['prefecture_longitude']}, " f"city_latitude: {item['city_latitude']}, city_longitude: {item['city_longitude']}}}" ) if item != collection_data[-1]: line += ",\n" else: line += "\n" f.write(line) f.write(");")
print(f"メモ帳に出力が完了しました!\n→ {output_path}")

こちらのコードでClearCollectで囲まれたデータが出力されます。Power Apps内に貼り付け利用できます。

Formulasに記述する場合には下のようにTableに囲って利用します。

コピーしました!

Power Apps(Formulas)
addressData=
Table( {prefecture: "北海道", city: "札幌市", ward: "中央区", prefecture_latitude: 141.347906782, prefecture_longitude: 43.0639406375, city_latitude: 141.35389, city_longitude: 43.061414}, {prefecture: "北海道", city: "札幌市", ward: "北区", prefecture_latitude: 141.347906782, prefecture_longitude: 43.0639406375, city_latitude: 141.340882, city_longitude: 43.090693},
,,,,
,,,,
,,,
);

Power Appsの実装

今回のアプリの完成イメージです。

Power Appsで現在地の緯度・経度を取得し、上で準備した住所データの中から近い住所を特定します。

現在地の取得

Power AppsでLocation関数を使うことで、現在の緯度・経度を取得できます。ボタンのOnSelectなどに設定して取得します。

コピーしました!

Power Apps
Set(LocatiionDataIdo,Location.Latitude);
Set(LocatiionDataKeido,Location.Longitude);

この位置情報の取得はGPSだけでなくネットワークのIPアドレス等からもデータの取得を行います。そのため、GPSがOFFの端末などでは、正しくない位置情報が取得されることもあります。

緯度・経度を使った距離計算はHaversineの公式を使います。詳しくは省きますが、下記コードで計算できます。

コピーしました!

Power Apps
// 地球の半径 (Km)
Set(Radius, 6371);
// 現在地の緯度・経度
Set(currentLat, txt_ido2.Text);
Set(currentLon, txt_keido2.Text);
ClearCollect( nearestLocation, SortByColumns( AddColumns( addressData, Distance, 6371 * Atan( Sqrt( Power(Sin((Radians(addressData[@city_longitude]) - Radians(currentLat)) / 2), 2) + Cos(Radians(currentLat)) * Cos(Radians(addressData[@city_longitude])) * Power(Sin((Radians(addressData[@city_latitude]) - Radians(currentLon)) / 2), 2) ) ) ), "Distance",SortOrder.Ascending )
);

最寄りの住所は下記で取得できます。

コピーしました!

Power Apps
// 県 First(nearestLocation).prefecture
//市
First(nearestLocation).city
//区
First(nearestLocation).ward 

アプリ・フローダウンロード

GitHubに公開しています。下記よりダウンロードしてご利用ください。

参考記事など

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA