Понякога параметърът към ACOS()
може да бъде малко по-голямо от 1 - малко извън областта на тази функция - когато разстоянията са малки. Налична е по-добра формула за разстояние, благодарение на Vincenty. Той използва ATAN2(y,x)
функция, а не ACOS()
функция и така е по-стабилна числено.
Това е.
DEGREES(
ATAN2(
SQRT(
POW(COS(RADIANS(lat2))*SIN(RADIANS(lon2-lon1)),2) +
POW(COS(RADIANS(lat1))*SIN(RADIANS(lat2)) -
(SIN(RADIANS(lat1))*COS(RADIANS(lat2)) *
COS(RADIANS(lon2-lon1))) ,2)),
SIN(RADIANS(lat1))*SIN(RADIANS(lat2)) +
COS(RADIANS(lat1))*COS(RADIANS(lat2))*COS(RADIANS(lon2-lon1))))
Тази функция връща резултата си в градуси. Има 111,045 км в градус. 60 морски мили. 69 статутни мили. Така че умножете резултата по едно от тези числа, за да получите разстояние. Има по-пълно описание, включително дефиниция на съхранена функция за MySQL, тук .
Друго решение е да използвате ISNULL(ACOS(formula), 0.0)