Raio de busca no Google Maps com MySQL

Raio de busca no Google Maps com MySQL

Durante a pesquisa de novas funcionalidades para o site Meu Combustível, me deparei com uma ferramenta que poderia se tornar útil para o meu site. A partir de um ponto do mapa, mostrar todos os postos em um raio de 1 km a 10 km.

Nisto, encontrei uma consulta SQL, cheio de termos trigonométricos (seno, cosseno, radianos, etc), coisas que só vimos no tempo do segundo grau, ou em cursinhos pré-vestibulares, e que eu achava que nunca mais iria ver novamente.

Como achei um pouco complexo aquela consulta, resolvi pesquisar, e publicar este post para tentar explicar o por quê daquilo tudo.

No início pesquisei como era calculado a distância entre dois pontos, mas logo percebi que eu estava errado. Os dois pontos que eu estava procurando, estão sobre uma esfera (planeta terra). Então temos que procurar por “distancia entre dois pontos em uma esfera”.

Para o cálculo da distância entre dois pontos, temos esta fórmula.

O princípio desta fórmula é encontrar o segmento de curva que une os dois pontos, onde δ1 e δ2 são os valores de latitude dos pontos e λ1 e λ2 os valores de longitude.

Para realizar este cálculo, as variáveis já deverão estar convertidas para radianos. Para encontrar a distância entre dois pontos, basta multiplicar o resultado desta equação por 6380. O valor 6380 corresponde ao raio do planeta terra, medido em Quilômetros.

E como aplicar isto em uma consulta SQL ??

Vamos supor que temos uma base de dados de locais, com suas respectivas latitudes e longitudes. A partir de um ponto com variáveis $latitude e $longitude, vamos apresentar todos os pontos que estão em um raio de 10 km.

SELECT id, nome FROM locais WHERE
ACOS( COS( RADIANS( latitude ) ) * COS( RADIANS( $latitude )) * COS( RADIANS( longitude ) – RADIANS( $longitude )) +
SIN( RADIANS( latitude ) ) * SIN( RADIANS( $latitude ) ) ) * 6380 < 10
ORDER BY distancia

Lembrando a todos, o cos α passa a ser o cosseno inverso (ACOS), e nas variáveis da consulta, adicionamos a função RADIANS para converter os valores para Radianos.

Espero ter contribuído um pouco, e tenham um bom proveito.

Abraço a todos

Referências

http://obsn3.on.br/~jlkm/geopath/

http://spinczyk.net/blog/2009/10/04/radius-search-with-google-maps-and-mysql/

http://paginas.fe.up.pt/~ee99067/docs/Distancias.pdf


About the Author

Jeferson da Luz é formado em Análise de Sistemas, especialista em Redes de Computadores. Estudioso do mercado financeiro.