varios studio proyecto marcadores mapview google example custom color agregar android highlight routes google-maps-android-api-2 directions

studio - Resalta una ruta específica en Google Maps v2 Android



marker color google maps (3)

Correcto, entonces actualmente estoy usando la API de Google Directions en mi aplicación para recuperar la ruta entre dos ubicaciones.

Cuando envío una solicitud de indicaciones de ruta, recupero una serie de detalles en JSON con respecto a la ruta, incluidos los nombres de cada carretera a lo largo de la ruta, sus correspondientes coordenadas lat-long de inicio y final y su valor de polilínea.

Por ejemplo: si envío la solicitud http://maps.googleapis.com/maps/api/directions/json?origin=redfern+ave,+dublin&destination=limetree+ave,+dublin&sensor=false entre dos carreteras, obtengo el siguiente respuesta JSON (salida para un camino a lo largo de la ruta).

{ "distance" : { "text" : "0.2 km", "value" : 203 }, "duration" : { "text" : "1 min", "value" : 18 }, "end_location" : { "lat" : 53.435250, "lng" : -6.132140000000001 }, "html_instructions" : "Head /u003cb/u003eeast/u003c/b/u003e on /u003cb/u003eRedfern Ave./u003c/b/u003e toward /u003cb/u003eMartello Court/u003c/b/u003e", **"polyline" : { "points" : "woceIvgmd@O}DOkDQqF"** },

Hasta ahora mi aplicación analiza esta información y simplemente enumera los caminos y direcciones en una vista de lista como esta:

Lo que quiero hacer es destacar toda la ruta de A a B en un mapa, sin embargo, no he encontrado nada útil en línea sobre cómo hacer esto en la nueva API de Google Maps v2. Veo que las polilíneas se usan en lugar de superposiciones para dibujar líneas en Google Maps v2, sin embargo, por lo que puedo ver, solo dibujan líneas rectas, lo cual es inútil para mí. ¿Hay alguna forma de resaltar la ruta usando la información que tengo a mi disposición (nombres de ruta, coordenadas de inicio y fin de latitud larga, puntos de polilínea? Cualquier ayuda es apreciada.

Además, veo que hay un valor de "polilínea" en la respuesta que podría ser útil, pero no puedo descifrar cómo analizar o usar este bit de información. ¿Alguien sabe cómo puedo darle sentido a este valor para trazar una polilínea?

**"polyline" : { "points" : "woceIvgmd@O}DOkDQqF"**

EDITAR: Mi código de solución se proporciona en mi respuesta a continuación.


Existe una solución simple

Añadir una biblioteca

compilar ''com.google.maps.android:android-maps-utils:0.4+''

referencia de https://developers.google.com/maps/documentation/android-api/utility/setup

//Getting the points String from response of NavigationAPI call String polyz=routeSteps.get(0).getOverview_polyline().getPoints(); //Decoding the LatLng Points using PolyUtil Class used from above Library List<LatLng> points=PolyUtil.decode(polyz); polyline.addAll(points); googleMap.addPolyline(polyline);


Finalmente logré que funcionara después de un montón de pruebas y errores. Ahora resalta completamente una ruta específica de A a B en un mapa (como se ve en mi captura de pantalla a continuación). También he incluido mi código para cualquier persona que pueda necesitarlo en el futuro.

public class PolyMap extends Activity { ProgressDialog pDialog; GoogleMap map; List<LatLng> polyz; JSONArray array; static final LatLng DUBLIN = new LatLng(53.344103999999990000, -6.267493699999932000); @SuppressLint("NewApi") protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.map_layout); map = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)) .getMap(); map.moveCamera(CameraUpdateFactory.newLatLngZoom(DUBLIN, 15)); map.animateCamera(CameraUpdateFactory.zoomTo(10), 2000, null); new GetDirection().execute(); } class GetDirection extends AsyncTask<String, String, String> { @Override protected void onPreExecute() { super.onPreExecute(); pDialog = new ProgressDialog(PolyMap.this); pDialog.setMessage("Loading route. Please wait..."); pDialog.setIndeterminate(false); pDialog.setCancelable(false); pDialog.show(); } protected String doInBackground(String... args) { Intent i = getIntent(); String startLocation = i.getStringExtra("startLoc"); String endLocation = i.getStringExtra("endLoc"); startLocation = startLocation.replace(" ", "+"); endLocation = endLocation.replace(" ", "+");; String stringUrl = "http://maps.googleapis.com/maps/api/directions/json?origin=" + startLocation + ",+dublin&destination=" + endLocation + ",+dublin&sensor=false"; StringBuilder response = new StringBuilder(); try { URL url = new URL(stringUrl); HttpURLConnection httpconn = (HttpURLConnection) url .openConnection(); if (httpconn.getResponseCode() == HttpURLConnection.HTTP_OK) { BufferedReader input = new BufferedReader( new InputStreamReader(httpconn.getInputStream()), 8192); String strLine = null; while ((strLine = input.readLine()) != null) { response.append(strLine); } input.close(); } String jsonOutput = response.toString(); JSONObject jsonObject = new JSONObject(jsonOutput); // routesArray contains ALL routes JSONArray routesArray = jsonObject.getJSONArray("routes"); // Grab the first route JSONObject route = routesArray.getJSONObject(0); JSONObject poly = route.getJSONObject("overview_polyline"); String polyline = poly.getString("points"); polyz = decodePoly(polyline); } catch (Exception e) { } return null; } protected void onPostExecute(String file_url) { for (int i = 0; i < polyz.size() - 1; i++) { LatLng src = polyz.get(i); LatLng dest = polyz.get(i + 1); Polyline line = map.addPolyline(new PolylineOptions() .add(new LatLng(src.latitude, src.longitude), new LatLng(dest.latitude, dest.longitude)) .width(2).color(Color.RED).geodesic(true)); } pDialog.dismiss(); } } /* Method to decode polyline points */ 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; } }


Con los mapas de Android api 2, de hecho, necesitas utilizar la clase Polyline para dibujar la ruta en un mapa (al menos es la manera más fácil :)). Lo que debe hacer es proporcionar una lista de puntos a lo largo de su ruta.

En cuanto a resaltar la ruta activa, hay una interfaz práctica en Polyline class setColor , por lo que puede establecer el color que desee para la ruta activa (incluido un canal alfa)

Polyline line1 = map.addPolyline(new PolylineOptions() .add(new LatLng(51.5, -0.1), new LatLng(40.7, -74.0)) .width(5) .color(0xFFFF0000)); //non transparent red Polyline line2 = map.addPolyline(new PolylineOptions() .add(new LatLng(51.5, -0.1), new LatLng(40.8, -74.2)) .width(5) .color(0x7F0000FF)); //semi-transparent blue

Tenga en cuenta que puede cambiar el color de la polilínea en cualquier momento que desee (haga clic en un usuario, o algo)

En cuanto a la respuesta JSON de google: los puntos de ruta están codificados, por lo que puede consultar esta pregunta para comprender cómo decodificarla