Disegna il percorso tra due punti utilizzando l’API di Google Maps per Android v2

Google ha cambiato la sua API mappa per Android e ha introdotto API V2. I codici precedenti per il percorso del disegno non funzionano con API V2.

Sono riuscito a disegnare un percorso con API V2. Avevo cercato molto per la soluzione ma non ho trovato nessuna risposta. Quindi sto condividendo la sua risposta.

    Prima di tutto otterremo punti di origine e destinazione tra i quali dobbiamo tracciare la rotta. Quindi passeremo questi attributi alla funzione di sotto.

    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"); urlString.append("&key=YOUR_API_KEY"); return urlString.toString(); } 

    Questa funzione renderà l’url che invieremo per ottenere la risposta dell’API Direction. Quindi analizzeremo questa risposta. La class parser è

     public class JSONParser { static InputStream is = null; static JSONObject jObj = null; static String json = ""; // constructor public JSONParser() { } 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 converting result " + e.toString()); } return json; } } 

    Questo parser ci restituirà una stringa. Lo chiameremo così.

     JSONParser jParser = new JSONParser(); String json = jParser.getJSONFromUrl(url); 

    Ora invieremo questa stringa alla nostra funzione drawpath. La funzione drawpath è

     public void drawPath(String result) { 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 overviewPolylines = routes.getJSONObject("overview_polyline"); String encodedString = overviewPolylines.getString("points"); List list = decodePoly(encodedString); Polyline line = mMap.addPolyline(new PolylineOptions() .addAll(list) .width(12) .color(Color.parseColor("#05b1fb"))//Google maps blue color .geodesic(true) ); /* for(int z = 0; z 

    Sopra il codice verrà disegnato il percorso su mMap. Il codice di decodePoly è

     private List decodePoly(String encoded) { List poly = new ArrayList(); int index = 0, len = encoded.length(); int lat = 0, lng = 0; while (index < len) { int b, shift = 0, result = 0; do { b = encoded.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 = encoded.charAt(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; } 

    Poiché la chiamata di direzione potrebbe richiedere del tempo, faremo tutto ciò in un task asincrono. Il mio compito asincrono era

     private class connectAsyncTask extends AsyncTask{ private ProgressDialog progressDialog; String url; connectAsyncTask(String urlPass){ url = urlPass; } @Override protected void onPreExecute() { // TODO Auto-generated method stub super.onPreExecute(); progressDialog = new ProgressDialog(MainActivity.this); progressDialog.setMessage("Fetching route, Please wait..."); progressDialog.setIndeterminate(true); progressDialog.show(); } @Override protected String doInBackground(Void... params) { JSONParser jParser = new JSONParser(); String json = jParser.getJSONFromUrl(url); return json; } @Override protected void onPostExecute(String result) { super.onPostExecute(result); progressDialog.hide(); if(result!=null){ drawPath(result); } } } 

    Spero che sarà di aiuto.

    Non so se dovrei metterlo come risposta o no …

    Ho usato la soluzione di @ Zeeshan0026 per tracciare il percorso … e il problema era che se disegnavo il percorso una volta, e poi provo a tracciare il percorso ancora una volta, entrambi i percorsi mostrano e questo continua … i percorsi mostrano anche quando i marcatori erano cancellato … mentre, idealmente, i vecchi percorsi “non dovrebbero essere lì una volta che viene tracciato un nuovo percorso / i marcatori vengono cancellati ..

    passando per qualche altra domanda su SO, ho avuto la seguente soluzione

    Aggiungo la seguente funzione nella class di Zeeshan

      public void clearRoute(){ for(Polyline line1 : polylines) { line1.remove(); } polylines.clear(); } 

    nella mia attività sulla mappa, prima di tracciare il percorso, ho chiamato questa funzione .. l’utilizzo di esempio come per la mia app è

     private Route rt; rt.clearRoute(); if (src == null) { Toast.makeText(getApplicationContext(), "Please select your Source", Toast.LENGTH_LONG).show(); }else if (Destination == null) { Toast.makeText(getApplicationContext(), "Please select your Destination", Toast.LENGTH_LONG).show(); }else if (src.equals(Destination)) { Toast.makeText(getApplicationContext(), "Source and Destinatin can not be the same..", Toast.LENGTH_LONG).show(); }else{ rt.drawRoute(mMap, MapsMainActivity.this, src, Destination, false, "en"); } 

    puoi usare rt.clearRoute(); secondo le tue esigenze .. Sperando che salverà qualche minuto di qualcun altro e aiuterà alcuni principianti a risolvere questo problema ..

    Codice di class completo

    vedi su github

    Modifica: qui fa parte del codice dalla mainactivity ..

     case R.id.mkrbtn_set_dest: Destination = selmarker.getPosition(); destmarker = selmarker; desShape = createRouteCircle(Destination, false); if (src == null) { Toast.makeText(getApplicationContext(), "Please select your Source first...", Toast.LENGTH_LONG).show(); } else if (src.equals(Destination)) { Toast.makeText(getApplicationContext(), "Source and Destinatin can not be the same..", Toast.LENGTH_LONG).show(); } else { if (isNetworkAvailable()) { rt.drawRoute(mMap, MapsMainActivity.this, src, Destination, false, "en"); src = null; Destination = null; } else { Toast.makeText( getApplicationContext(), "Internet Connection seems to be OFFLINE...!", Toast.LENGTH_LONG).show(); } } break; 

    Modifica 2 come da commenti

    utilizzo:

     //variables as data members GoogleMap mMap; private Route rt; static LatLng src; static LatLng Destination; //MapsMainActivity is my activity //false for interim stops for traffic, google // en language for html description returned rt.drawRoute(mMap, MapsMainActivity.this, src, Destination, false, "en");