本日はMicrosoft Maps SDK forUnityの実験枠です。
Maps SDKを用いることでHoloLensのアプリ内で世界中の地形を表示できます。
これはMapsSDKのコアコンポーネント[MapRenderer]に緯度経度を渡すことでその場所の地形情報を表示します。
また、必然的にネットワーク環境が必要になるため、それを利用してネットワーク経由でユーザーの現在地を緯度経度で取得することも行いました。
今回はさらに応用します。
〇2点の緯度経度から距離を計算する。
緯度経度を用いた2点間の距離は以下のコードで計算することができます。
public class LocationDistanceTest : MonoBehaviour
{
public float _ErathRadius = 6371;
public void CulStart(float _lat1,float _lon1,float _lat2,float _lon2 ,out float _distance)
{
_lat1 = _lat1 * Mathf.PI / 180;
_lat2 = _lat2 * Mathf.PI / 180;
_lon1 = _lon1 * Mathf.PI / 180;
_lon2 = _lon2 * Mathf.PI / 180;
float d1 = Mathf.Acos(Mathf.Cos(_lat1) * Mathf.Cos(_lat2) * Mathf.Cos(_lon2 - _lon1) +
Mathf.Sin(_lat1) * Mathf.Sin(_lat2));
_distance = _ErathRadius *d1;
}
}
いちど緯度経度をラジアンに変換し処理に流しています。
また、ここでは地球を半径6371kmの真球として計算しています。
日本国内同士であれば大きな差が出ないとは思いますが、例えば東京とシアトルなど国をまたいで遠くの土地の距離を出す際は少なからず誤差が出てしまいます。
〇MapSDKと組み合わせて使用する。
今回は以下のコードを描きました。
東京駅から現在地の距離を数値で返し、テキストに表示します。
public class test : LocationDistanceTest
{
[SerializeField] private MapRenderer _mapRenderer;
LatLon _latLon;
[SerializeField] TextMeshPro _Text;
[SerializeField] private float _TargetLat;
[SerializeField] private float _TargetLon;
public void CulStart()
{
float result;
_latLon = _mapRenderer.Center;
float _lat1 = (float) _latLon.LatitudeInDegrees;
float _lon1 = (float) _latLon.LongitudeInDegrees;
CulStart(_lat1,_lon1,_TargetLat,_TargetLon,out result);
_Text.text = result.ToString();
}
}
ボタンでCulStartを呼び出すことで計算した結果をテキストに返します。
〇実機で確認
実機で確認します。
東京駅で動かした場合0と表示されます。

上野駅で動かした場合4.9と表示されました。

これはおおむね合致しているため距離の計算が正しいといえそうです。
〇参考
今回は緯度経度から距離を取得する計算で次の記事を参考にさせていただきました。