使用Haversine公式进行地理坐标距离计算结果错误

3

我正在使用C#创建一个距离计算器,使用Haversine公式来计算经度和纬度之间的距离,但它给出的输出是错误的,有人能看出为什么吗? 第一组经纬度值是威尔士(班戈)的位置,另一个是英格兰(曼彻斯特)的位置。 以下是代码:

using System;

public static class Program
{
    static double toRadians(double angle)
    {
        return (angle * Math.PI) / 180;
    }

    static double CalcDistance(double lon1, double lon2, double lat1, double lat2)
    {
        lon1 = toRadians(lon1);
        lon2 = toRadians(lon2);
        lat1 = toRadians(lat1);
        lat2 = toRadians(lat2);
        //haversine formula
        double dlat, dlon;
        dlat = lat2 - lat1;
        dlon = lon2 - lon1;
        double a = Math.Pow(Math.Sin(dlat / 2), 2) *
            Math.Cos(lat1) * Math.Cos(lat2) *
            Math.Pow(Math.Sin(dlon / 2), 2);
        double c = 2 * Math.Asin(Math.Sqrt(a));
        // earths radius is KM, use 3956 for miles
        double earthRadius = 6371;
        return (c * earthRadius);
    }



    static void Main(String[] args)
    {
        double lat1, lat2, lon1, lon2;
        lon1= 53.222469;
        lat1 = -4.129424;
        lon2 = 53.244697;
        lat2 = -2.13195;
        Console.WriteLine(CalcDistance(lon1, lon2, lat1, lat2) + " KM");
    }
}

给出的输出是0.04301075336978381公里,而实际输出应该大约为130公里。

1
这里执行了各种操作。当你通过调试器逐步运行代码时,哪个操作首先返回了意外的结果?在该操作中使用了哪些值?结果是什么?期望的结果是什么?为什么? - David
1
请问您能指出您使用的原始数学公式吗? - user12031933
3
“CalcDistance” 中的第一个“*” 应该改成“+” 吗? - Marc Gravell
Bingo。@MarcGravell的正确 - canton7
1
如果你从代码的评论中谷歌“haversine公式”,你会找到这里 - canton7
1个回答

6
错误在于CalcDistance函数中的第一个*+之间的区别,但以下是对https://www.movable-type.co.uk/scripts/latlong.html进行的直接转换,供参考(还将this添加到static double toRadians(this double angle)中,以使其成为扩展方法):
static double CalcDistance(double lon1, double lon2, double lat1, double lat2)
{
    const double R = 6371;
    var φ1 = lat1.toRadians();
    var φ2 = lat2.toRadians();
    var Δφ = (lat2 - lat1).toRadians();
    var Δλ = (lon2 - lon1).toRadians();

    var a = Math.Sin(Δφ / 2) * Math.Sin(Δφ / 2) +
            Math.Cos(φ1) * Math.Cos(φ2) *
            Math.Sin(Δλ / 2) * Math.Sin(Δλ / 2);
    var c = 2 * Math.Atan2(Math.Sqrt(a), Math.Sqrt(1 - a));

    var d = R * c;
    return d;
}

C# 中允许使用希腊字符吗? - ina
1
@ina 是的,基本上;有规则规定哪些Unicode类别/子类别是有效的,比如说标识符,但大多数你期望能够工作的东西都可以工作。 - Marc Gravell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接