19

こんにちは、現在の緯度と経度を保存された緯度と経度と比較して、onchangelocation() でイベントを調整する必要がありますが、エラーが発生します。日食はキーワード距離を認識していません。修正エラーについては、4つのパラメーターを持つクレートメソッド「距離」にヒントを与えています...修正方法??? または同じ仕事をする他の方法???

ありがとうございます。コードは以下に添付されています

@Override
public void onLocationChanged(Location location) {
 double currentLat=location.getLatitude();
 double currentLon=location.getLongitude();

    if (distance(lat,lon,currentLat,currentLon)<2.0){
 //do what you want to do...
  }
}
4

3 に答える 3

40

実際には、2 つの場所の間の距離を計算する distance という関数を実装する必要があります。2 つの場所の間の距離を計算することは、経度と緯度の値を比較する方法の 1 つです。

それらを比較する例:

@Override
public void onLocationChanged(Location location) {

 double lat2 = location.getLatitude();
 double lng2 = location.getLongitude();

    // lat1 and lng1 are the values of a previously stored location
    if (distance(lat1, lng1, lat2, lng2) < 0.1) { // if distance < 0.1 miles we take locations as equal
       //do what you want to do...
    }
}

/** calculates the distance between two locations in MILES */
private double distance(double lat1, double lng1, double lat2, double lng2) {

    double earthRadius = 3958.75; // in miles, change to 6371 for kilometer output

    double dLat = Math.toRadians(lat2-lat1);
    double dLng = Math.toRadians(lng2-lng1);

    double sindLat = Math.sin(dLat / 2);
    double sindLng = Math.sin(dLng / 2);

    double a = Math.pow(sindLat, 2) + Math.pow(sindLng, 2)
        * Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2));

    double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));

    double dist = earthRadius * c;

    return dist; // output distance, in MILES
}

そしてコトリンでは:

private fun distance(lat1: Double, lng1: Double, lat2: Double, lng2: Double): Double {
    val earthRadius = 3958.75 // in miles, change to 6371 for kilometer output

    val dLat = Math.toRadians(lat2 - lat1)
    val dLng = Math.toRadians(lng2 - lng1)

    val sindLat = sin(dLat / 2)
    val sindLng = sin(dLng / 2)

    val a = sindLat.pow(2.0) +
            (sindLng.pow(2.0) * cos(Math.toRadians(lat1)) * cos(Math.toRadians(lat2)))

    val c = 2 * atan2(sqrt(a), sqrt(1 - a))

    return earthRadius * c // output distance, in MILES
}
于 2013-08-11T08:54:15.323 に答える
16

Locationクラスの静的distanceBetween()メソッドを次のように使用できます。

import android.location.Location

float[] distance = new float[1];

Location.distanceBetween(lat, lon, currentLat, currentLon, distance);

// distance[0] is now the distance between these lat/lons in meters
if (distance[0] < 2.0) {
    // your code...
}

2 つのLocationオブジェクトがある場合、別のオプションはdistanceTo()

于 2015-02-24T19:07:09.753 に答える
0

4 つの入力パラメータはすべて float です。距離は相対距離であり、実際の距離ではありません。オンラインで数式を検索して、この距離を実際の距離に変換する必要があります:(アプリでこれを使用して、現在の場所から最寄りの地下鉄駅を取得しました。このスニペットが誰かの役に立てば幸いです:)

float distance(float lat,float lon,float clat,float clon)
{
    float distance;
    float temp1;
    float temp2;
    temp1=(float)((lat-clat)*(lat-clat));
    temp2=(float)((lon-clon)*(lon-clon));
    distance=temp1+temp2;
    return distance;
}
于 2014-08-17T05:38:01.187 に答える