Někdy parametr na ACOS()
může být jen o málo větší než 1 -- mírně mimo doménu této funkce -- když jsou vzdálenosti malé. Díky Vincentymu je k dispozici lepší vzorec vzdálenosti. Používá ATAN2(y,x)
namísto ACOS()
funkce a tak je numericky stabilnější.
To je ono.
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))))
Tato funkce vrací výsledek ve stupních. Ve stupni je 111 045 km. 60 námořních mil. 69 zákonných mil. Takže vynásobte výsledek jedním z těchto čísel, abyste získali vzdálenost. Existuje úplnější zápis, včetně definice uložené funkce pro MySQL, zde .
Dalším řešením je použití ISNULL(ACOS(formula), 0.0)