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


Bom Dia Jeferson
Estou com dificuldades para buscar coordenadas dentro de um raio, a partir de um ponto central.
Uso no SQL SERVER e estou com dúvidas.
Pode me ajudar?
Abraço
Boa tarde
Qual é o seu problema ?
No meu trabalho mexo com mssql, na duvida posso consultar os meus colegas de serviço
Abraço
Boa tarde Jeferson.
Estou com problemas na utilização da API Google Maps para o desenvolvimento de um trabalho universitário. Sou estudante de ADS.
Acredito q vc possa me ajudar.
Gostaria de poder entrar em contato com vc por email ou msn se possivel.
Grato!
Sem problemas amigo
Já estou lhe enviando um e-mail
Abraço
Amigo estou trablhando no meu TCC que onde falarei de um prejeto de geofense para escolas primarias, você tem algum material ou algum site que aprofunde este assunto? Obrigado!
Bom dia colega
Sobre o assunto que você citou, infelizmente não tenho nada, na verdade não visto falar do mesmo até então…hehe
Um grande abraço
Ola!
Estou fazendo um projeto onde preciso achar igrejas mais proximas de um determinado ponto, tenho um banco de dados com as latitudes e longitudes de algumas igrejas ja cadastradas, ai achei essa sua consulta e fiz um teste no phpmyadmin mas deu um erro,.. troquei onde esta as variaveis latitude e longitude por -22.6667 e -45.0167 q eh a cidade onde estou e onde esta latitude e longitude sem ser variavel coloquei os campos do banco, mas deu um erro de sql… vc poderia me dar uma luz? Obrigada!
Me repasse qual o erro que te apresentou e a consulta para a gente averiguar
Jeferson esta bola negra que é a esfera que mede o diametro no seu site. como vc conseguiu desenvolver ela?
Perfeito Jeferson! Funcionou muito bem!
Tenho uma base de dados com posição de todas as cidades do Brasil, caso precisar.
Utilizei a seguinte query:
SELECT descricao FROM tabela
WHERE ACOS( COS( RADIANS( x(coordenada) ) ) * COS( RADIANS( -22.9060594 ) * COS( RADIANS( Y(coordenada) ) – RADIANS( -43.1872207 ) + SIN( RADIANS( x(coordenada) ) ) * SIN( RADIANS(-22.9060594 ) ) ))) * 6380 < 1
para localizar num raio de 1km……….
Na minha base uso point no campo coordenada onde armazena a latitude e longitude………Não está retornando nada..
Pode ajudar.