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

PHP MySql e geolocalizzazione

Calcolare la distanza usando quella funzione è piuttosto costoso dal punto di vista computazionale, perché coinvolge un intero gruppo di funzioni trascendentali. Questo sarà problematico quando hai un numero elevato di righe su cui filtrare.

Ecco un'alternativa, un'approssimazione molto meno costosa dal punto di vista computazionale:

Distanza approssimativa in miglia:

sqrt(x * x + y * y)

where x = 69.1 * (lat2 - lat1) 
and y = 53.0 * (lon2 - lon1) 

Puoi migliorare la precisione di questo calcolo della distanza approssimativa aggiungendo la funzione matematica del coseno:

Migliorata la distanza approssimativa in miglia:

sqrt(x * x + y * y)

where x = 69.1 * (lat2 - lat1) 
and y = 69.1 * (lon2 - lon1) * cos(lat1/57.3) 

Fonte:http://www.meridianworlddata.com/Distance-Calculation.asp

Ho eseguito una serie di test con set di dati generati casualmente.

  • La differenza di precisione per i 3 algoritmi è minima , soprattutto a brevi distanze
  • L'algoritmo più lento è, ovviamente, quello con le funzioni trigonometriche (quello sulla tua domanda). È 4 volte più lento degli altri due.

Sicuramente non ne vale la pena. Basta fare un'approssimazione.
Il codice è qui:http://pastebin.org/424186

Per utilizzarlo su MySQL, crea una procedura memorizzata che accetta argomenti di coordinate e restituisce la distanza, quindi puoi fare qualcosa come:

SELECT columns 
  FROM table 
 WHERE DISTANCE(col_x, col_y, target_x, target_y) < 25