Microsoft FormsとArcGIS for PowerBIで地理空間分析

この記事は[NTTテクノクロスアドベントカレンダー2024](https://qiita.com/advent-calendar/2024/ntt-tx)、シリーズ 1 の18日目の記事です。

こんにちは、NTTテクノクロスの中島進也([なかしょ](https://twitter.com/nakasho_dev))と申します。
普段はAndroid, iOSのモバイルアプリ開発を担当しています。

本記事ではモバイルアプリとMicrosoft FormsとArcGIS for PowerBIを連携して害獣報告マップを作製してみたいと思います。

### まずはMicrosoft Formsでアンケート作成

Microsoft Formsの項目作成については割愛いたします。
以下のようなアンケートを作成しました。

![Forms.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146488/572a588b-dde0-8d2d-cbfd-cb0c673b5278.png)

### 緯度経度の入力はどうする？

このアンケートのURLに単純に飛んだだけだと、緯度経度の入力に困ります。
Microsoft Formsには事前入力済みURL(Pre-filled URL)という機能があります。
この機能は特定の値を事前に入力しておくものなのですが、ちょっと工夫することで動的にデータを入力することができます。

![事前入力済みURLの取得.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146488/3c07cd60-fb99-6675-f8a3-0496b7c01f43.png)

編集画面のメニューから「事前入力済みURLの取得」を選択し、

![有効にする.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146488/dc732f0d-7eec-5b17-356c-96c677fa177f.png)

表示された画面で「事前入力済みの回答を有効にする」のスイッチを有効にし、緯度、経度、日付に事前入力を実施したのちに、生成されたリンクをコピーします。

![URLコピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146488/38bfdf8f-14d2-c626-e2ab-4d99d73d9f51.png)

取得できたURLは以下となります。

```
https://forms.office.com/Pages/ResponsePage.aspx
?id=xxxxxxxxxxxxxxxxxxxxxxxxxxx
&rcde153e75e314b0e8e0e7c17cce1ace8=%222024-10-26%22     ＜＜日付
&rd6cfb194b7ac41b283ad9f62df18e661=35.69816   ＜＜緯度
&ref1e612319e640af82c27781219b52a7=139.762689  ＜＜経度

```

パラメータ名は16進数の文字列で分かりづらいですが、自分で入力した値でどのパラメータか判別可能です。
事前入力しなかった場合はパラメータとして付与されないのでご注意ください。

この事前パラメータを使用してモバイルアプリからMicrosoft Formsのページへ飛ばすようにします。

### モバイルアプリ（Android）

[MapLibre](https://maplibre.org/) というOSSのライブラリを活用して地図を表示し、地図上で選択した緯度経度をFormsに送るようにします。
MapLibreにはaddOnMapLongClickListenerというロングタップ時にその地点の緯度経度を取得してイベントを起こす機能があります。
以下のようにロングタップのイベントから受け取った緯度経度をダイアログ画面に渡します。


```kotlin
map.addOnMapLongClickListener { latLng ->
    val fragment = supportFragmentManager.fragmentFactory.instantiate(
        ClassLoader.getSystemClassLoader(),
        OpenFormsFragment::class.java.name
    ) as BottomSheetDialogFragment
    fragment.arguments = Bundle().apply {
        putDouble("latitude", latLng.latitude)
        putDouble("longitude", latLng.longitude)
    }
    fragment.show(supportFragmentManager, null)

    true
}


```

渡された画面で渡された緯度経度と、現在時刻を埋め込んだMicrosoft Formsの事前入力済みURLを作成します。

```kotlin
private fun openForms(latitude: Double, longitude: Double) {
    val dateString = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        DateTimeFormatter.ofPattern("uuuu-MM-dd").format(ZonedDateTime.now())
    } else {
        ""
    }
    val url = "https://forms.office.com/Pages/ResponsePage.aspx?" +
            "id=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" +
            "&rcde153e75e314b0e8e0e7c17cce1ace8=%22$dateString%22" +
            "&rd6cfb194b7ac41b283ad9f62df18e661=$latitude" +
            "&ref1e612319e640af82c27781219b52a7=$longitude"
    val intent = Intent().apply {
        action = Intent.ACTION_VIEW
        data = Uri.parse(url)
    }
    intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
    requireContext().startActivity(intent)
}

```

作成したアプリでは地図をタップすると以下のようなダイアログが開き、「報告する」ボタンを押すことで、緯度経度と現在時刻をパラメータに含めたURLでMicrosoft Formsが開きます。

![Screenshot_1734279483.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146488/e959d3f5-435e-4da4-6b74-2029c1aff3bd.png)

緯度経度と現在時刻を埋め込んで表示されたMicrosoft Formsの画面は以下です。

![FormsMobile.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146488/566e625d-e163-2475-3579-cccfcab9e813.png)

こうやって、たくさんの報告が集まるとします。

### 集まった害獣報告

緯度経度と関連付けられた報告の一覧です。

![報告一覧.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146488/0363a3a2-ab65-f65e-a09f-572db15fdfd3.png)

### ArcGIS for PowerBI で報告を可視化

https://www.esrij.com/products/arcgis-for-power-bi/

ArcGIS for PowerBIはPowerBIに標準で搭載されており、ArcGIS Onlineのアカウントでログインして使用できます。
ArcGIS Onlineは無料で使うこともできます。

https://blog.esrij.com/2024/05/10/post-56657/

PowerBIの管理画面で、Microsoft Formsで入力されたデータが保存されたExcelファイルを読み込んで、地図の緯度経度等を関連付けます。
すると登録された報告情報が地図上に点で表示されます。

![PowerBI関連付け.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146488/57eeeaae-ba1a-991a-0e35-10f465d4fb1b.png)

表示された点をマウスでロールオーバーするとツールチップとして登録した内容が表示されます。

![ツールチップ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146488/fd83835f-b6c4-afdd-c4db-2db32648ba9a.png)

簡単ですが害獣報告を分析できる地図ができました。

### 最後に

今回は獣害報告を例にしましたが、ユーザに何かを報告してもらって地図上に表示して分析することは色々と応用が利きそうです。
皆さんも何か試してみてはいかがでしょうか？


明日は [@teru-y](https://qiita.com/teru-y) さんの「【AWS】StepFunctions+EMR構成のメリットとおススメ設定」です。
引き続き、NTTテクノクロスアドベントカレンダーをお楽しみください。