2011-12-13 8 views
1

Iは、2つのGPS位置、latitute値と経度値とそれぞれの間の距離を計算します。近距離結果の計算は正確でなければなりません。例えば。 < 300m。 Google Earthを使用している場合(コード内のcoordを参照)、距離は〜136mです。私は、物品が提供するソリューションを使用する場合 :http://www.movable-type.co.uk/scripts/latlong.html(半正矢式)の結果は、その近くには何もありません。私はそれはいくつかのマイナーな変更する必要があります確信しているが、私はそれを見ることができないGPS距離算出

public void GpsCalc(){ 
    double d = getDistance(51.342299,4.371359, 51.342490,4.371997); 
    Log.e("GpsCalc", String.valueOf(d)); 
} 

public static double getDistance(double lat1, double lng1, double lat2, double lng2){ 
    double R = 6371; // earth’s radius (mean radius = 6,371km) 
    double dLat = Math.toRadians(lat2-lat1); 

    double dLon = Math.toRadians(lng2-lng1); 
    double a = Math.sin(dLat/2) * Math.sin(dLat/2) + 
       Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2)) * 
       Math.sin(dLon/2) * Math.sin(dLon/2); 
    double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
    double dr1 = R * c;//in radians  

    Log.e("getDistance-dr1", String.valueOf(dr1)); 

    return dr1; 
} 

は、コードを使用していました。

+0

Googleが 'アンドロイドのGPS distance'のための答えの多くを提供します。たとえば:http://www.tutorials-android.com/learn/How_to_calculate_the_distance_between_two_GPS_coordinates.rhtml –

+0

...あなたが<300メートル期待していることを述べたが、それはあなたが取得している正確に何ですか?そのページに座標を入れたり、コードを実行したりすると、0.049km = 49mになります。あなたの問題は、Google Earthにもっと近いものを期待していますか? – kabuko

+0

かぶこ、それはまさに私の問題です。 GoogleEarthはより現実的な136mを返します。私は10m未満の小さな偏差は気にしませんが、136と49の違いは大きすぎます。 –

答えて

1

私も、そのページ上の半正矢公式に問題がありました。あなたの質問に対する答えは正確ではないことは分かっていますが、Google Earthと同じ結果をもたらすコサイン式の法則でより多くの成功を収めました。ケースでは、それはこのように見えた、助け:

public double getDistance(double lat1, double lon1, double lat2, double lon2) { 
    double latA = Math.toRadians(lat1); 
    double lonA = Math.toRadians(lon1); 
    double latB = Math.toRadians(lat2); 
    double lonB = Math.toRadians(lon2); 
    double cosAng = (Math.cos(latA) * Math.cos(latB) * Math.cos(lonB-lonA)) + 
        (Math.sin(latA) * Math.sin(latB)); 
    double ang = Math.acos(cosAng); 
    double dist = ang * EARTH_RADIUS; 
    return dist; 
} 

編集:私は、GoogleマップやGoogle Earthで、私のコードでは、あなたの座標を試みたが、私はそれらのすべてのために49メートルを取得しています

。多分問題はなかったでしょうか? screenshot

+0

スティーブ、コードは基本的に同じ49mを返します。あなたは私が使った座標でテストすることができますか? Google Earthが間違っているとは想像できません。 –

+0

http://www.movable-type.co.uk/scripts/latlong.htmlに座標値を入力すると計算が正しいです。だから、上の関数とそのサイトの理論的な関数との間には細かな違いがなければならない。 –

+0

FWIW、私はまた、http://www.movable-type.co.uk/scripts/latlong.htmlで49mの結果を得ています。 –

1
少し遅れ

が、Apple Corelocation(49.2733メートル)

CLLocation *currentLocation = [[CLLocation alloc] initWithLatitude:_posGPSCurrent.latitude longitude:_posGPSCurrent.longitude]; 

CLLocation *location = [[CLLocation alloc] initWithLatitude:_posGPSTarget.latitude longitude:_posGPSTarget.longitude]; 

// in kilometers 
CLLocationDistance distance =[currentLocation distanceFromLocation:location]/1000; 
  • マニュアル計算(49.1393メートル)

  • を使用して2つの以上の選択肢

    1. を含めます数学ライブラリ

      #include <math.h> 
      
      // distance in Kilometers (Haversine) 
      
      -(double)distanceFromGPSlat1:(double)tlat1 lon2:(double)tlon1 lat2:(double)tlat2 lon2:(double)tlon2 
      { 
      double distance = ((acos(sin(tlat1*M_PI/180)*sin(tlat2*M_PI/180)+cos(tlat1*M_PI/180)*cos(tlat2*M_PI/180)*cos((tlon1-tlon2)*M_PI/180))*180/M_PI)*60*1.1515*1.609344); 
      
      return distance; 
      } 
      

      おそらく、私は第二の方法(マニュアル計算)を好みます。