Diferencia de versión de la API de Google Maps

Estoy tratando de mostrar la ruta entre dos lugares, Quiero utilizar Google Places API V3 para pasos de ruta entre dos puntos.


Antes de usar la antigua API de Google Maps , y la siguiente solicitud da un resultado perfecto:

http://maps.google.com/maps?f=d&hl=en&saddr=19.5217608,-99.2615823&daddr=19.531224,-99.248262&ie=UTF8&0&om=0&output=kml 

Salida:

Vieja API de Google Maps


Ahora trato de reemplazar esto con la nueva API de Google Maps, y la siguiente solicitud da un resultado incorrecto, En ambos casos estoy usando la misma fuente y destino, pero el resultado da un comportamiento diferente en Google Map:

 http://maps.googleapis.com/maps/api/directions/json?origin=19.5217608,-99.2615823&destination=19.531224,-99.248262&sensor=false 

Nueva API de Google Maps

Mi problema es que, la nueva API de Google Maps devuelve menos cantidad de pasos entre la fuente y el destino, por lo que la ruta no se muestra perfecta en Google Map.

Por favor, ayude a resolver este problema para la nueva API de Google Maps v3.

Gracias por adelantado.

¿Qué hay de nuevo en Google Map API v3?
Google Maps Directions API v3 para Android proporciona rutas en el Encoded Polyline Algorithm Format .

¿Qué debemos hacer?
We must have to decode this Polyline for showing exact Map

¿Cómo decodificamos esta polilínea codificada proporcionada por API Google v3?
Por favor, consulte estos tres enlaces para obtener más claridad con las devoluciones codificadas de Polyline de Google Maps Directions API v3

  • Decodificación de polilíneas desde google maps direction api con java
  • Codificación de polilíneas para Google Maps
  • El algoritmo de codificación para la cadena de niveles

¿Cómo podemos resolver el problema en la pregunta anterior?
Por favor, consulte estos tres enlaces de respuesta, que resuelve su problema:

He tomado su URL de solicitud y pegado en mi aplicación, que está utilizando la versión más reciente, y funciona muy bien. El problema puede ser la forma de analizar los datos o decodificar la cadena JSON recibida. Introduzca aquí la descripción de la imagen

 String url = "http://maps.googleapis.com/maps/api/directions/json?origin=19.5217608,-99.2615823&destination=19.531224,-99.248262&sensor=false"; HttpPost httppost = new HttpPost(url); HttpResponse response = httpclient.execute(httppost); HttpEntity entity = response.getEntity(); InputStream is = null; is = entity.getContent(); BufferedReader reader = new BufferedReader(new InputStreamReader(is, "iso-8859-1"), 8); StringBuilder sb = new StringBuilder(); sb.append(reader.readLine() + "\n"); String line = "0"; while ((line = reader.readLine()) != null) { sb.append(line + "\n"); } is.close(); reader.close(); String result = sb.toString(); JSONObject jsonObject = new JSONObject(result); JSONArray routeArray = jsonObject.getJSONArray("routes"); JSONObject routes = routeArray.getJSONObject(0); JSONObject overviewPolylines = routes.getJSONObject("overview_polyline"); String encodedString = overviewPolylines.getString("points"); List<GeoPoint> pointToDraw = decodePoly(encodedString); //Added line: mapView.getOverlays().add(new RoutePathOverlay(pointToDraw)); 

Y el método decodePoly() se toma de otra pregunta aquí en SO, que no recuerdo el autor:

 private List<GeoPoint> decodePoly(String encoded) { List<GeoPoint> poly = new ArrayList<GeoPoint>(); 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; GeoPoint p = new GeoPoint((int) (((double) lat / 1E5) * 1E6), (int) (((double) lng / 1E5) * 1E6)); poly.add(p); } return poly; } 

