質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

3回答

10457閲覧

緯度経度を使った、二点間の距離を出したい

saikira

総合スコア7

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2016/09/14 16:08

緯度経度を使った、二点間の距離を出す

unityでGPSを利用したアプリを作成しています。距離の計算式を書き、実行したところ実際の距離と全くかけ離れたものになってしまいました。これを解決するべく、皆様の知恵を貸していただきたいと思っています。
###発生している問題・エラーメッセージ
問題は、距離が正確に算出されないことです。

###該当のソースコード
Unity C#

using UnityEngine;
using System.Collections;
using UnityEngine.SceneManagement;

public class test: MonoBehaviour
{
public float r ;
public float z;

public static float swip_num = 0; public static float swip_num2 = 0; public static float swip_num3 = 0;

}
private IEnumerator GetStreetViewImage(float latitude, float longitude )
{
Vector2 pos2 = new Vector2(36.484479f, 136.571314f);
Vector2 pos3 = new Vector2(36.486926f, 136.570231f);
float r= 6378.137f;
float z = Mathf.Cos((pos2.x + pos3.x) / 2);
swip_num3 = Mathf.Sqrt(Mathf.Pow((pos2.y-pos3.y)z,2)+Mathf.Pow(pos2.x-pos3.x,2));
swip_num = swip_num2
Mathf.Deg2Rad*r;
swip_num = Mathf.Acos(swip_num3);
}

###試したこと

複数の計算式を実験してみましたが、どれも計算が合わない結果になってしまいした。
参考にした計算式
出発地点の緯度をδ1、経度をλ1、到着地点の緯度をδ2経度をλ2
δ0は二地点の緯度を足して2で割った平均です
1)cos d = (sinδ1)×(sinδ2) + (cosδ1)×(cosδ2)×cos(λ1-λ2)
2)d=√{(λ1-λ2)×(cosδ0)}^2 + (δ1-δ2)^2}

###補足情報(言語/FW/ツール等のバージョンなど)
言語はC#を使っております。unityのバージョンは5.3.5です。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

地球を完全な球とみなして計算する方法、いわゆるhaversineという方法です。
これで0.288974813191124と出ますがいかがでしょうか。

public static double Deg2Rad(double deg) { return deg * Math.PI / 180.0; } public static double GetDistance() { double r = 6378.137; // 地球の半径(km) double lat1 = 36.484479; double lng1 = 136.571314; double lat2 = 36.486926; double lng2 = 136.57023f; double dlat1 = Deg2Rad(lat1); double dlng1 = Deg2Rad(lng1); double dlat2 = Deg2Rad(lat2); double dlng2 = Deg2Rad(lng2); double d1 = Math.Sin(dlat1) * Math.Sin(dlat2); double d2 = Math.Cos(dlat1) * Math.Cos(dlat2) * Math.Cos(dlng2 - dlng1); double distance = r * Math.Acos(d1 + d2); // 距離(km) return distance; }

お書きになったコードは少なくとも

float z = Mathf.Cos((pos2.x + pos3.x) / 2);

この辺、Cos, Sinの引数にラジアンでなく度の値を渡しているようですが大丈夫でしょうか?

もしもっと精度高い値が必要なら、ヒュベニの公式、Vincentyのアルゴリズムという方法もあります
(実はヒュベニの公式が精度高く、高速、実装も比較的楽なのでおすすめです)。

投稿2016/09/14 19:46

編集2016/09/14 22:32
vc3000

総合スコア196

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

saikira

2016/09/15 04:58 編集

返信ありがとうございます。これはdoubleを使っていますが、floatをつかった場合はどのような書き方になりますか?現在、floatを使って作っていたので是非教えていただきたいです。また、doubleを使うとなると、Mathを使うと思うのですがunityで使うことは可能でしたでしょうか?
vc3000

2016/09/15 04:47

doubleをfloatに書き換えて MathをMathfに書き換えるだけでいけると思います。 MathfはUnityのクラスですよね。 Unityのことは詳しくないので他の方にお譲りします。
saikira

2016/09/15 05:26

分かりました、vc3000さんご丁寧にありがとうございました。
saikira

2016/09/15 08:34 編集

VC3000さん、return deg * Math.PI / 180.0;がいまいち分からないのですが、ここの計算はなんの計算なのですか?
vc3000

2016/09/15 09:06

角度の単位には2種類あります。 ・度(0~360)。緯度経度はこちら ・ラジアン(0~2π )。Math.Sinなどの関数が受け付けるのはこちら その式は角度を度からラジアンに変換しています。
guest

0

GoogleMapsのAPIを使うというのはどうでしょうか?
GoogleMapsにはジオメトリのライブラリがあるので、2点間の距離を計算してくれます。
下記は、jsの例ですが、unityならwwwクラスを使ってrestで受け取れるのではないでしょうか。

https://developers.google.com/maps/documentation/javascript/geometry?hl=ja
http://www.nanchatte.com/map/computeDistance.html

投稿2016/09/14 20:03

Qoo

総合スコア1249

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

saikira

2016/09/15 08:29

返答ありがとうございます。
guest

0

それぞれの距離の絶対値を求める
X=abs(λ1-λ2)
y=abs(δ1-δ2)

X^2+y^2=Z^2

あとは三角関数を解けば良いかと
X=1 Y=2なら
1+4=z^2
√5=z

投稿2016/09/14 19:25

Alpha_1968

総合スコア10

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

saikira

2016/09/15 08:28

返答ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問