Diferencia de versión de la API de Google Maps

Intento mostrar la ruta entre dos lugares, quiero utilizar Google Places API V3 para los pasos de ruta entre dos puntos.


Antes de usar Old 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:

Antigua API de Google Maps


Ahora trato de reemplazar esto con la API de Google Maps nueva, y la siguiente solicitud da un resultado incorrecto. En ambos casos, estoy usando la misma fuente y el mismo destino, pero el resultado arroja 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 pasos entre el origen y el destino, por lo que la ruta no se muestra perfecta en Google Map.

Por favor, ayuda a resolver este problema para New Google Maps API 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 Google Directions API v3?
Consulte estos tres enlaces para obtener más información con los retornos de polilínea codificados de la Google Maps Directions API v3

  • Deencoding de polilíneas desde api de dirección de google maps con java
  • Codificación de polilíneas para Google Maps
  • El algoritmo de encoding para la cadena de niveles

¿Cómo podemos resolver el problema en la pregunta anterior?
Consulte estos tres enlaces de respuesta, que resuelven su problema:

Tomé su URL de solicitud y la pegué en mi aplicación, que está usando la versión más nueva, y funciona muy bien. El problema puede ser cómo analizar los datos o decodificar la cadena JSON recibida. enter image description here

 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 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 al autor:

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

También incluyo lo que he usado para agregar la superposición al mapa, no puedo encontrar el tutorial del que se tomó. Lo siento por no dar crédito. (agregué la llamada a esto en el primer método que publiqué)

 public class RoutePathOverlay extends Overlay { private int _pathColor; private final List _points; private boolean _drawStartEnd; public RoutePathOverlay(List points) { this(points, Color.RED, true); } public RoutePathOverlay(List 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 ha proporcionado su código, pero aquí hay un ejemplo con la API v3 que muestra la misma ruta que la que muestra su ejemplo de “google maps”.

Por favor revisa este enlace ..

Y especifique modos de viaje

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

para que obtengas resultados diferentes

por favor pruebalo.

Con respecto a GeoPoint sin resolver, cambié 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:
Reemplace todas las apariciones de GeoPoint con LatLng.
Reemplazar 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 la API v2 de Google Maps.

Usé la solución dada por “La bla bla”, pero hice algunas pequeñas modificaciones. Estaba teniendo un problema al mostrar la ruta cuando tenía demasiados puntos, cuando amplía demasiado, la ruta ya no se muestra y obtiene este mensaje en forma de logcat “demasiado grande para representarse 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 rutas cada 10 puntos, puede ser menos eficiente, pero de esta manera puede mostrar la ruta cuando el zoom está en valores altos.

@ Ghareeb-Strange- Pero ¿por qué lo necesitamos con API v2? Quiero decir, tenemos una polilínea que lo hace 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 así como el código publicado arriba, tendrías la ruta perfectamente dibujada en tu 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 beneficio este enlace . Pero no funcionó cuando lo descargué e importé. Entonces lo implementé en mi propia aplicación. Y hay un error en ese código. Cuando desee calcular la ruta por segunda vez, la aplicación. se rompe

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

Encuentra esas líneas y haz comentarios como lo hice. De todos modos, en realidad, solicitó dibujar una ruta, no un código completo, para que pueda verificar el código en ese sitio web. Es bueno dibujar la ruta entre puntos (marcadores). Tenga un buen día.