试图与C#保持距离

时间:2017-08-03 16:21:24

标签: c# xamarin geolocation distance

我需要发现哪个是主列表中哪个项目具有纬度和经度的最接近的项目。我遇到了这个剧本,我用它来返回公里的距离...但是返回的项目不是更接近的项目...有人知道它为什么不起作用?非常感谢! 我正在使用xamarin表单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;
    }

我正在寻找答案,我找到了答案:在巴西,我们使用','而不是'。'和'。'而','...然后,我的网络服务给了我一个'。'的数字。当我需要','时,我用.Replace替换'。',但是,当我使用它时,数字会改变它的字符数量(如果它是123.4300现在它是123,43)......当我使用了替换,数字有效,但是foreach从未完成,我从未到达'返回'线......

1 个答案:

答案 0 :(得分:1)

您对 hasrsine 公式的实施似乎是错误的。它应该是:

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

其中φ是纬度,λ是经度,R是地球的半径(平均半径= 6,371公里);

Source