20 Fev, 2013 11:43
Como calcular rota em Android
Desafio
Para quem pensava que essa é uma funcionalidade já disponível tanto no MapView do Google APIs quanto no GoogleMap do Google Maps Android API v2 ficará desapontado. Não é tá simples assim obter a rota, mas também não é impossível, apenas dá trabalho. Basicamente precisaremos conseguir os pontos geográficos que ficam entre a origem e o destino da rota e desenhar, exatamente isso, desenhar o caminho no mapa.
Primeiro passo: conexão
Primeiramente, precisamos obter os pontos geográficos. Para isso, a Google disponibiliza um webservice que fornece esses pontos. Basta passar os pontos de origem e destino desejados.
// Origem (latitude, longitude) e destino (latitude, longitude)
HttpGet http = new HttpGet("https://maps.google.com/maps?output=json&saddr=-22.9073158,-43.1772406&daddr=-21.533169,-42.643093");
HttpClient httpclient = new DefaultHttpClient();
HttpResponse response = httpclient.execute(http);
HttpEntity entity = response.getEntity();
if (response.getStatusLine().getStatusCode() == 200) {
if (entity != null) {
InputStream instream = entity.getContent();
String resultString = converterStreamEmString(instream);
instream.close();
String regex = "points:\\\"([^\\\"]*)\\\"";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(resultString);
if (m.find()) {
obterPontos(m.group(1));
}
}
}
Segundo passo: pontos geográficos
Após a conexão, é preciso obter os pontos da rota a partir da string de retorno. Abaixo, como fazer:
private void obterPontos(String str) {
str = str.replace("\\\\", "\\");
int index = 0, len = str.length();
int lat = 0, lng = 0;
while (index < len) {
int b, shift = 0, result = 0;
do {
b = str.charAt(index++) - 63;
result |= (b & 0x1f) << shift;
shift += 5;
} while (b >= 0x20);
int dlat = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1));
lat += dlat;
shift = 0;
result = 0;
do {
b = str.charAt(index++) - 63;
result |= (b & 0x1f) << shift;
shift += 5;
} while (b >= 0x20);
int dlng = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1));
lng += dlng;
// Usando a lat e lng acima, preencha o objeto que representa
// um ponto no mapa (varia de acordo com a API de mapas)
// e adicione a sua coleção de pontos
}
}
Terceiro passo: rota
Aqui vou apresentar como desenhar a rota no mapa utilizando o GoogleMap do Google Maps Android API v2.
// Representação de 1 ponto com a latitude e longitude obtidos no laço acima
LatLng ponto = new LatLng((double)lat*1E-5, (double)lng*1E-5);
// Após ter todos os pontos da rota
PolylineOptions polylineOptions = new PolylineOptions();
for (LatLng ponto : pontos) {
polylineOptions.add(ponto);
}
map.addPolyline(polylineOptions);
Segue, abaixo, o resultado final: