Вот длинная формула для расчета расстояния между двумя точками координат на Земле
= ACOS(COS(RADIANS(90-LAT1)) * COS(RADIANS(90-LAT2)) +SIN(RADIANS(90-LAT1)) * SIN(RADIANS(90-LAT2)) * * COS(RADIANS(Long1-Long2))) * 6371
Так как использовать его в других формулах немного громоздко, я написал для него определенную пользователем функцию.
Функция DistXY(Lat1 как одиночный, Lng1 как одиночный, Lat2 как одиночный, Lng2 как одиночный) как одиночный
DistXY = WorksheetFunction.Экос (Cos (WorksheetFunction.Радианы (90 - Lat1)) * Cos (Функция листа).Радианы (90 - Lat2)) + Sin (Функция листа).Радианы (90 - Lat1)) * Грех (функция листа).Радианы (90 - Lat2)) * Cos (Функция листа).Радианы (Lng1 - Lng2))) * 6371
Конечная функция
Как видите, они точно такие же. Поскольку в VBA нет функций Acos ou Radians, он даже использует метод worksheetFunction.
Почему, когда я применяю формулу тезисов к одной и той же паре координат XY, я получаю разные результаты?
Например:
От ABC 45.4960674, -73.514446 до XYZ 43.5369, -71.8592
DistXY() результаты: 254.313156128
Метод длинных формул: 254.313268914
Следуя комментариям @raystafarian, изменение всех типов на двойные улучшило точность. Но есть еще разница.
Функция DistXY(Lat1 как двойной, Lng1 как двойной, Lat2 как двойной, Lng2 как двойной) Как двойной ...
Новые результаты:
DistXY() : 254,316868913 5060 км
Длинная формула метода: 254.313268913 5250 км