Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

PHP MySql e geolocalização


Calcular a distância usando essa função é bastante caro computacionalmente, porque envolve um monte de funções transcendentais. Isso será problemático quando você tiver um grande número de linhas para filtrar.

Aqui está uma alternativa, uma aproximação que é muito menos cara computacionalmente:

Distância aproximada em milhas:
sqrt(x * x + y * y)

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

Você pode melhorar a precisão deste cálculo de distância aproximada adicionando a função matemática do cosseno:

Distância aproximada melhorada em milhas:
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

Executei vários testes com conjuntos de dados gerados aleatoriamente.
  • A diferença de precisão para os 3 algoritmos é mínima , especialmente em distâncias curtas
  • O algoritmo mais lento é, obviamente, aquele com as funções trigonométricas (aquele da sua pergunta). É 4x mais lento que os outros dois.

Definitivamente não vale a pena. Basta fazer uma aproximação.
O código está aqui:http://pastebin.org/424186

Para usar isso no MySQL, crie um procedimento armazenado que recebe argumentos de coordenadas e retorna a distância, então você pode fazer algo como:
SELECT columns 
  FROM table 
 WHERE DISTANCE(col_x, col_y, target_x, target_y) < 25