2017-08-03 43 views
0

我需要發現哪個是主列表中它的項目具有經度和緯度的更接近的項目。我遇到了這個腳本,我用它來返回公里的距離......但是返回的項目不是更接近的項目......有人知道它爲什麼不起作用嗎?十分感謝! 我正在使用xamarin表單c# 我的英語不太好,對不起。試圖用C獲得距離#

public static Loja EncontraLojaPerto(List<Loja> lojaList, double lat1, 
double lon1, char unit) 
    { 
     Loja lojaProxima = new Loja(); 
     double distAuxiliar = -1; 

     foreach (var item in lojaList) 
     { 
      double lat2 = Convert.ToDouble(item.latitude.Replace('.',',')); 
      double lon2 = Convert.ToDouble(item.longitude.Replace('.',',')); 

      Func<double, double> deg2Rad = (x) => (x * (Math.PI/180)); 
      Func<double, double> rad2Deg = (x) => (x/Math.PI * 180.0); 

      var theta = lon1 - lon2; 
      var dist = Math.Sin(deg2Rad(lat1)) * Math.Sin(deg2Rad(lat2)) + Math.Cos(deg2Rad(lat1)) * Math.Cos(deg2Rad(lat2)) * Math.Cos(deg2Rad(theta)); 

      dist = Math.Acos(dist); 
      dist = rad2Deg(dist); 
      dist = dist * 60 * 1.1515; 

      switch (unit) 
      { 
       case 'K': 
        dist = dist * 1.609344; 
        break; 
       case 'N': 
        dist = dist * 0.8684; 
        break; 
      } 

      //verificando se essa pode ser a distância menor 
      int retval = distAuxiliar.CompareTo(dist); 

      if (retval > 0 || distAuxiliar.Equals(-1)) 
      { 
       distAuxiliar = dist; 
       lojaProxima = item; 
      } 
     } 

     return lojaProxima; 
    } 

我正在尋找答案,我發現它:在這裏,在巴西,我們使用','來代替'。和'。'相反','...然後,我的web服務給我一個數字與'。'當我需要一個',',然後我用。替換'。',但是,當我使用它時,數字會改變它的字符數量(如果它是123.4300,現在它是123,43)...當我使用的替換,數字工作,但foreach永遠不會完成,我永遠不會到達「返回」線...

+0

你有沒有試圖調試過這一切?對於列表中的每個項目,驗證距離calc返回正確的值。然後,一旦你證實了這一點,找出爲什麼距離比較返回錯誤的項目。 – Jason

+0

我正在做它.. –

+0

我使用其他iternet代碼關於它和結果總是相同的錯誤項目...我認爲有一些關於這種方法,我不知道 –

回答

1

您的實施haversine公式似乎是錯誤的。它應該是:

a = sin²(Δφ/2) + cos φ1 ⋅ cos φ2 ⋅ sin²(Δλ/2) 
c = 2 ⋅ atan2(√a, √(1−a)) 
d = R ⋅ c 

其中φ是緯度,λ是經度和R是地球半徑(平均半徑=6371公里);

Source

+0

上帝!我怎麼寫它?大聲笑 –

+0

@JoycedeLanna沒什麼特別的,你可以用'System.Math'中定義的函數做所有事情。 「Δφ」和「Δλ」只是兩點之間緯度和經度的增量。 – InBetween

+0

這個函數在SO和其他地方有很多C#的實現 – Jason