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.
Muito obrigada, estou fazendo um projeto para participar de uma feira de ciências em São Paulo (FETEPS) e eu e meu colega pesquisamos e mesmo assim não conseguimos construir uma classe. Vc ajudou muito.
Excelente post Thiago, me ajudou muito ! tks
Boa tarde,
Ja ando a alguns dias de volta de uma classe idêntica, mas não consigo que me de resultado correto, será possível ajudar. Obrigado
O que você precisa?
//Declarar o raio da terra em 6371Km.
public static int EARTH_RADIUS_KM = 6371;
//efetua o calculo da distancia da nossa localização ate a estações escolhida
public static double getDistancia(double firstLatitude, double firstLongitude) {
double secondLatitude = latitudeE9;
double secondLongitude = longitudeE9;
// 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;
}
O latitudeE9 e longitudeE8 vem do GPS.
Os outros valores : ...Distância :"+getDistancia(latitudeE0,longitudeE0)
Resultado não tem nada a haver. Podes-me responder para mail ?
Obrigado
Dê um exemplo que você acha que não bate os valores.
Local físico
private static final int latitudeE0 = 38705195;
private static final int longitudeE0 = -9145023;
//actualiza coordenadas
public void Atualizar(Location location){
latitudeE9=(int) location.getLatitude();
longitudeE9=(int) location.getLongitude();
}
Consigo verificar correctamente as coordenadas no maps, mas depois quando tento calcular a distancia dá-me uns valores completamente estranhos.
Nas coordenadas de GPS, no eclipse meto estas para testar.
Longitude: -9.146112
Latitude: 38.724500
Devia dar cerca de 2700 metros mas o resultado é : 13296.486...
Obrigado
Olá Thiago, tudo bem?
Estou fazendo minha monografia e gostaria de utilizar esta sua função em java pois me atende perfeitamente. Posso colocar as referências ao seu blog? você autoriza a utilização?
Obrigado.
Com certeza... só me envia depois uma cópia da monografia 🙂
favor mandar este programa que calcula distancia em linha reta.........
este programa calcula também o azimute em linha reta......
Você precisa o azimute para topografia?