#PowerApps 緯度と経度が入っているデータのGallary上に現在地からの直線距離を表示する方法

# えー・・・
絶賛風邪ひいております。皆さん季節の変わり目には体調がぶっ壊れますので、うがい手洗いしっかりしてくださいね！！

# 本投稿は・・・
Power Apps Advent Calendar 10日目です。

# 今回の記事は・・・

こちらの記事の発展形、BizApp版のTipsです

[PowerAppsのLocation関数を使ってノンコーディングでスピードメーターっぽいものを作ってみた](https://qiita.com/rnakamuramartiny/items/efd8c5bf236834dead42)

# こんなデータがあるとします

|場所|緯度|経度|
|:--|:--|:--|
|東京本社|35.6092|139.7301|
|福岡支社|33.5913|130.4148|

# 緯度と経度があるなら・・・

Power Apps は、スマートフォンの緯度経度が取れるので
現在位置から目的地までの直線距離とか出したくないですか？？
こんな感じで・・・

<blockquote class="twitter-tweet"><p lang="en" dir="ltr">I build up IoT Key Control Apps using by <a href="https://twitter.com/hashtag/PowerApps?src=hash&amp;ref_src=twsrc%5Etfw">#PowerApps</a> and <a href="https://twitter.com/hashtag/CommonDataService?src=hash&amp;ref_src=twsrc%5Etfw">#CommonDataService</a> !<br><br>This app can&#39;t be operate unless close to the set distance.😘😘 <a href="https://t.co/Iq42jN7fvx">pic.twitter.com/Iq42jN7fvx</a></p>&mdash; りなたむ || RYOTA NAKAMURA (@R_t_A_n_M) <a href="https://twitter.com/R_t_A_n_M/status/1204055296651317249?ref_src=twsrc%5Etfw">December 9, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# 早速作っていく！

## 2点間の距離の出し方

ヒュベニの公式を使います。

### ヒュベニの公式

```math
距離d=\sqrt{(d_y M)^2+(d_x N \cos \mu_y)^2}
```
```math
緯度差d_y=y_1-y_2
```
```math
経度差d_x=x_1-x_2
```
```math
緯度平均値\mu_y=\frac{y_1+y_2}{2}
```
```math
子午線曲率半径M=\frac{a(1-e^2)}{W^3}
```
```math
M=\frac{6334834}{\sqrt{(1-0.006674 \times \sin \mu_y \times \sin \mu_y)^3}}
```
```math
卯酉線曲率半径N=\frac{a}{W}
```

```math
N=\frac{6377397}{\sqrt{(1-0.006674 \times \sin \mu_y \times \sin \mu_y)}}
```

```math
W=\sqrt{1-e^2 \sin^2 \mu_y}
```
```math
e=\sqrt{\frac{a^2-b^2}{a^2}}
```

参考サイト：[日本は山だらけ：二地点の緯度・経度からその距離を計算する](http://yamadarake.jp/trdi/report000001.html)

### スピードメーターと一緒のやつつかえばいいんじゃん！

と思うでしょ？
私も思ったんですよ。
でも今回ギャラリーでしょ？
データ毎に計算させないといけないんで、変数使えないんすよ。

### コンポーネント化しちゃう？

試してみたけど、そもそもギャラリーにコンポーネント入れられないのよね。

### 計算式を作成する。

まぁこれしかないでしょうね・・・。

というわけで、紹介した記事のこちらの処理

```php
Set(Var_Latitude_now,Location.Latitude)&
Set(Var_Longitude_now,Location.Longitude)
If(Var_Latitude_before <> Var_Latitude_now,
	Set(Var_Latitude_Ave,Average(Radians(Var_Latitude_before),Radians(Var_Latitude_now)))&
	Set(Var_Latitude_diff,(Var_Latitude_before - Var_Latitude_now))&
	Set(Var_Longtitude_diff,(Var_Longtitude_before - Var_Longitude_now))&
	Set(Var_Meridian_Radius,(6334834/Sqrt(((1-0.006674*Sin(Var_Latitude_Ave)*Sin(Var_Latitude_Ave))^3))))&
	Set(Var_Rabbit_Radius,(6334834/Sqrt(((1-0.006674*Sin(Var_Latitude_Ave)*Sin(Var_Latitude_Ave))))))&
	Set(Var_Latitude_before,Var_Latitude_now)&
	Set(Var_Longtitude_before,Var_Longitude_now)
,"")
Set(Calc01,(Var_Meridian_Radius*Radians(Abs(Var_Latitude_diff)))^2)&
Set(Calc02,(Var_Rabbit_Radius*Cos(Var_Latitude_Ave)*Radians(Abs(Var_Longtitude_diff)))^2)
Set(Var_Distance,Sqrt(Calc01+Calc02))
```
を、関数を使わない計算式で表現してみましょう。

``` php
Concatenate("現在位置から　",Text(Round(Sqrt(

	((
		//Meridian_Radius
		(
			6334834/Sqrt(
				(
					(
						1-0.006674*Sin(
							//Var_Latitude_Ave
							Average(
								Radians(
									ThisItem.緯度
								),
								Radians(
									Location.Latitude
								)
							)*
							Sin(
								Average(
									Radians(
										ThisItem.緯度
									),
									Radians(
										Location.Latitude
									)
								)
							)
						)^3
					)
				)
			)
		)*
		Radians(
			Abs(
				ThisItem.緯度-Location.Latitude
			)
		)
	)^2)+
	(
		//Rabbit_Radius
		((
			6334834/Sqrt(
				(
					(
						1-0.006674*Sin(
							//Var_Latitude_Ave
							Average(
								Radians(
									ThisItem.緯度
								),
								Radians(
									Location.Latitude
								)
							)
						)*Sin(
							//Var_Latitude_Ave
							Average(
								Radians(
									ThisItem.緯度
								),
								Radians(
									Location.Latitude
								)
							)
						)
					)
				)
			)
		)*
		Cos(
			//Var_Latitude_Ave
			Average(
				Radians(
					ThisItem.緯度
				),
				Radians(
					Location.Latitude
				)
			)
		)*
		Radians(
			Abs(
				ThisItem.経度-Location.Longitude
			)
		)
	)^2)
)/1000,2)),"km")
```

## 距離が出せたのであれば

特定位置になった時だけ、そのアイテムをクリックできる！
みたいなことも実現可能です！
そのやり方は、ぜひ皆さんの手で試してみてくださいね！！


# まとめ

いかがだったでしょうか？
ノーコードというわけにはいきませんが
Power Appsでも、スマートフォンの各種センサーを元に
様々な機能を実装することができます。
難しい数学の公式も、今やネットで探せば簡単に手に入る時代。
あとは、その公式をいかにして関数に落とし込めるか。
という部分になってくると思いますので、ぜひ皆さんも日ごろから関数のリファレンスを見ながら
サンプルアプリをたくさん作っていってくださいね！