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:
- ¿Qué es el nivel de zoom 15 equivalente a?
- Android animateCamera GoogleMap.CancelableCallback Uso
- ¿Cómo mover la cámara cuando el marcador sale de la pantalla?
- Cambio entre la API de Google Maps para Android v2 DEBUG y la clave de API de RELEASE
- Cómo utilizar RouteBoxer.js para Google Map en Android
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:
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
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.
- Enviar el GeoPoint a otra actividad
- Manejo de eventos táctiles en SurfaceView sobre Maps API v2
- Dibujar ruta en el mapa de google basado en lat lang
- Google Maps no puede agregar referencia a los servicios de Google Play
- Mapa no funciona después de instalar desde la tienda de juegos en android
- Forma de círculo antialise Google Maps V2 Android
- Abrir Google Maps desde hipervínculo
- Obtener Lat Lang de un place_id devuelto por autocompletar lugar api
¿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:
- Android: traza un mapa de rutas entre dos geopuntos
- https://stackoverflow.com/a/10268114/1472665
- https://stackoverflow.com/a/11357351/1494309
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.
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.
- Android Webview Enlace de anclaje (enlace de salto) no funciona
- Error de Android: no se puede agregar ventana – el símbolo nulo no es para una aplicación