Estoy incluyendo lo que he usado para agregar la superposición al mapa en sí, así, no puedo encontrar el tutorial que se ha tomado de .. lo siento por no dar crédito. (Agregado la llamada a esto en el primer método que fijé)

 public class RoutePathOverlay extends Overlay { private int _pathColor; private final List<GeoPoint> _points; private boolean _drawStartEnd; public RoutePathOverlay(List<GeoPoint> points) { this(points, Color.RED, true); } public RoutePathOverlay(List<GeoPoint> points, int pathColor, boolean drawStartEnd) { _points = points; _pathColor = pathColor; _drawStartEnd = drawStartEnd; } private void drawOval(Canvas canvas, Paint paint, Point point) { Paint ovalPaint = new Paint(paint); ovalPaint.setStyle(Paint.Style.FILL_AND_STROKE); ovalPaint.setStrokeWidth(2); int _radius = 6; RectF oval = new RectF(point.x - _radius, point.y - _radius, point.x + _radius, point.y + _radius); canvas.drawOval(oval, ovalPaint); } public boolean draw(Canvas canvas, MapView mapView, boolean shadow, long when) { Projection projection = mapView.getProjection(); if (shadow == false && _points != null) { Point startPoint = null, endPoint = null; Path path = new Path(); //We are creating the path for (int i = 0; i < _points.size(); i++) { GeoPoint gPointA = _points.get(i); Point pointA = new Point(); projection.toPixels(gPointA, pointA); if (i == 0) { //This is the start point startPoint = pointA; path.moveTo(pointA.x, pointA.y); } else { if (i == _points.size() - 1)//This is the end point endPoint = pointA; path.lineTo(pointA.x, pointA.y); } } Paint paint = new Paint(); paint.setAntiAlias(true); paint.setColor(_pathColor); paint.setStyle(Paint.Style.STROKE); paint.setStrokeWidth(5); paint.setAlpha(90); if (getDrawStartEnd()) { if (startPoint != null) { drawOval(canvas, paint, startPoint); } if (endPoint != null) { drawOval(canvas, paint, endPoint); } } if (!path.isEmpty()) canvas.drawPath(path, paint); } return super.draw(canvas, mapView, shadow, when); } public boolean getDrawStartEnd() { return _drawStartEnd; } public void setDrawStartEnd(boolean markStartEnd) { _drawStartEnd = markStartEnd; } } 

Espero que esto funcione para usted.

No está utilizando todos los puntos devueltos en el resultado. No has proporcionado tu código, pero aquí hay un ejemplo con la API v3 que muestra la misma ruta que la que devolvió tu ejemplo de "google maps".

Por favor, compruebe este enlace ..

Especificar los modos de viaje

 -- driving -- walking -- bicycling -- transit 

Así que obtendrá resultados diferentes.

por favor pruebalo.

Con respecto a GeoPoint sin resolver, acabo de cambiar todas las ocurrencias de GeoPoint a LatLng y todo funcionó.

La solución anterior publicada por https://stackoverflow.com/users/975959/la-bla-bla funciona muy bien con Google Maps API V2 pero necesita algunas modificaciones menores:
Reemplazar todas las apariciones de GeoPoint con LatLng.
Reemplace la línea:

 GeoPoint p = new GeoPoint((int) (((double) lat / 1E5) * 1E6), (int) (((double) lng / 1E5) * 1E6)); 

Que se encuentra justo antes del final del método decodePoly, con esta línea:

 LatLng p = new LatLng(lat / 1E5, lng / 1E5); 

Espero que esto funcione para los usuarios de Google Maps API v2.

Utilicé la solución dada por "La bla bla", pero hice algunas pequeñas modificaciones. Estaba teniendo un problema que muestra la ruta cuando tuve demasiados puntos, cuando se Zoom en demasiado, la ruta no se muestra más, y se obtiene este mensaje en logcat "forma demasiado grande para ser procesado en una textura".

Lo que hice fue subdividir el camino de la siguiente manera:

 if (shadow == false && _points != null) { Path path = new Path();; //We are creating the path Point pointA = new Point(); for (int i = 0; i < _points.size(); i++) { mapView.getProjection().toPixels(_points.get(i), pointA); if (i == 0) path.moveTo(pointA.x, pointA.y); else path.lineTo(pointA.x, pointA.y); if(i%10==0 || i == _points.size()-1){ Paint paint = new Paint(); paint.setAntiAlias(true); paint.setColor(_pathColor); paint.setStyle(Paint.Style.STROKE); paint.setStrokeJoin(Paint.Join.ROUND); paint.setStrokeCap(Paint.Cap.ROUND); paint.setStrokeWidth(mapView.getZoomLevel()-10); paint.setAlpha(200); if (!path.isEmpty()) canvas.drawPath(path, paint); path = new Path(); path.moveTo(pointA.x, pointA.y); } } } 

Hago caminos cada 10 puntos, puede ser menos eficiente, pero de esta manera se puede mostrar la ruta cuando el zoom está en valores altos.

@ Ghareeb-Strange- Pero ¿por qué necesitamos eso con API v2? Quiero decir, tenemos polilíneas que lo hacen mucho más fácil.

 private void drawPath(){ PolylineOptions options = new PolylineOptions(); options.width(4); options.color(Color.RED); for(int i = 0; i< pathList.size(); i++ ){ options.add(pathList.get(i)); } map.addPolyline(options); } 

Con algo como el código publicado anteriormente tendría el camino perfectamente dibujado en su aplicación.

PathList es una lista que contiene todos los puntos de nuestro camino.

¡Aclamaciones!

Parece que hay suficientes respuestas, pero para este tema, me benefician este vínculo . Pero no funcionó cuando descargé e importé. Así que implementado en mi propia aplicación. Y hay un error en ese código. Cuando desee calcular por segunda vez una ruta, la aplicación. Descansos

  if (mMarkerPoints.size() > 1) { mMarkerPoints.clear(); map.clear(); // LatLng startPoint = new LatLng(nearbyLatitude, // nearbyLongitude); // drawMarker(startPoint); } 

Encuentre esas líneas y haga comentarios como lo he hecho. De todos modos, en realidad usted pidió para dibujar una ruta no todo el código, por lo que puede comprobar el código en ese sitio web. Es bueno dibujar la ruta entre los puntos (marcadores). Tenga un buen día.

  • OnMarkerClick no funciona (v2)
  • Servicios de Google Play que no funcionan en el emulador de Android API Nivel 11
  • Deshabilitar el botón de selección mientras selecciona la ubicación de la ubicación anónima mediante la opción Colocar selector google API en android
  • Android: abre la intención del mapa con direcciones con dos puntos
  • NoClassDefFoundError en la biblioteca Google Play Services V2
  • Obtener latitud y longitud utilizando código postal
  • Android "No se pudo encontrar el estilo 'mapViewStyle' en el tema actual" error
  • Problema al eliminar el elemento de clustermanager
  • MapActivity no se puede resolver con un tipo, ni siquiera con el objetivo de API de Google
  • ¿API de Google Play Services de Google para GPS solamente?
  • NavigationControl, mapTypeControl y scaleControl van detrás del mapa
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.