Вычисление расстояния между координатами (широта/долгота) в C#

Чтобы вычислить расстояние между координатами по широте и долготе в C#, вы можете использовать различные формулы. Вот несколько методов, которые вы можете рассмотреть:

  1. Формула гаверсина.
    Формула гаверсина обычно используется для расчета расстояния между двумя точками на сфере (например, на Земле) с использованием их координат широты и долготы. Вот пример реализации на C#:
public static double CalculateDistance(double lat1, double lon1, double lat2, double lon2)
{
    var R = 6371; // Radius of the Earth in kilometers
    var dLat = ToRadians(lat2 - lat1);
    var dLon = ToRadians(lon2 - lon1);
    var a = Math.Sin(dLat / 2) * Math.Sin(dLat / 2) +
            Math.Cos(ToRadians(lat1)) * Math.Cos(ToRadians(lat2)) *
            Math.Sin(dLon / 2) * Math.Sin(dLon / 2);
    var c = 2 * Math.Atan2(Math.Sqrt(a), Math.Sqrt(1 - a));
    var distance = R * c; // Distance in kilometers
    return distance;
}
public static double ToRadians(double degrees)
{
    return degrees * Math.PI / 180;
}
  1. Сферический закон косинусов.
    Сферический закон косинусов — это еще одна формула, которую можно использовать для расчета расстояния между двумя точками на сфере. Вот пример реализации на C#:
public static double CalculateDistance(double lat1, double lon1, double lat2, double lon2)
{
    var R = 6371; // Radius of the Earth in kilometers
    var dLon = ToRadians(lon2 - lon1);
    var distance = Math.Acos(Math.Sin(ToRadians(lat1)) * Math.Sin(ToRadians(lat2)) +
                    Math.Cos(ToRadians(lat1)) * Math.Cos(ToRadians(lat2)) *
                    Math.Cos(dLon)) * R;
    return distance;
}
public static double ToRadians(double degrees)
{
    return degrees * Math.PI / 180;
}
  1. Формула Винсенти:
    Формула Винсенти — более точный метод расчета расстояния между двумя точками на поверхности Земли. В отличие от предыдущих формул, она учитывает эллипсоидную форму Земли. Реализация формулы Винсенти на C# немного сложнее и требует итеративных вычислений. Вот пример реализации с использованием библиотеки GeographicLib:
using GeographicLib;
public static double CalculateDistance(double lat1, double lon1, double lat2, double lon2)
{
    var geodetic = new Geodesic(Constants.WGS84_a, Constants.WGS84_f);
    var result = geodetic.Inverse(lat1, lon1, lat2, lon2);
    var distance = result.s12 / 1000; // Distance in kilometers
    return distance;
}

Пакет NuGet для использования приведенного выше фрагмента кода.

Подводя итог, вы можете рассчитать расстояние между координатами, используя такие формулы, как формула Хаверсина, сферический закон косинусов или формула Винсенти. Выберите метод, который лучше всего соответствует вашим требованиям к точности и ограничениям производительности.