Vista de mapa para dibujar direcciones usando google Directions API – deencoding de polilíneas

Intento usar la API de indicaciones de Google para mostrar las indicaciones en mi vista de mapa pero tengo dificultades para obtener los datos de la respuesta de JSON. Puedo obtener las cadenas de “niveles” y “puntos” pero no puedo descifrar cómo decodificarlas en puntos en el mapa.

Cualquier ayuda sería muy apreciada.

Tengo una clase que puede descodificar para usted, agregue la clase a continuación y luego ingrese su código de esta manera:

int[] decodedZoomLevels = PolylineDecoder.decodeZoomLevels(levels); GeoPoint[] gPts = PolylineDecoder.decodePoints(points, decodedZoomLevels.length); 

donde los points y levels son los datos que ha extraído de la respuesta JSON. A continuación, puede pasar por la matriz de geopoints dibujando una línea entre ellos para mostrar sus direcciones.

¡Espero que esto ayude! Kenny


EDITAR: Parecería que la API de direcciones de google ya no devuelve la cadena de niveles de zoom como parte de la respuesta JSON, no hay que preocuparse, todo lo que usamos para esto es verificar el número de puntos, así que simplemente podemos ponerlos en una lista como:

 public static List  decodePoints(String encoded_points){ int index = 0; int lat = 0; int lng = 0; List  out = new ArrayList(); try { int shift; int result; while (index < encoded_points.length()) { shift = 0; result = 0; while (true) { int b = encoded_points.charAt(index++) - '?'; result |= ((b & 31) << shift); shift += 5; if (b < 32) break; } lat += ((result & 1) != 0 ? ~(result >> 1) : result >> 1); shift = 0; result = 0; while (true) { int b = encoded_points.charAt(index++) - '?'; result |= ((b & 31) < < shift); shift += 5; if (b < 32) break; } lng += ((result & 1) != 0 ? ~(result >> 1) : result >> 1); /* Add the new Lat/Lng to the Array. */ out.add(new GeoPoint((lat*10),(lng*10))); } return out; }catch(Exception e) { e.printStackTrace(); } return out; } 

EDITAR: VIEJO CÓDIGO

 public class PolylineDecoder { /** * Transform a encoded PolyLine to a Array of GeoPoints. * Java implementation of the original Google JS code. * @see Original encoding part: http://code.google.com/apis/maps/documentation/polylinealgorithm.html * @return Array of all GeoPoints decoded from the PolyLine-String. * @param encoded_points String containing the encoded PolyLine. * @param countExpected Number of points that are encoded in the PolyLine. Easiest way is to use the length of the ZoomLevels-String. * @throws DecodingException */ public static GeoPoint[] decodePoints(String encoded_points, int countExpected){ int index = 0; int lat = 0; int lng = 0; int cnt = 0; GeoPoint[] out = new GeoPoint[countExpected]; try { int shift; int result; while (index < encoded_points.length()) { shift = 0; result = 0; while (true) { int b = encoded_points.charAt(index++) - '?'; result |= ((b & 31) << shift); shift += 5; if (b < 32) break; } lat += ((result & 1) != 0 ? ~(result >> 1) : result >> 1); shift = 0; result = 0; while (true) { int b = encoded_points.charAt(index++) - '?'; result |= ((b & 31) < < shift); shift += 5; if (b < 32) break; } lng += ((result & 1) != 0 ? ~(result >> 1) : result >> 1); /* Add the new Lat/Lng to the Array. */ out[cnt++] = new GeoPoint((lat*10),(lng*10)); } return out; }catch(Exception e) { e.printStackTrace(); } return out; } public static int[] decodeZoomLevels(String encodedZoomLevels){ int[] out = new int[encodedZoomLevels.length()]; int index = 0; for(char c : encodedZoomLevels.toCharArray()) out[index++] = c - '?'; return out; } } 

Puede usar la biblioteca de la API de Android de Google Maps . ¡Propone un PolyUtil.decode(String encoded) que hace exactamente lo que necesita!

GeoPoint no funciona para mí, no puedo encontrar la biblioteca que lo usa. Aquí hay una función que devuelve valores LatLng.

 public static ArrayList decodePolyPoints(String encodedPath){ int len = encodedPath.length(); final ArrayList path = new ArrayList(); int index = 0; int lat = 0; int lng = 0; while (index < len) { int result = 1; int shift = 0; int b; do { b = encodedPath.charAt(index++) - 63 - 1; result += b << shift; shift += 5; } while (b >= 0x1f); lat += (result & 1) != 0 ? ~(result >> 1) : (result >> 1); result = 1; shift = 0; do { b = encodedPath.charAt(index++) - 63 - 1; result += b < < shift; shift += 5; } while (b >= 0x1f); lng += (result & 1) != 0 ? ~(result >> 1) : (result >> 1); path.add(new LatLng(lat * 1e-5, lng * 1e-5)); } return path; } 

Lo agarró de la biblioteca de la utilidad Google Maps Android API . El código se puede encontrar aquí

Algunos recordatorios al probar esto con cadenas codificadas en el código, Java no puede leer correctamente

 "\" 

necesita agregar otra barra para que java la lea correctamente.

 "\\" 

Solo un aviso porque las cadenas codificadas contienen caracteres extraños.