Soms is de parameter naar ACOS()
kan net iets groter zijn dan 1 -- iets buiten het domein van die functie -- wanneer de afstanden klein zijn. Dankzij Vincenty is er een betere afstandsformule beschikbaar. Het gebruikt de ATAN2(y,x)
functie in plaats van de ACOS()
functie en is dus numeriek stabieler.
Dit is het.
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))))
Deze functie retourneert het resultaat in graden. Er zijn 111.045 km in een graad. 60 zeemijl. 69 statutaire mijlen. Dus vermenigvuldig het resultaat met een van die getallen om afstand te krijgen. Er is een meer complete beschrijving, inclusief een opgeslagen functiedefinitie voor MySQL, hier .
Een andere oplossing is het gebruik van ISNULL(ACOS(formula), 0.0)