Uma moça de Votuporanga me enviou um e-mail com dúvidas de como calcular distâncias em linha reta entre cidades em Java. Resolvi pesquisar sobre o assunto, já que o cálculo de distância geográfica é um pouco diferente da tradicional.
Dẽ uma olhada nessa imagem retirada do site: http://caraipora.tripod.com/calc_dist_entre_dois_pontos.htm. Nesse site também tem explicações de como calcular a distância.
Fica claro que para calcularmos a distância entre dois pontos geográficos não basta utilizarmos o cálculo de distância convencional, pois não estamos levando em consideração a curvatura do planeta terra.
Aqui também tem o cálculo utilizando planilha de excel: http://pasta1xls.blogspot.com/2009/05/como-calcular-distancia-entre.html. Resolvi fazer a migração para código java.
[cc lang=”java”]// Conversão de graus pra radianos das latitudes
double firstLatToRad = Math.toRadians(firstLatitude);
double secondLatToRad = Math.toRadians(secondLatitude);
// Diferença das longitudes
double deltaLongitudeInRad = Math.toRadians(secondLongitude
– firstLongitude);
// Cálcula da distância entre os pontos
return Math.acos(Math.cos(firstLatToRad) * Math.cos(secondLatToRad)
* Math.cos(deltaLongitudeInRad) + Math.sin(firstLatToRad)
* Math.sin(secondLatToRad))
* EARTH_RADIUS_KM;[/cc]
Fiz também uma classe auxiliar para facilitar a manipulação de coordenadas geográficas. Dessa forma o código para calcular a distância de São José do Rio Preto à Votuporanga fica assim:
[cc lang=”java”]GeoCoordinate saoJoseDoRioPreto = new GeoCoordinate(-20.81972,
-49.37944);
GeoCoordinate votuporanga = new GeoCoordinate(-20.42278, -49.97278);
double distancia = saoJoseDoRioPreto.distanceInKm(votuporanga);
[/cc]
Qualquer dúvida é só avisar. O código fonte está disponível aqui junto com o javadoc.
