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:

Rota

Ao navegar neste site, você consente o uso de cookies nossos e de terceiros, que coletam informações anônimas e são essenciais para melhorar sua experiência em nosso site.