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
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
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
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
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?