【问题标题】:Trying to get the distance with C#试图用 C# 获得距离
【发布时间】:2017-08-04 02:08:00
【问题描述】:

我需要发现哪个是主列表中更接近的项目,其项目具有纬度和经度。我遇到了这个脚本,我用来返回以公里为单位的距离......但返回的项目不是更近的项目......有人知道它为什么不起作用吗?非常感谢! 我正在使用 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 从未完成,我从未到达“返回”行...

【问题讨论】:

  • 您是否尝试过调试它?对于列表中的每个项目,验证距离计算是否返回正确的值。然后,一旦您验证了这一点,找出距离比较返回错误项目的原因。
  • 我现在正在做..
  • 我使用了其他的 iternet 代码,结果总是相同的错误项目...我认为这种方法有一些我不知道的地方
  • 或者我的实现(if)是错误的]
  • 尝试改用 Double.Parse - 它可以让您更好地控制格式和语言环境

标签: c# xamarin geolocation distance


【解决方案1】:

您对 haversine 公式的实现似乎是错误的。应该是:

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

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

Source

【讨论】:

  • @JoycedeLanna 没什么特别的,你可以使用System.Math 中定义的函数来做任何事情。 ΔφΔλ 只是两个点之间的经纬度增量。
  • 在 SO 和网络上的其他地方有许多此函数的 C# 实现
  • 问题是我的网络服务给了我一个带点而不是逗号的数字......但是当我使用 .Replace 它工作一点然后停止
猜你喜欢
  • 1970-01-01
  • 2017-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-04
  • 2017-03-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多