LoginSignup
6
0

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-12-09

えー・・・

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

本投稿は・・・

Power Apps Advent Calendar 10日目です。

今回の記事は・・・

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

PowerAppsのLocation関数を使ってノンコーディングでスピードメーターっぽいものを作ってみた

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

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

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

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

早速作っていく!

2点間の距離の出し方

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

ヒュベニの公式

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

参考サイト:日本は山だらけ:二地点の緯度・経度からその距離を計算する

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

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

コンポーネント化しちゃう?

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

計算式を作成する。

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

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

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))

を、関数を使わない計算式で表現してみましょう。

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

6
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
0