【问题标题】:Geographic coordinate distance calculation with haversine formula gives the wrong output使用半正弦公式计算地理坐标距离会给出错误的输出
【发布时间】:2020-03-03 01:27:02
【问题描述】:

我正在 c# 中创建一个距离计算器,使用 hasrsine 方程来计算经度和纬度之间的距离,但它给出了错误的输出,任何人都知道为什么吗? 第一个 long 和 lat 值是针对威尔士(班戈)的一个地方,另一个是针对英格兰(曼彻斯特)的一个地方 代码如下:

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");
    }
}

当输出应该是大约130KM时,给出的输出是0.04301075336978381 KM

【问题讨论】:

  • 这里有各种各样的操作。在调试器中单步执行代码时,哪个操作首先返回意外结果?该操作中使用的值是什么?结果如何?预期的结果是什么?为什么?
  • 你能指出你使用的原始数学公式吗?
  • CalcDistance中的第一个*不应该是+吗?
  • 宾果游戏。 @MarcGravell's right
  • @OlivierRogier 如果您从代码中的注释中搜索“haversine 公式”,you end up here

标签: c# latitude-longitude haversine


【解决方案1】:

错误是 *+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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-05
    • 2022-10-21
    • 1970-01-01
    • 2015-07-14
    • 2014-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多