C# 尝试用C获得距离#

C# 尝试用C获得距离#,c#,xamarin,geolocation,distance,C#,Xamarin,Geolocation,Distance,我需要发现哪个是主列表中比较接近的项,它的项有纬度和经度。我遇到了这个脚本,我用它来返回以公里为单位的距离…但是返回的项目不是更近的项目…有人知道为什么它不起作用吗?非常感谢! 我使用的是xamarin forms c# 对不起,我的英语不是很好 public static Loja EncontraLojaPerto(List<Loja> lojaList, double lat1, double lon1, char unit) { Loja lojaP

我需要发现哪个是主列表中比较接近的项,它的项有纬度和经度。我遇到了这个脚本,我用它来返回以公里为单位的距离…但是返回的项目不是更近的项目…有人知道为什么它不起作用吗?非常感谢! 我使用的是xamarin forms 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;
    }
公共静态Loja EncentraloJaperto(列表lojaList,双lat1,
双lon1,字符单元)
{
Loja lojaProxima=新Loja();
双二级距离=1;
foreach(lojaList中的var项目)
{
double lat2=Convert.ToDouble(item.latitude.Replace(“.”、“,”);
double lon2=Convert.ToDouble(item.longitude.Replace(“.”、“,”);
Func deg2Rad=(x)=>(x*(Math.PI/180));
Func rad2Deg=(x)=>(x/Math.PI*180.0);
varθ=lon1-lon2;
var dist=数学Sin(deg2Rad(lat1))*数学Sin(deg2Rad(lat2))+数学Cos(deg2Rad(lat1))*数学Cos(deg2Rad(lat2))*数学Cos(deg2Rad(theta));
dist=数学Acos(dist);
dist=rad2Deg(dist);
dist=dist*60*1.1515;
开关(单位)
{
案例“K”:
dist=dist*1.609344;
打破
案例“N”:
dist=dist*0.8684;
打破
}
//验证是否可以在一个区域内进行
int retval=distAuxiliar.CompareTo(dist);
如果(返回值>0 | |距离等于(-1))
{
distAuxiliar=dist;
lojaProxima=项目;
}
}
返回lojaProxima;
}

我在寻找答案,我发现了:在巴西,我们使用“,”代替“,”和“,”代替“…然后,我的Web服务给我一个带“,”的numver,当我需要一个“,”时,我使用了.Replace来替换“,”,但是,当我使用它时,这个数字改变了它的字符数量(如果它是123.4300,现在是123,43)…当我使用Replace时,这些数字起作用了,但foreach永远不会结束,我也永远不会到达“返回”行…

您对哈弗森公式的执行似乎是错误的。应该是:

a = sin²(Δφ/2) + cos φ1 ⋅ cos φ2 ⋅ sin²(Δλ/2)
c = 2 ⋅ atan2( √a, √(1−a) )
d = R ⋅ c
其中,
φ
为纬度,
λ
为经度,
R
为地球半径(平均半径=6371km)


您是否尝试过对此进行调试?对于列表中的每个项目,验证距离计算返回的值是否正确。然后,一旦你验证了这一点,找出为什么距离比较返回了错误的项。我现在正在这样做。我使用了其他的iternet代码,结果总是相同的错误项…我想关于这个方法我不知道或者我的实现(if)错误]尝试改用Double.Parse-它可以让您更好地控制格式和locale@JoycedeLanna没有什么特别的,您可以使用
System.Math
中定义的函数完成所有操作
Δφ
Δλ
只是两个点之间纬度和经度的增量。在SO和Web上的其他地方有许多此函数的C#实现。问题是我的Web服务给我一个带点的数字,而不是逗号…但是当我使用时。请稍微替换它,然后停止