Czasami parametr ACOS()
może być nieco większa niż 1 — nieco poza dziedziną tej funkcji — gdy odległości są małe. Dostępna jest lepsza formuła odległości, dzięki Vincenty. Używa ATAN2(y,x)
zamiast funkcji ACOS()
funkcja i dlatego jest bardziej stabilna numerycznie.
To jest to.
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))))
Ta funkcja zwraca wynik w stopniach. W jednym stopniu jest 111,045 km. 60 mil morskich. 69 mil statutowych. Więc pomnóż wynik przez jedną z tych liczb, aby uzyskać odległość. Istnieje pełniejszy opis, w tym definicja funkcji przechowywanych dla MySQL, tutaj .
Innym rozwiązaniem jest użycie ISNULL(ACOS(formula), 0.0)