Terkadang parameter ke ACOS()
bisa sedikit lebih besar dari 1 -- sedikit di luar domain fungsi itu -- bila jaraknya kecil. Ada formula jarak yang lebih baik yang tersedia, karena Vincenty. Ia menggunakan ATAN2(y,x)
fungsi daripada ACOS()
fungsi dan lebih stabil secara numerik.
Ini dia.
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))))
Fungsi ini mengembalikan hasilnya dalam derajat. Ada 111,045 km dalam satu derajat. 60 mil laut. 69 mil undang-undang. Jadi kalikan hasilnya dengan salah satu angka tersebut untuk mendapatkan jarak. Ada tulisan yang lebih lengkap, termasuk definisi fungsi tersimpan untuk MySQL, di sini .
Solusi lain adalah dengan menggunakan ISNULL(ACOS(formula), 0.0)