Hey guys!
Nesse post, vou demonstrar a vocês como calcular a distância entre dois locais utilizando latitude e longitude (sem API). Em março de 2017, eu demonstrei como fazer isso utilizando a API do Google Maps, no post SQL Server – Como calcular a distância entre dois pontos utilizando a API do Google (CEP, endereço ou latitute e longitude), mas no post de hoje, a distância será calculada apenas utilizando matemática e geometria
Esse cálculo, ao invés de utilizar uma API, pode ser especialmente útil para calcular a distância entre um grande volume de pontos geográficos (a API do Google possui limitações de quantidade de consultas por dia, no plano gratuito).
É importante observar que o cálculo sem API considera uma linha reta entre os 2 pontos, enquanto a API do Google leva em consideração os trajetos e rotas, de acordo com o meio de transporte escolhido, o que pode apresentar valores mais próximos do reais, de acordo com a necessidade, e bem diferentes do cálculo geométrico.
Introduction
Como vocês sabem, as medidas que utilizamos atualmente para identificar a localização geográfica de um ponto no globo são latitude e longitude, que podem ser expressas em duas formas:
- Latitude: -20.3222, Longitude: -40.3381
- 20° 19′ 20″ Sul, 40° 20′ 17″ Oeste
A nossa posição sobre a Terra é referenciada em relação a linha do equador e ao meridiano de Greenwich e é expressa em dois valores: a latitude e a longitude. Assim para saber a nossa posição sobre a Terra basta saber a latitude e a longitude.
A latitude é a distância ao Equador medida ao longo do meridiano de Greenwich. Esta distância mede-se em graus, podendo variar entre 0º e 90º para Norte(N) ou para Sul(S). A longitude é a distância ao meridiano de Greenwich medida ao longo do Equador. Esta distância mede-se em graus, podendo variar entre 0º e 180º para Leste(E) ou para Oeste(W).
Para identificar a latitude e longitude de um local, você pode utilizar diversas formas. Uma delas, é utilizando o Google Maps, conforme demonstro abaixo:
Calculando a distância entre duas latitudes e longitudes
Para realizar esse cálculo, vou utilizar a fórmula de Haversine, uma importante equação usada em navegação, fornecendo distâncias entre dois pontos de uma esfera a partir de suas latitudes e longitudes, tendo como embasamento matemático, a Lei dos Cossenos, considerando no modelo a curvatura da Terra, isto é o raio da mesma, que possui o valor de aproximadamente 6.371 km ou 3.959 milhas.
Para demonstração desse cálculo, vou utilizar a latitude e longitude que enviei no exemplo acima (Shopping Vitória / -20.3135958, -40.2893737) e comparar com as coordenadas do Shopping Vila Velha (-20.3480338, -40.2975204) utilizando a função proposta nesse artigo, que irá retornar a distância entre os dois pontos em KM.
1 |
SELECT dbo.fncCalcula_Distancia_Coordenada(-20.3135958, -40.2893737, -20.3480338, -40.2975204) |
Comparando com o Google Maps, podemos notar que a distância calculada fica bem próxima:
O código dessa função está disponível aqui:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
CREATE FUNCTION dbo.fncCalcula_Distancia_Coordenada ( @Latitude1 FLOAT, @Longitude1 FLOAT, @Latitude2 FLOAT, @Longitude2 FLOAT ) RETURNS FLOAT AS BEGIN DECLARE @PI FLOAT = PI() DECLARE @lat1Radianos FLOAT = @Latitude1 * @PI / 180 DECLARE @lng1Radianos FLOAT = @Longitude1 * @PI / 180 DECLARE @lat2Radianos FLOAT = @Latitude2 * @PI / 180 DECLARE @lng2Radianos FLOAT = @Longitude2 * @PI / 180 RETURN (ACOS(COS(@lat1Radianos) * COS(@lng1Radianos) * COS(@lat2Radianos) * COS(@lng2Radianos) + COS(@lat1Radianos) * SIN(@lng1Radianos) * COS(@lat2Radianos) * SIN(@lng2Radianos) + SIN(@lat1Radianos) * SIN(@lat2Radianos)) * 6371) * 1.15 END |
Vale ressaltar que adicionei um percentual de ajuste de 15% no valor para trazer a distância de forma mais aproximada ao real.
And that's it, folks!
Espero que tenham gostado desse post.
Um abraço e até a próxima.
Boa tarde Dirceu!
Muito bom..
Seria possível medir a distância entre 2 pontos sem a utilização de API informando os CEPs de 2 localicades?
excelente!
Parabéns, simples e prático, bem como muito didático.
Poxa vida isso é muito legal.