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

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

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

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

Unity

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

Q&A

2回答

5189閲覧

GPSを扱った、距離計算

saikira

総合スコア7

C#

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

Unity

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

0グッド

0クリップ

投稿2016/09/18 10:45

編集2016/09/19 05:04

unityでGPSを扱ったアプリを作成中です。緯度経度を取得し、それを利用した計算が正常に行われていないので行えるようにし、範囲内に入ったら反応するものを作成したいです。そこで、皆さんのお力を貸していただきたく投稿しました。

###発生している問題・エラーメッセージ
緯度経度は取得できているはずなのですが、計算に使用しても正常に扱えないので困っています。
書き方が間違っているなどがあると思うので、ぜひお願いします。

###該当のソースコード
C#を使用しています。
using UnityEngine;
using System.Collections;

public class GPSLoder : MonoBehaviour
{
private float intervalTime = 0.0f;
public double longitude;
public double latitude;
public static float kokudo;

void Start() { GetPos(); Math(); } void Update() { //毎フレーム読んでると処理が重くなるので、3秒毎に更新 intervalTime += Time.deltaTime; if (intervalTime >= 3.0f) { GetPos(); intervalTime = 0.0f; } } void GetPos() { //GPSで取得した緯度経度を変数に代入 StartCoroutine(GetGPS()); longitude = Input.location.lastData.longitude; latitude = Input.location.lastData.latitude; } void Math() { double lat1 = latitude; double lng1 = longitude; Debug.Log(lat1); Debug.Log(lng1); double lat3 = 36.484977; double lng3 = 136.568824; double dlat = lat1 - lat3; double dlng = lng1 - lng3; double fdlat = dlat * 100000; double fdlng = dlng * 100000; float f1 = (float)fdlat; float f2 = (float)fdlng; float kokudo = Mathf.Sqrt((f1 * f1) + (f2 * f2)); Debug.Log(kokudo); } void onGUI() { if (kokudo < 6) { GUI.Button(new Rect(150, 150, 150, 150),"範囲内です"); } else { GUI.Button(new Rect(150, 150, 150, 150), "範囲外です"); } } private IEnumerator GetGPS() { if (!Input.location.isEnabledByUser) { yield break; } Input.location.Start(); int maxWait = 120; while (Input.location.status == LocationServiceStatus.Initializing && maxWait > 0) { yield return new WaitForSeconds(1); maxWait--; } if (maxWait < 1) { print("Timed out"); yield break; } if (Input.location.status == LocationServiceStatus.Failed) { print("Unable to determine device location"); yield break; } else { print("Location: " + Input.location.lastData.latitude + " " + Input.location.lastData.longitude + " " + Input.location.lastData.altitude + " " + Input.location.lastData.horizontalAccuracy + " " + Input.location.lastData.timestamp); } Input.location.Stop(); }

}

###試したこと
書き方を変更したり、呼び出す部分を変更したりしました。
実機でテストもしてみましたが、反応しませんでした。
###補足情報(言語/FW/ツール等のバージョンなど)

ここを参考にしました。

URL:https://docs.unity3d.com/ScriptReference/LocationService.Start.html
URL:http://hro.hatenablog.jp/entry/2015/08/08/005930

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

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

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

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

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

guest

回答2

0

ご質問は、GPSと位置計算というよりは、「作ったプログラムが思った通りに動かないのをどうすれば良いか」ということになるかと思います。
開発環境はMonoDevelopでしょうか。
ただどの開発環境でも

  • ブレークポイント
  • ステップ実行
  • ウォッチ

という三種の神器が必ず付いていますので、これらを使ってプログラムの動きを追ってみてください。
ブレークポイントは行に設定して、そこまで来たらプログラムが一時停止する印、ステップ実行は一時停止したプログラムを一行ずつ進める機能、ウォッチは一時停止中に各変数・フィールドの中身を常時表示してくれるウィンドウです。


それはそれとして、距離計算の仕方がこれではいけません。
緯度経度は平面座標ではないので、三平方の定理では距離を求めることはできないのです。

球面上ではどのように距離を求めるかですが、以下のようにします(地球は球面でなく回転楕円体だろうというつっこみはおいておくことにして)。

  1. 地点を空間座標にする。ただし地球の半径を1として。

X軸は赤道上東経0度のガーナ方向、Y軸は赤道上東経90度のスリランカ方向、Z軸は北極方向です。
変換式は、(cos北緯・cos東経, cos北緯・sin東経, sin北緯)。
2. 2地点の空間座標をベクトルと見立てて、内積を取ります。
3. (ベクトルの長さはどちらも1だったので)、 内積はすなわちcosθです。逆関数であるacosをとればθ、つまり球面上での距離が求まりました。
4. ただし地球の半径を1としていたので、θに6371km(実際の地球半径)をかけます。

投稿2016/09/21 03:33

yuba

総合スコア5568

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

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

0

問題を切り分けるために次の方法を試してみてはいかがでしょうか。

・GPSから取得した座標をGUIに表示するだけのコードに変更し、想定した値が取得できているか確かめる
[実機環境で確認]

・座標を計算するだけのコードに変更し、デバッグ実行しながら想定した計算値と動作になっているか確かめる
[開発環境で確認]

(void Math() の呼び出しが見当たらないような気もします...)

投稿2016/09/18 13:31

編集2016/09/18 13:42
Tipo

総合スコア239

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問