2017-03-29 12 views
0

私にはスタートとストップボタンが付いたアプリがあります。ユーザーがスタートを押すと、GPSがオンになります。ユーザーが停止を押すと、GPSがオフになります。ユーザーが最初から最後まで移動した距離を計算したい。GPS座標からの距離の計算

これはこれまでのコードですが、動作しません。

ポイント1とポイント2のGPS座標を小数点以下4桁に丸めて表示しています。 Update()にif-statementを入力していますが、ポイント1とポイント2の同じGPS座標を表示しています。

もう1つの問題は、私がスタートボタンを押すとすぐに〜1200km移動したと言います私は動かなかった。

public double long1 = 0; 
public double lat1 = 0; 

public double long2 = 0; 
public double lat2 = 0; 

void Start() 
{ 
    distance_label = distanceObject.GetComponent<Text>(); 

    // *** DELETE WHEN DONE - text labels for testing 
    testP1 = p1Object.GetComponent<Text>(); 
    testP2 = p2Object.GetComponent<Text>(); 
    testMsg = test.GetComponent<Text>(); 

    distance_label.text = "You and your blobs have walked " + distanceWalked + " km."; 
} 


void Update() 
{ 

    GetCurrentLocation(); 

    double latRounded1 = Math.Round (lat1, 4); 
    double longRounded1 = Math.Round (long1, 4); 
    double latRounded2 = Math.Round (lat2, 4); 
    double longRounded2 = Math.Round (long2, 4); 

    testP1.text = "<Point 1 Coordinates> Lat: " + latRounded1 + ", Long: " + longRounded1; 
    testP2.text = "<Point 2 Coordinates> Lat: " + latRounded2 + ", Long: " + longRounded2; 

    // Compare GPS coordinates rounded to 4 decimal places 
    if (latRounded1 != latRounded2 || longRounded1 != longRounded2) { 
     testMsg.text = "Lat/Long don't match."; 
     distanceWalked += CalculateDistance (longRounded1, latRounded1, longRounded2, latRounded2); 
     distance_label.text = "You and your blobs have walked " + distanceWalked + " km."; 
     long1 = long2; 
     lat1 = lat2; 
    } 
} 

/// <summary> 
/// Makes a call to start GPS service when Start button is clicked. 
/// </summary> 
public void StartButtonClicked() 
{ 
    Debug.Log ("Start button clicked..."); 
    StartCoroutine (StartLocationService()); 
} 

/// <summary> 
/// Stops GPS service when Stop button is clicked. 
/// </summary> 

public void StopButtonClicked() 
{ 
    Debug.Log ("Stop button clicked..."); 
    Input.location.Stop(); 
    distance_label.text = "Stopped."; 
} 

public void ResetButtonClicked() 
{ 
    Debug.Log("Reset button clicked..."); 
    distanceWalked = 0; 
    Input.location.Stop(); 

    Debug.Log ("distanceWalked after reset: " + distanceWalked); 
} 

public void GetCurrentLocation() 
{ 
    if (Input.location.status == LocationServiceStatus.Running) { 
     long2 = Input.location.lastData.longitude; 
     lat2 = Input.location.lastData.latitude; 
    } 
} 

/// <summary> 
/// Starts the location service. 
/// </summary> 

IEnumerator StartLocationService() 
{ 
    // First, check if user has location service enabled 
    if (!Input.location.isEnabledByUser) 
     //yield break; 
     distance_label.text = "Not initialized"; 

    // Start service before querying location 
    Input.location.Start (0.5f); // accuracy = 0.5m 


    // Wait until service initializes 
    int maxWait = 20; 
    while (Input.location.status == LocationServiceStatus.Initializing && maxWait > 0) { 
     yield return new WaitForSeconds (1); 
     maxWait--; 
    } 

    // Service didn't initialize in 20 seconds 
    if (maxWait < 1) { 
     distance_label.text = "Timed out"; 
     yield break; 
    } 

    // Connection has failed 
    if (Input.location.status == LocationServiceStatus.Failed) { 
     distance_label.text = "Unable to determine device location"; 
     yield break; 
    } else { 
     long1 = long2 = Input.location.lastData.longitude; 
     lat1 = lat2 = Input.location.lastData.latitude; 

     // Access granted and location value could be retrieved 
     // distance_label.text = "Location: " + Input.location.lastData.latitude + " " + 
     // Input.location.lastData.longitude + " " + 
     // Input.location.lastData.altitude; 

    } 

    // Stop service if there is no need to query location updates continuously 
    //Input.location.Stop(); 
} 

/// <summary> 
/// Calculate distance traveled given two points. 
/// </summary> 
/// <param name="longitude1"> Longitude coordinate of point 1</param> 
/// <param name="latitude1"> Latitude coordinate of point 1</param> 
/// <param name="longitude2"> Longitude coordinate of point 2</param> 
/// <param name="latitude2"> Latitude coordinate of point 2</param> 
public double CalculateDistance (double longitude1, double latitude1, double longitude2, double latitude2) 
{ 
    double radiansOverDegrees = (Math.PI/180.0); 
    double EARTH_MEAN_RADIUS = 6371; // in km 

    double radiansLong1 = longitude1 * radiansOverDegrees; 
    double radiansLat1 = latitude1 * radiansOverDegrees; 

    double radiansLong2 = longitude2 * radiansOverDegrees; 
    double radiansLat2 = latitude2 * radiansOverDegrees; 

    double dLong = radiansLong2 - radiansLong1; 
    double dLat = radiansLat2 - radiansLat1; 

    double dist1 = Math.Pow (Math.Sin (dLat/2.0), 2.0) + 
     Math.Cos (radiansLat1) * Math.Cos (radiansLat2) * 
     Math.Pow (Math.Sin (dLong/2.0), 2.0); 

    double dist2 = EARTH_MEAN_RADIUS * 2.0 * Math.Atan2 (Math.Sqrt (dist1), Math.Sqrt (1.0 - dist1)); 

    return dist2; 
} 
+0

@mariocatch私はちょうどOPを更新しました。 lat1/lat2/long1/long2は 'Start()'の上に宣言されます。後者のメソッドは、GPSを初期化し、最初に 'StartLocationService()'の最後のelse文の変数を定義します。このメソッドは、StartButtonClicked()を呼び出してコルーチンを開始し、 'StartLocationServce() 'を呼び出します。 – falafel

+0

'GetCurrentLocation()'の 'LocationServiceStatus.Running'条件は本当ですか? – mariocatch

+0

@mariocatchはい。私は 'GetCurrentLocation()'の中から 'Input.location.status'をダブルチェックして、開始ボタンを押して停止ボタンを押すまで実行しています。 – falafel

答えて

0

com.google.maps.androidパッケージのSphericalUtilを使用してください。

public static double getDistance(LatLng origin, LatLng destination) { 
      return SphericalUtil.computeDistanceBetween(origin, destination); 
     } 
+0

Unityでこれを使用できますか?パッケージをインポートするにはどうすればいいですか? – falafel

+0

私はそれがわかりません。私はアンドロイドです。 – kggoh

関連する問題