Distância utilizando coordenadas geográficas em Java

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.

Dist Rio NY
Distância Rio NY

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.

// 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;

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:

GeoCoordinate saoJoseDoRioPreto = new GeoCoordinate(-20.81972,
-49.37944);
GeoCoordinate votuporanga = new GeoCoordinate(-20.42278, -49.97278);
double distancia = saoJoseDoRioPreto.distanceInKm(votuporanga);

Qualquer dúvida é só avisar. O código fonte está disponível aqui junto com o javadoc.

Sobre: Thiago Galbiatti Vespa

Thiago Galbiatti Vespa é mestre em Ciências da Computação e Matemática Computacional pela USP e bacharel em Ciências da Computação pela UNESP. Coordenador de projetos do JavaNoroeste, membro do JCP (Java Community Process), consultor Oracle, arquiteto de software de empresas de médio e grande porte, palestrante de vários eventos e colaborador de projetos open source. Possui as certificações: Oracle Certified Master, Java EE 5 Enterprise Architect – Step 1, 2 and 3; Oracle WebCenter Portal 11g Certified Implementation Specialist; Oracle Service Oriented Architecture Infrastructure Implementation Certified Expert; Oracle Certified Professional, Java EE 5 Web Services Developer; Oracle Certified Expert, NetBeans Integrated Development Environment 6.1 Programmer; Oracle Certified Professional, Java Programmer; Oracle Certified Associate, Java SE 5/SE 6