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

Distanza di geolocalizzazione SQL da una tabella delle città

Se puoi limitare la distanza massima tra le tue città e la tua posizione locale, approfitta del fatto che un minuto di latitudine (nord - sud) è un miglio nautico.

Metti un indice sulla tua tabella di latitudine.

Crea una funzione memorizzata haversine(lat1, lat2, long1, long2, unit) dalla formula haversine mostrata nella tua domanda. Vedi sotto

Quindi fallo, data la mia latitudine, la mia longitudine e i miei km.

SELECT * 
  from cities a
 where :mylatitude >= a.latitude  - :mykm/111.12
   and :mylatitude <= a.latitude  + :mykm/111.12
   and haversine(:mylatitude,a.latitude,:mylongitude,a.longitude, 'KM') <= :mykm
 order by haversine(:mylatitude,a.latitude,:mylongitude,a.longitude, 'KM')

Questo utilizzerà un riquadro di delimitazione della latitudine per escludere grossolanamente le città che sono troppo lontane dal tuo punto. Il tuo DBMS utilizzerà una scansione dell'intervallo di indici sul tuo indice di latitudine per selezionare rapidamente le righe nella tabella delle città che vale la pena considerare. Quindi eseguirà la tua funzione haversine, quella con tutta la matematica seno e coseno, solo su quelle righe.

Suggerisco la latitudine perché la distanza al suolo della longitudine varia con la latitudine.

Nota che questo è grezzo. Va bene per un cercatore di negozi, ma non usarlo se sei un ingegnere civile:la terra ha una forma ellittica e questo presuppone che sia circolare.

(Scusa per il numero magico 111,12. Questo è il numero di km in un grado di latitudine, cioè in sessanta miglia nautiche.)

Vedi qui per una funzione di distanza praticabile.

Perché questa funzione memorizzata in MySQL fornisce risultati diversi rispetto all'esecuzione del calcolo nella query?