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

Distância de geolocalização SQL de uma tabela de cidades


Se você puder limitar a distância máxima entre suas cidades e sua posição local, aproveite o fato de que um minuto de latitude (norte - sul) é uma milha náutica.

Coloque um índice em sua tabela de latitude.

Faça você mesmo uma função armazenada haversine(lat1, lat2, long1, long2, unit) a partir da fórmula haversine mostrada em sua pergunta. Veja abaixo

Então faça isso, considerando minha latitude, minha longitude e meu 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')

Isso usará uma caixa delimitadora de latitude para descartar grosseiramente as cidades que estão muito longe do seu ponto. Seu DBMS usará uma varredura de intervalo de índice em seu índice de latitude para selecionar rapidamente as linhas em sua tabela de cidades que valem a pena considerar. Em seguida, ele executará sua função haversine, aquela com todas as matemáticas de seno e cosseno, apenas nessas linhas.

Eu sugiro latitude porque a distância no solo da longitude varia com a latitude.

Observe que isso é bruto. É bom para um localizador de lojas, mas não o use se você for um engenheiro civil - a Terra tem uma forma elíptica e isso pressupõe que seja circular.

(Desculpe pelo número mágico 111,12. Esse é o número de km em um grau de latitude, ou seja, em sessenta milhas náuticas.)

Veja aqui uma função de distância viável.

Por que esta função armazenada do MySQL fornece resultados diferentes de fazer o cálculo na consulta?