2011-06-28 19 views
2

ある場所と他の場所のリストとの間の距離を計算する際に問題が発生します(最も近い場所を取得するために)。 私はLocation.distanceBetween(...)とlocation.distanceTo(...)を使って試しましたが、2つのメソッドが動作していますが、どちらも私に別のデータを送ります。Android Location.distanceBetweenとLocation.distanceToの違い

私のデータは、HashMapの基本的な拡張機能であり、場所データ(文字列として変換された整数として)と、ここでは必要ない他のものを含んでいます。

private ArrayList<ConcessionDistance> getMapsConcessionsDistancesFromPoint(ArrayList<ConcessionDistance> al, Location currentLocation) { 
    Location dest; 
    float distance1,distance2; 
    float[] curDist = new float[1]; 
    double lati,longi; 
    Log.i("DBTableConcessions","getMapsConcessionsDistancesFromPoint: Generation d'une map de donnée de concession"); 
    for(ConcessionDistance curConc : al){ 
     //Distance by method 1 
     dest = new Location(LOCATION_PROVIDER); 
     lati = new Double((new Integer(curConc.get("concession_latitude"))) /1e6); 
     longi = new Double((new Integer(curConc.get("concession_longitude"))) /1e6); 
     dest.setLatitude(lati); 
     dest.setLongitude(longi); 
     distance1 = currentLocation.distanceTo(dest); 
     //Distance by method2 
     Location.distanceBetween(
      currentLocation.getLatitude(), 
      currentLocation.getLongitude(), 
      (double) ((new Integer(curConc.get("concession_latitude"))) /1000000), 
      (double) ((new Integer(curConc.get("concession_longitude"))) /1000000), 
      curDist); 
     distance2 = curDist[0]; 
     Log.i("DBTableConcessions","distance :"+distance1+" ou "+distance2);//+" ,lat :"+lati+" ,long "+longi); //+"curDist{0="+curDist[0]+",1="+curDist[1]+",2="+curDist[2]+"}" 
     //Saving one of the distance 
     curConc.put("distance",String.valueOf(distance1)); 
    } 
    return al; 
} 

どこから問題が発生しているのかわかりますか? 私は変換の問題を考えるが、私はそれを自分で解決する問題では深いによ:(

すべてのヘルプは大歓迎だろう事前によるおかげ

編集:。。ここに私のLogCatの一部です。 :私は「ストラスブール」のエミュレータにGPS位置情報を送信するすべてのそれらの都市へとプロセスの距離(それらは東フランスからの都市がある):

06-29 06:37:37.215: INFO/DBTableConcessions(809): distance from EVRY :346254.66 ou 373061.38 
06-29 06:37:37.235: INFO/DBTableConcessions(809): distance from HAGUENAU CEDEX :105491.984 ou 0.0 
06-29 06:37:37.235: INFO/DBTableConcessions(809): distance from BESANCON CEDEX :110127.08 ou 134302.03 
06-29 06:37:37.265: INFO/DBTableConcessions(809): distance from BREST CEDEX 9 :852829.1 ou 820181.7 
06-29 06:37:37.295: INFO/DBTableConcessions(809): distance from HOENHEIM :87783.39 ou 0.0 
06-29 06:37:37.326: INFO/DBTableConcessions(809): distance from COLMAR :28067.428 ou 0.0 
06-29 06:37:37.355: INFO/DBTableConcessions(809): distance from BELFORT :40919.13 ou 134302.03 
06-29 06:37:37.446: INFO/DBTableConcessions(809): distance from SARREBOURG :81606.31 ou 0.0 

それらの都市との間(Googleマップによって与えられた)実際の距離"ストラスブール"は:
エブリー:520キロ(法1:ミス175キロ、方法2:ミス145キロ)
アグノー:30キロ
ブザンソン:250キロ(法1:ミス140キロ、方法2(法1:リターン0:70キロ、方法2を追加) :ミス120キロ)
ブレスト:1070キロ(法1:ミス200キロ、方法2:ミス230キロ)
ホエンハイム:5キロ(法1:80キロを追加し、方法2:リターン0)
コルマール:75キロ(法1:ミス50km、方法2:リターン0)
ベルフォール:155キロ(法1:ミス110キロ、方法2:20キロを欠場)
サールブール:75キロ(法1:5キロ、方法2を欠場:リターン0)

だから我々はその第二の方法の戻り値を知ることができます実際の距離が〜100kmを下回っている場合は、方法1の場合、ロジックは表示されません。/

+0

あなたはどんな入力を期待していましたか、あなたが実際に受け取った結果を分かち合いましょうか? – Travis

+1

これを追加するために私の最初の投稿を編集しました –

+0

さらに、MapViewによく表示されるので、問題は私のリストの最初のデータから来ていません... –

答えて

1

この問題に対する修正は です。まずlati、longiに正しい値を入力する必要がありました。

lati = Double.valueOf(curConc.get("concession_latitude"))/1000000; 

この方法では、すべての方法で同じ距離が得られるため、計算方法がうまく動作します。

その後、パラメータで指定された場所も正しくありませんでした。 実際には小数点データは含まれていません。だから私は問題があることを知っているが、私はそれを解決する方法を知らない。実際に私に悪いデータを与えた行はここにあります

final LocationManager manag = (LocationManager)getSystemService(Context.LOCATION_SERVICE); 
      //Choix du service de localisation en fonction de critères 
      Criteria crit = new Criteria(); 
      crit.setCostAllowed(false); 
      crit.setAccuracy(100); //précis à 1km pret 
      String choix_source = manag.getBestProvider(crit, true); 
      //demander la position courante 
      manag.requestLocationUpdates(choix_source, 10000, 0, new LocationListener(){ //toutes les 10 secondes 
       //Lors de la capture de la position 
       public void onLocationChanged(Location location) { 
       .... 
関連する問題