Directions API (correção de rota distorcida)

Olá! Tudo bom ?

Estou fazendo uso da Directions API para traçar rotas e incluindo pontos no GoogleMap usando Polyline, sendo que cada Polyline está sendo colocado corretamente, conforme o JSON que a Directions API retorna para mim.

O problema é a LATITUDE E LONGITUDE que ela retorna, que acaba gerando rotas imperfeitas, incompletas. Vendo a imagem abaixo é possível entender melhor.

Como podem ver, as Polylines estão atravessando algumas rotas
Alguém sabe como posso corrigir?

1 curtida

Cara, eu tenho um projeto semelhante à esse, assim que eu chegar em casa te mando essa parte de PolyLines, é um saco mexer com isso

1 curtida

Fico extremamente agradecido :smiley:

Se ainda puder… Estou no aguardo k
Realmente estou precisando :’)

Ainda não tô em casa kkkkk, toma um calmante aí

1 curtida
private Polyline direction;
private class ParserTask extends AsyncTask<String, Integer, List<List<HashMap<String, String>>>> {
    ProgressDialog mDialog = new ProgressDialog(HomeActivity.this);

    @Override
    protected List<List<HashMap<String, String>>> doInBackground(String... strings) {
        JSONObject jsonObject;
        List<List<HashMap<String, String>>> routes = null;
        try {
            jsonObject = new JSONObject(strings[0]);
            DirectionJSONParser parser = new DirectionJSONParser();
            routes = parser.parse(jsonObject);

        } catch (JSONException ex) {

        }
        return routes;
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        mDialog.setMessage("Aguarde...");
        mDialog.show();
    }

    @Override
    protected void onPostExecute(List<List<HashMap<String, String>>> lists) {
        mDialog.dismiss();
        ArrayList points = null;
        PolylineOptions polylineOptions = null;

        for (int i = 0; i < lists.size(); i++) {
            points = new ArrayList();
            polylineOptions = new PolylineOptions();
            List<HashMap<String, String>> path = lists.get(i);

            for (int j = 0; j < path.size(); j++) {
                HashMap<String, String> point = path.get(j);
                //Aqui gera o caminho. Exemplo: Vire a esquerda, direita, etc...
                double lat = Double.parseDouble(point.get("lat"));
                double lng = Double.parseDouble(point.get("lng"));
                LatLng position = new LatLng(lat, lng);

                points.add(position);
            }
            polylineOptions.addAll(points);
            polylineOptions.width(10);
            polylineOptions.color(R.drawable.gradient_poly_line);
            polylineOptions.geodesic(true);
        }
        direction = mMap.addPolyline(polylineOptions);
    }
}
2 curtidas

@rodriguesabner é o cara

1 curtida

Ainda não vi, mas vou dar uma olhada
Tomei calmante, fiquei 4 dias off do fórum KKKK
Valeu, vou dar uma olhada e darei uma resposta decente aqui :smiley:

Hey bro
Só consegui mexer hoje no projeto. Tens como dar uma ajuda?
Como você aplica essa classe?
Eu tô chamando assim

 // o metodo getURL_DirectionsAPI só pega a URL do JSON, tá na imagem
 String json = frmDados.getURL_DirectionsAPI(latLngOrigem, latLngDestino);
 Request request = new Request.Builder().url(json).build();
 //
 ParserTask parser = new ParserTask();
 parser.doInBackground(json);

métbodo getURL_DirectionsAPI na imagem abaixo

image

Meu métoo de getDirection está assim:

