Às vezes, o parâmetro para
ACOS()
pode ser um pouco maior que 1 -- um pouco fora do domínio dessa função -- quando as distâncias são pequenas. Há uma fórmula de distância melhor disponível, devido a Vincenty. Ele usa o ATAN2(y,x)
função em vez do ACOS()
função e, portanto, é mais estável numericamente. É isso.
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))))
Esta função retorna seu resultado em graus. Existem 111,045 km em um grau. 60 milhas náuticas. 69 milhas terrestres. Portanto, multiplique o resultado por um desses números para obter a distância. Há uma descrição mais completa, incluindo uma definição de função armazenada para MySQL, aqui .
Outra solução é usar
ISNULL(ACOS(formula), 0.0)