Блог

Формула Гаверсинуса на Python

Формула Haversine

Формула Haversine (на русском — «формула хаверсин») позволяет вычислять расстояние между двумя точками на поверхности Земли с учётом её сферической формы.

Основные моменты

  • Земля приблизительно шарообразная, поэтому обычная геометрия на карте неточна.
  • Формула Haversine вычисляет длину дуги большой окружности — кратчайший путь между двумя точками на сфере.
  • Используются широта (latitude) и долгота (longitude) точек.

Формулы

Пусть есть две точки:

  • Точка 1: (lat1, lon1)
  • Точка 2: (lat2, lon2)
R = 6371  км (радиус Земли)
Δlat = lat2 - lat1
Δlon = lon2 - lon1
a = sin²(Δlat/2) + cos(lat1) * cos(lat2) * sin²(Δlon/2)
c = 2 * arctan2(√a, √(1-a))
d = R * c
    

Здесь:

  • d — расстояние между точками по поверхности Земли в километрах.
  • Это наиболее точное приближение для сферической Земли.

Примечание

Формулы используют радианы для широты и долготы при вычислении тригонометрических функций.

Пример кода на Python

import math


def haversine(lat1, lon1, lat2, lon2):
    R = 6371  # Радиус Земли в километрах
    # Переводим градусы в радианы
    lat1, lon1, lat2, lon2 = map(math.radians, [lat1, lon1, lat2, lon2])

    dlat = lat2 - lat1
    dlon = lon2 - lon1

    a = math.sin(dlat / 2) ** 2 + math.cos(lat1) * math.cos(lat2) * math.sin(dlon / 2) ** 2
    c = 2 * math.atan2(math.sqrt(a), math.sqrt(1 - a))

    distance = R * c
    return distance


# Пример использования:
berlin = (52.52, 13.4)
paris = (48.85, 2.35)

dist = haversine(berlin[0], berlin[1], paris[0], paris[1])
print(f"Расстояние между Берлином и Парижем: {dist:.2f} км")

# Расстояние между Берлином и Парижем: 877.68 км