public void getDirection(double latDes, double lngDes) {
        currentPosition = new LatLng(mLastLocation.getLatitude(), mLastLocation.getLongitude());
        String requestAPI = null;

        try {
            requestAPI = "https://maps.googleapis.com/maps/api/directions/json?"
                    + "mode=driving&"
                    + "transit_routing_preferences=less_driving&"
                    + "origin=" + currentPosition.latitude + "," + currentPosition.longitude + "&"
                    + "destination=" + latDes + "," + lngDes + "&"
                    + "key=" + getResources().getString(R.string.google_maps_key);

            Log.d("Imperium", requestAPI);

            mServiceGoogleAPI.getPath(requestAPI).enqueue(new Callback<String>() {
                @Override
                public void onResponse(Call<String> call, Response<String> response) {
                    try {
                        new ParserTask().execute(response.body().toString());

                        JSONObject jsonObject = new JSONObject(response.body().toString());
                        JSONArray routes = jsonObject.getJSONArray("routes");

                        //Depois de pegar a rota, apenas pega o primeiro elemnto de cada.
                        JSONObject object = routes.getJSONObject(0);
                        //Depois do primeiro elemento, nós pegamos o array com o nome "legs"
                        JSONArray legs = object.getJSONArray("legs");
                        //E pegamos o primeiro elemento do "legs"
                        JSONObject legsObject = legs.getJSONObject(0);
                        //Agora a distancia
                        JSONObject distance = legsObject.getJSONObject("distance");
                        //Tempo aproximado de chegada
                        JSONObject time = legsObject.getJSONObject("duration");

                        String localDetails = distance.getString("text") + " de distância - " + time.getString("text");
                        riderDb.child(usuarioAtualID).child("distance").setValue(localDetails);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }

                @Override
                public void onFailure(Call<String> call, Throwable t) {
                }
            });

        } catch (Exception ex) {
        }
    }

Minha chamada de método:

mMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {
@Override
public boolean onMarkerClick(Marker marker) {
if (direction != null)
direction.remove();

LatLng position = marker.getPosition();
getDirection(position.latitude, position.longitude);

//Distancia entre os dois locais
Location location1 = new Location("");
location1.setLatitude(location.latitude);
location1.setLongitude(location.longitude);

Location location2 = new Location("");
location2.setLatitude(position.latitude);
location2.setLongitude(position.longitude);

distanceBet = location1.distanceTo(location2);

String addressLocal = getCompleteAddressString(position.latitude, position.longitude);
addressLocalWait = addressLocal;
//Fim da distancia

     /*if (distanceBet < 50){
       startActivity(new Intent(HomeActivity.this, ParkedActivity.class));
       finish();
       }*/
   return false;
 }
});
1 curtida

Fala jovem, muitíssimo obrigado por responder. Porém, ainda não consegui executar
Fiz algumas alterações (removi o ProgressBar)

private Polyline direction;
    private class ParserTask extends AsyncTask<String, Integer, List<List<HashMap<String, String>>>> {
        @Override
        protected List<List<HashMap<String, String>>> doInBackground(String... strings) {
            List<List<HashMap<String, String>>> routes = null;
            try {
                JSONObject jsonObject = new JSONObject(strings[0]);
                DirectionJSONParser parser = new DirectionJSONParser();
                routes = parser.parse(jsonObject);
            } catch (JSONException ex) {
                frmDados.print("ParserTask:doInBg { "+ex.getMessage()+" } ");
            }
            return routes;
        }
        //
        @Override
        protected void onPostExecute(List<List<HashMap<String, String>>> lists) {
            ArrayList points = null;
            PolylineOptions polylineOptions = null;
            //
            for (int i = 0; i < lists.size(); i++) {
                points = new ArrayList();
                polylineOptions = new PolylineOptions();
                List<HashMap<String, String>> path = lists.get(i);

                for (int j = 0; j < path.size(); j++) {
                    HashMap<String, String> point = path.get(j);
                    //Aqui gera o caminho. Exemplo: Vire a esquerda, direita, etc...
                    double lat = Double.parseDouble(point.get("lat"));
                    double lng = Double.parseDouble(point.get("lng"));
                    LatLng position = new LatLng(lat, lng);

                    points.add(position);
                }
                polylineOptions.addAll(points);
                polylineOptions.width(10);
                polylineOptions.color(R.drawable.ic_launcher_background);
                polylineOptions.geodesic(true);
            }
            direction = mMap.addPolyline(polylineOptions);
        }
    }

E no meu código que desenha a rota(seria o equivalente ao seu método getDirection, mas somente a parte do onResponse), coloquei o newParser

public void desenhaRota(Response response) {
   try {
       //
       if (response != null) {
          new ParserTask().execute(response.body().string());
       //
......

Porém, está aparecendo
E/AndroidRuntime: FATAL EXCEPTION: OkHttp Dispatcher

Sabe dizer o que pode estar causando isso?