una trazar studio rutas ruta puntos pintar google entre ejemplos crear google-maps path google-maps-markers routes google-maps-android-api-2

trazar - Dibuje la ruta entre dos puntos usando Google Maps Android API v2



trazar ruta en google maps android studio (2)

Google cambió su API de mapa para Android e introdujo API V2. Los códigos anteriores para la ruta de dibujo no funcionan con API V2.

He logrado dibujar un camino con API V2. Había buscado mucho la solución pero no encontré ninguna respuesta. Así que estoy compartiendo su respuesta.


En primer lugar, obtendremos puntos de origen y destino entre los cuales tenemos que dibujar la ruta. Luego pasaremos estos atributos a la función siguiente.

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(); }

Esta función hará que la url que enviaremos obtenga la respuesta de la API de dirección. Luego analizaremos esa respuesta. La clase de analizador es

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; } }

Este analizador nos devolverá la cadena. Lo llamaremos así.

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

Ahora enviaremos esta cadena a nuestra función drawpath. La función drawpath es

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<LatLng> 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<list.size()-1;z++){ LatLng src= list.get(z); LatLng dest= list.get(z+1); Polyline line = mMap.addPolyline(new PolylineOptions() .add(new LatLng(src.latitude, src.longitude), new LatLng(dest.latitude, dest.longitude)) .width(2) .color(Color.BLUE).geodesic(true)); } */ } catch (JSONException e) { } }

El código anterior dibujará la ruta en mMap. El código de decodePoly es

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.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; }

Como la llamada de dirección puede llevar tiempo, haremos todo esto en la tarea asincrónica. Mi tarea asíncrona fue

private class connectAsyncTask extends AsyncTask<Void, Void, String>{ 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); } } }

Espero que ayude


No sé si debo poner esto como respuesta o no ...

Utilicé la solución de @ Zeeshan0026 para dibujar el camino ... y el problema fue que si dibujé el camino una vez, y luego traté de dibujar el camino una vez más, las dos rutas se muestran y esto continúa ... caminos que muestran incluso cuando los marcadores eran borrado ... mientras que, idealmente, las rutas antiguas "no deberían estar allí una vez que se dibuja una nueva ruta / se eliminan marcadores".

pasando por otra pregunta sobre SO, tuve la siguiente solución

Agrego la siguiente función en la clase de Zeeshan

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

en mi actividad de mapa, antes de dibujar la ruta, llamé a esta función ... el uso de ejemplo según mi aplicación es

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"); }

puedes usar rt.clearRoute(); según sus requisitos .. Esperando que ahorrará unos minutos a alguien más y ayudará a algunos principiantes a resolver este problema.

Código de clase completo

ver en github

Editar: aquí es parte del código de 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;

Edite 2 según los comentarios

uso:

//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");