1. システムとオフィスの融合
  2. media
  3. マイクロソフトソリューション Power Apps Power Platform
  4. Power Apps / Power Automate で大量データを扱うときのポイント(前編)

QESブログ

Power Apps / Power Automate で大量データを扱うときのポイント(前編)

  • LINEで送る
  • このエントリーをはてなブックマークに追加



こんにちは。システムソリューション営業本部の吾妻です。

私事ですが先日、携帯電話の電波が届かない山奥で怪我をするという出来事がありました。
通報した際に現地の住所を尋ねられたのですが、スマートフォンのGPSは利用できたので緯度と経度は分かったものの、地図アプリは、オフラインマップの縮尺の小さな地図しか閲覧できず、紙の道路地図にも市町村レベルまでしか載っていなかったため、すぐには把握することができず困ってしまいました。
そのような出来事もあり、自分が今いる場所の緯度と経度を基に住所を取得する「逆ジオコーディング」を行うためのツールをPowerPlatformで実装してみたのですが、その過程でいくつか検証を行ったので、まとめてみようと思います。



逆ジオコーディングとは?

まず「ジオコーディング」というのは、私たちが日常生活の中で場所を特定するために利用している「住所」を、地図上で場所を特定するための「座標(経緯度)」に変換する操作を指します。なので、ジオコーデングの「逆」である「逆ジオコーデング」というのは、地図上の座標(経緯度)を人間にとって可読性の高い形式である住所に変換する操作のことを指します。

通常Webサービスなどに逆ジオコーディング機能を組み込む場合だと、地理院地図やGoogleマップのようなWebサービスで公開されているAPIに対して、逆ジオコーデングの対象とする経緯度をパラメーターとして送り、住所を結果として取得して利用する、というパターンが多いですが、今回の場合は、インターネットに接続していない状況下での取得処理が発生しうること、プライバシーの面で懸念があることなどの理由から、クライアントサイドにデータを保持して、逆ジオコーデング処理をローカルで完結させることを目指してみます。


地理院地図で逆ジオコーデングを行うサンプル

 URL:
https://mreversegeocoder.gsi.go.jp/reverse-geocoder/LonLatToAddress?lon=139.778221&lat=35.680923
 結果:
{"results":{"muniCd":"13102","lv01Nm":"日本橋兜町"}}



使用するデータセット

ローカルで逆ジオコーデングを行うためには、経緯度と住所の対応関係を保持するデータセットが必要になります。

今回は、国土地理院から公開されている「大字・町丁目レベル位置参照情報」を使用します。このデータセットには、「日本における住所体系のうち、市、町、村、区、特別区の直下に属す行政区である「大字」、「町丁目」、 自治体によっては「町字」を示す住所代表点と、その住所代表点が示す位置座標を対応づけた情報」が記録されているので、現在地の経緯度に対して、最も距離の小さい位置座標を持つ住所を検索してあげることで、大まかな住所を取得できることになります。

大字・町丁目レベル位置参照情報は、国土交通省のGISホームページからダウンロードできます。都道府県ごとのCSVファイルになっているので、各々ダウンロードした後に1ファイルに結合しておきます。47都道府県で合計19万レコードほどありました。CSVファイルの列は、最低限「住所」「緯度」「経度」の3カラムだけあれば十分なので、適宜「市区町村名」「大字町丁目名」などの元々あるカラムのデータ同士を利用して整形しておきます。

全都道府県分のデータが結合されたCSVファイルができあがったら、Dataverseへインポートしておきます。
データ格納先のテーブルの名前は、「Town」としました。



Power Apps キャンバスアプリの実装

ローカルで逆ジオコーデングすることを目指すものの、Power Appsキャンバスアプリはそもそもインターネット接続があることを前提としたサービスになっています。
そこで、今回実装していくキャンバスアプリには、以下のような処理を組み込んであげる必要があります。

 アプリを実行している端末がインターネットにアクセスできるか確認する 
 ↓ 
 (インターネット接続があれば)Dataverseのデータをローカルにキャッシュする 
 ↓ 
 現在地の経緯度を取得する 
 ↓ 
 キャッシュ内のデータに対して、現在地との距離が最小のレコードを検索する 
 ↓ 
 結果を表示する 


実際に、上の処理を組み込んだキャンバスアプリを実行してみると、エラー表示も出ず、一見うまいこと逆ジオコーディングした結果を得られているように見えます。
しかし、よくよく結果を見てみると、意図したのと異なっていることに気付くかと思います。

revgeo01.png


これは、Power Appsでローカルに保持できるレコードの上限が2000件に制限されていることが原因です。Townテーブルの内容を確認してみると、北海道から沖縄県に向かってレコードが登録されてるうち、先頭にある北海道札幌市内のレコードだけで2000件を超えてしまっていることが分かります。

revgeo02.png



そのため、キャンバスアプリに組み込む処理を以下のように変更して、レコード数の制限に引っ掛からないようにする必要があります。

 アプリを実行している端末がインターネットにアクセスできるか確認する 
 ↓ 
 現在地の経緯度を取得する 
 ↓ 
 (インターネット接続があれば)Dataverseのデータのうち、
現在地の周囲のレコードだけをローカルにキャッシュする 
 ↓ 
 キャッシュ内のデータに対して、現在地との距離が最小のレコードを検索する 
 ↓ 
 結果を表示する 

「現在地の周囲のレコード」を取得する際は、現在地の緯度を Lat 、経度を Lon 、周囲の大きさを示す定数を Δ とおいて、
( Lat - Δ < 緯度 < Lat + Δ , Lon - Δ < 経度 < Lon + Δ )の範囲に含まれるレコード数を数えながら Δ を0.1、0.01、…と徐々に小さく変化させていき、
レコード数が2000件未満になったところでローカルのコレクションに格納するようにします。

このように変更することで、以下のように、与えられた経緯度に対して正しい住所を取得することができます。

revgeo03.png




🎉これで完成です!!🎉



Power Automate クラウドフローで大量データを扱うときのポイントについては 後編 の記事でご紹介します。


QESではPower Platform導入時の支援から、アプリケーション開発、導入後の保守サポートまで対応しております。
Power Apps/Power Platformに関して、お手伝いできることがありましたら何なりとご相談くださいませ。また以下のページもご覧ください。


他にも、Power Apps関連の記事があります。




このブログで参照されている、Microsoft、Windows、その他のマイクロソフト製品およびサービスは、米国およびその他の国におけるマイクロソフトの商標または登録商標です。
このブログで参照されている、Android、Google Maps、その他のGoogle製品およびサービスは、米国およびその他の国におけるGoogle LLCの商標または登録商標です。

  • LINEで送る
  • このエントリーをはてなブックマークに追加

お気軽にお問い合わせください。

ページのトップへ