Mysql
 sql >> Database >  >> RDS >> Mysql

Seleziona i punti dal database della mappa in base al raggio

A volte il parametro per ACOS() può essere solo leggermente maggiore di 1 -- leggermente al di fuori del dominio di quella funzione -- quando le distanze sono piccole. C'è una formula di distanza migliore disponibile, grazie a Vincenty. Usa il ATAN2(y,x) funzione anziché ACOS() funzione e quindi è numericamente più stabile.

Questo è tutto.

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))))

Questa funzione restituisce il risultato in gradi. Ci sono 111.045 km in un grado. 60 miglia nautiche. 69 miglia statutarie. Quindi moltiplica il risultato per uno di quei numeri per ottenere la distanza. C'è una descrizione più completa, inclusa una definizione di funzione memorizzata per MySQL, qui .

Un'altra soluzione è usare ISNULL(ACOS(formula), 0.0)