sql >> Base de Datos >  >> RDS >> Mysql

Seleccione puntos de la base de datos del mapa según el radio

A veces, el parámetro para ACOS() puede ser ligeramente mayor que 1, ligeramente fuera del dominio de esa función, cuando las distancias son pequeñas. Hay una mejor fórmula de distancia disponible, gracias a Vincenty. Utiliza el ATAN2(y,x) función en lugar de ACOS() función y por lo tanto es más estable numéricamente.

Esto es todo.

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 función devuelve su resultado en grados. Hay 111.045 km en un grado. 60 millas náuticas. 69 millas terrestres. Así que multiplique el resultado por uno de esos números para obtener distancia. Hay una descripción más completa, que incluye una definición de función almacenada para MySQL, aquí .

Otra solución es usar ISNULL(ACOS(formula), 0.0)