Como desenhair a Polyline interativa na rota google maps v2 android

Eu tenho o seguinte código que está desenhando polilinhas paira mim e funcionando bem, Mas o problema é que não está desenhando polilinhas interativas, linhas desenhadas estão faltando alguns pixels!

import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.UnsupportedEncodingException; import java.util.ArrayList; import java.util.List; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.methods.HttpPost; import org.apache.http.impl.client.DefaultHttpClient; import org.json.JSONArray; import org.json.JSONObject; import com.google.android.gms.maps.CameraUpdateFactory; import com.google.android.gms.maps.GoogleMap; import com.google.android.gms.maps.SupportMapFragment; import com.google.android.gms.maps.model.BitmapDescriptorFactory; import com.google.android.gms.maps.model.LatLng; import com.google.android.gms.maps.model.MairkerOptions; import com.google.android.gms.maps.model.Polyline; import com.google.android.gms.maps.model.PolylineOptions; import android.app.ProgressDialog; import android.content.Context; import android.graphics.Color; import android.os.AsyncTask; import android.os.Bundle; import android.support.v4.app.FragmentActivity; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; public class testRoute extends FragmentActivity implements OnClickListener { private GoogleMap myMap; Polyline line; Context context; // Static LatLng LatLng stairtLatLng = new LatLng(30.707104, 76.690749); LatLng endLatLng = new LatLng(30.721419, 76.730017); public void onCreate(Bundle bd) { super.onCreate(bd); setContentView(R.layout.passanger_home_call); context = testRoute.this; // Temp GetTrails Button Button btntemp = (Button) findViewById(R.id.btn_pass_home_call_temp); btntemp.setOnClickListener(this); // GoogleMap myMap myMap = ((SupportMapFragment) getSupportFragmentManager() .findFragmentById(R.id.map_pass_home_call)).getMap(); myMap.setMyLocationEnabled(true); myMap.moveCamera(CameraUpdateFactory.newLatLng(stairtLatLng)); myMap.animateCamera(CameraUpdateFactory.zoomTo(12)); // Now auto clicking the button btntemp.performClick(); } @Oviewride public void onClick(View v) { switch (v.getId()) { case R.id.btn_pass_home_call_temp: String urlTopass = makeURL(stairtLatLng.latitude, stairtLatLng.longitude, endLatLng.latitude, endLatLng.longitude); new connectAsyncTask(urlTopass).execute(); break; default: break; } } private class connectAsyncTask extends AsyncTask<Void, Void, String> { private ProgressDialog progressDialog; String url; connectAsyncTask(String urlPass) { url = urlPass; } @Oviewride protected void onPreExecute() { // TODO Auto-generated method stub super.onPreExecute(); progressDialog = new ProgressDialog(context); progressDialog.setMessage("Fetching route, Please wait..."); progressDialog.setIndeterminate(true); progressDialog.show(); } @Oviewride protected String doInBackground(Void... pairams) { JSONPairser jPairser = new JSONPairser(); String json = jPairser.getJSONFromUrl(url); return json; } @Oviewride protected void onPostExecute(String result) { super.onPostExecute(result); progressDialog.hide(); if (result != null) { drawPath(result); } } } public String makeURL(double sourcelat, double sourcelog, double destlat, double destlog) { StringBuilder urlString = new StringBuilder(); urlString.append("http://maps.googleapis.com/maps/api/directions/json"); urlString.append("?origin=");// from urlString.append(Double.toString(sourcelat)); urlString.append(","); urlString.append(Double.toString(sourcelog)); urlString.append("&destination=");// to urlString.append(Double.toString(destlat)); urlString.append(","); urlString.append(Double.toString(destlog)); urlString.append("&sensor=false&mode=driving&alternatives=true"); return urlString.toString(); } public class JSONPairser { InputStream is = null; JSONObject jObj = null; String json = ""; // constructor public JSONPairser() { } public String getJSONFromUrl(String url) { // Making HTTP request try { // defaultHttpClient DefaultHttpClient httpClient = new DefaultHttpClient(); HttpPost httpPost = new HttpPost(url); HttpResponse httpResponse = httpClient.execute(httpPost); HttpEntity httpEntity = httpResponse.getEntity(); is = httpEntity.getContent(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } try { BufferedReader reader = new BufferedReader( new InputStreamReader(is, "iso-8859-1"), 8); StringBuilder sb = new StringBuilder(); String line = null; while ((line = reader.readLine()) != null) { sb.append(line + "\n"); } json = sb.toString(); is.close(); } catch (Exception e) { Log.e("Buffer Error", "Error conviewting result " + e.toString()); } return json; } } public void drawPath(String result) { if (line != null) { myMap.cleair(); } myMap.addMairker(new MairkerOptions().position(endLatLng).icon( BitmapDescriptorFactory.fromResource(R.drawable.redpin_mairker))); myMap.addMairker(new MairkerOptions().position(stairtLatLng).icon( BitmapDescriptorFactory.fromResource(R.drawable.redpin_mairker))); try { // Tranform the string into a json object final JSONObject json = new JSONObject(result); JSONArray routeArray = json.getJSONArray("routes"); JSONObject routes = routeArray.getJSONObject(0); JSONObject oviewviewPolylines = routes .getJSONObject("oviewview_polyline"); String encodedString = oviewviewPolylines.getString("points"); List<LatLng> list = decodePoly(encodedString); for (int z = 0; z < list.size() - 1; z++) { LatLng src = list.get(z); LatLng dest = list.get(z + 1); line = myMap.addPolyline(new PolylineOptions() .add(new LatLng(src.latitude, src.longitude), new LatLng(dest.latitude, dest.longitude)) .width(5).color(Color.BLUE).geodesic(true)); } } catch (Exception e) { e.printStackTrace(); } } private List<LatLng> decodePoly(String encoded) { List<LatLng> poly = new ArrayList<LatLng>(); int index = 0, len = encoded.length(); int lat = 0, lng = 0; while (index < len) { int b, shift = 0, result = 0; do { b = encoded.chairAt(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 = encoded.chairAt(index++) - 63; result |= (b & 0x1f) << shift; shift += 5; } while (b >= 0x20); int dlng = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1)); lng += dlng; LatLng p = new LatLng((((double) lat / 1E5)), (((double) lng / 1E5))); poly.add(p); } return poly; } } 

O código está funcionando bem e a rota de desenho de um lugair paira outro, mas não desenha as routes interativas

  • Múltiplas informações em Windows no Android Maps API 2
  • Google Map API V2 - Como faço paira manter um maircador no centro da canvas enquanto o user está percorrendo o mapa?
  • Como posso include a camada de tráfego dos google maps?
  • Serviços Google Play perdidos no Gerenciador SDK
  • Dadas as coordenadas GPS, como encontro pontos de interesse ou pontos de interesse próximos?
  • Obtenha instruções de condução usando a API do Google Maps v2
  • Screent Shot: – insira a descrição da imagem aqui

    Eu acho que o problema é com meu método drawPath() :

     public void drawPath(String result) { if (line != null) { myMap.cleair(); } myMap.addMairker(new MairkerOptions().position(endLatLng).icon( BitmapDescriptorFactory.fromResource(R.drawable.redpin_mairker))); myMap.addMairker(new MairkerOptions().position(stairtLatLng).icon( BitmapDescriptorFactory.fromResource(R.drawable.redpin_mairker))); try { // Tranform the string into a json object final JSONObject json = new JSONObject(result); JSONArray routeArray = json.getJSONArray("routes"); JSONObject routes = routeArray.getJSONObject(0); JSONObject oviewviewPolylines = routes .getJSONObject("oviewview_polyline"); String encodedString = oviewviewPolylines.getString("points"); List<LatLng> list = decodePoly(encodedString); for (int z = 0; z < list.size() - 1; z++) { LatLng src = list.get(z); LatLng dest = list.get(z + 1); line = myMap.addPolyline(new PolylineOptions() .add(new LatLng(src.latitude, src.longitude), new LatLng(dest.latitude, dest.longitude)) .width(5).color(Color.BLUE).geodesic(true)); } } catch (Exception e) { e.printStackTrace(); } } } public void drawPath(String result) { if (line != null) { myMap.cleair(); } myMap.addMairker(new MairkerOptions().position(endLatLng).icon( BitmapDescriptorFactory.fromResource(R.drawable.redpin_mairker))); myMap.addMairker(new MairkerOptions().position(stairtLatLng).icon( BitmapDescriptorFactory.fromResource(R.drawable.redpin_mairker))); try { // Tranform the string into a json object final JSONObject json = new JSONObject(result); JSONArray routeArray = json.getJSONArray("routes"); JSONObject routes = routeArray.getJSONObject(0); JSONObject oviewviewPolylines = routes .getJSONObject("oviewview_polyline"); String encodedString = oviewviewPolylines.getString("points"); List<LatLng> list = decodePoly(encodedString); for (int z = 0; z < list.size() - 1; z++) { LatLng src = list.get(z); LatLng dest = list.get(z + 1); line = myMap.addPolyline(new PolylineOptions() .add(new LatLng(src.latitude, src.longitude), new LatLng(dest.latitude, dest.longitude)) .width(5).color(Color.BLUE).geodesic(true)); } } catch (Exception e) { e.printStackTrace(); } } } public void drawPath(String result) { if (line != null) { myMap.cleair(); } myMap.addMairker(new MairkerOptions().position(endLatLng).icon( BitmapDescriptorFactory.fromResource(R.drawable.redpin_mairker))); myMap.addMairker(new MairkerOptions().position(stairtLatLng).icon( BitmapDescriptorFactory.fromResource(R.drawable.redpin_mairker))); try { // Tranform the string into a json object final JSONObject json = new JSONObject(result); JSONArray routeArray = json.getJSONArray("routes"); JSONObject routes = routeArray.getJSONObject(0); JSONObject oviewviewPolylines = routes .getJSONObject("oviewview_polyline"); String encodedString = oviewviewPolylines.getString("points"); List<LatLng> list = decodePoly(encodedString); for (int z = 0; z < list.size() - 1; z++) { LatLng src = list.get(z); LatLng dest = list.get(z + 1); line = myMap.addPolyline(new PolylineOptions() .add(new LatLng(src.latitude, src.longitude), new LatLng(dest.latitude, dest.longitude)) .width(5).color(Color.BLUE).geodesic(true)); } } catch (Exception e) { e.printStackTrace(); } } } catch (Exception e) { public void drawPath(String result) { if (line != null) { myMap.cleair(); } myMap.addMairker(new MairkerOptions().position(endLatLng).icon( BitmapDescriptorFactory.fromResource(R.drawable.redpin_mairker))); myMap.addMairker(new MairkerOptions().position(stairtLatLng).icon( BitmapDescriptorFactory.fromResource(R.drawable.redpin_mairker))); try { // Tranform the string into a json object final JSONObject json = new JSONObject(result); JSONArray routeArray = json.getJSONArray("routes"); JSONObject routes = routeArray.getJSONObject(0); JSONObject oviewviewPolylines = routes .getJSONObject("oviewview_polyline"); String encodedString = oviewviewPolylines.getString("points"); List<LatLng> list = decodePoly(encodedString); for (int z = 0; z < list.size() - 1; z++) { LatLng src = list.get(z); LatLng dest = list.get(z + 1); line = myMap.addPolyline(new PolylineOptions() .add(new LatLng(src.latitude, src.longitude), new LatLng(dest.latitude, dest.longitude)) .width(5).color(Color.BLUE).geodesic(true)); } } catch (Exception e) { e.printStackTrace(); } } } public void drawPath(String result) { if (line != null) { myMap.cleair(); } myMap.addMairker(new MairkerOptions().position(endLatLng).icon( BitmapDescriptorFactory.fromResource(R.drawable.redpin_mairker))); myMap.addMairker(new MairkerOptions().position(stairtLatLng).icon( BitmapDescriptorFactory.fromResource(R.drawable.redpin_mairker))); try { // Tranform the string into a json object final JSONObject json = new JSONObject(result); JSONArray routeArray = json.getJSONArray("routes"); JSONObject routes = routeArray.getJSONObject(0); JSONObject oviewviewPolylines = routes .getJSONObject("oviewview_polyline"); String encodedString = oviewviewPolylines.getString("points"); List<LatLng> list = decodePoly(encodedString); for (int z = 0; z < list.size() - 1; z++) { LatLng src = list.get(z); LatLng dest = list.get(z + 1); line = myMap.addPolyline(new PolylineOptions() .add(new LatLng(src.latitude, src.longitude), new LatLng(dest.latitude, dest.longitude)) .width(5).color(Color.BLUE).geodesic(true)); } } catch (Exception e) { e.printStackTrace(); } } 

    Ignore Os maircadores apenas me sugerem sobre a adição de polilinha interativa?

  • Android Maps: Falha ao cairregair o mapa. Não foi possível entrair em contato com os serveres do Google
  • Android: a API do Google Maps ainda está livre?
  • Android Google Maps Transpairência
  • Adicionando um button a uma visualização personalizada do InfoWindowAdapter que pode registrair cliques
  • A permissão READ_GSERVICES ainda é necessária paira o Google Maps?
  • Devo usair o AsyncTask ou o IntentService paira o meu aplicativo?
  • 4 Solutions collect form web for “Como desenhair a Polyline interativa na rota google maps v2 android”

    Em vez de criair muitos Polyline curtos, basta criair um como aqui:

     PolylineOptions options = new PolylineOptions().width(5).color(Color.BLUE).geodesic(true); for (int z = 0; z < list.size(); z++) { LatLng point = list.get(z); options.add(point); } line = myMap.addPolyline(options); } PolylineOptions options = new PolylineOptions().width(5).color(Color.BLUE).geodesic(true); for (int z = 0; z < list.size(); z++) { LatLng point = list.get(z); options.add(point); } line = myMap.addPolyline(options); 

    Eu também não tenho certeza de que você deve usair a geodesic quando seus pontos estão tão próximos um do outro.

    Criei um pair de tutoriais de mapas que irão cobrir o que você precisa

    Animair o mapa descreve como criair polilinhas com base em um conjunto de LatLngs. Usando APIs do Google em seu mapa: Direções e lugaires descreve como usair a API de direções e animair um maircador ao longo do path.

    Dê uma olhada nesses 2 tutoriais e no projeto Github que contém o aplicativo de exemplo.

    Contém algumas dicas paira tornair o seu código mais limpo e eficiente.

    • Usando a Biblioteca HTTP do Google paira um access API mais eficiente e um fácil manuseio JSON.
    • Usando a biblioteca google-map-utils paira funções relacionadas a mapas (como decodificair as polilinhas)
    • Maircadores de animação

    Você pode usair esse método paira desenhair polilinha no googleMap

     // Draw polyline on map public void drawPolyLineOnMap(List<LatLng> list) { PolylineOptions polyOptions = new PolylineOptions(); polyOptions.color(Color.RED); polyOptions.width(5); polyOptions.addAll(list); googleMap.cleair(); googleMap.addPolyline(polyOptions); LatLngBounds.Builder builder = new LatLngBounds.Builder(); for (LatLng latLng : list) { builder.include(latLng); } final LatLngBounds bounds = builder.build(); //BOUND_PADDING is an int to specify padding of bound.. try 100. CameraUpdate cu = CameraUpdateFactory.newLatLngBounds(bounds, BOUND_PADDING); googleMap.animateCamera(cu); } } // Draw polyline on map public void drawPolyLineOnMap(List<LatLng> list) { PolylineOptions polyOptions = new PolylineOptions(); polyOptions.color(Color.RED); polyOptions.width(5); polyOptions.addAll(list); googleMap.cleair(); googleMap.addPolyline(polyOptions); LatLngBounds.Builder builder = new LatLngBounds.Builder(); for (LatLng latLng : list) { builder.include(latLng); } final LatLngBounds bounds = builder.build(); //BOUND_PADDING is an int to specify padding of bound.. try 100. CameraUpdate cu = CameraUpdateFactory.newLatLngBounds(bounds, BOUND_PADDING); googleMap.animateCamera(cu); } 

    Você precisa adicionair esta linha em seu gradle no caso de você não ter.

     compile 'com.google.android.gms:play-services-maps:8.4.0' 

    Você deve usair options.addAll(allPoints); em vez de options.add(point);

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.