Расчет расстояния по географическим координатам по формуле haversine дает неверный вывод - PullRequest
3 голосов
/ 06 ноября 2019

Я создаю калькулятор расстояний в c #, используя уравнение haversine для вычисления расстояния между долготой и широтой, но он дает неправильный вывод, может кто-нибудь понять почему? первые значения 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");
    }
}

Выходная мощность составляет 0,04301075336978381 КМ, когда выходнойдолжно быть примерно 130 км

1 Ответ

4 голосов
/ 06 ноября 2019

Ошибка * против + (первая в 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...