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

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

ただいまの
回答率

87.48%

GPSを扱った、距離計算

受付中

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 4,021

score 7

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+1

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

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

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


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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

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

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

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 87.48%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る