Estoy tratando de utilizar las direcciones de Google API para mostrar las direcciones en mi mapview, pero estoy teniendo dificultades para obtener los datos de la respuesta en JSON. Puedo conseguir los «niveles» y «puntos» cadenas pero no se puede averiguar cómo descifrar a los puntos en el mapa.

Cualquier ayuda sería muy apreciada.

OriginalEl autor Testo | 2011-07-15

3 Comentarios

  1. 19

    Tengo una clase que puede descifrar, agregue la clase de abajo, a continuación, llamar en su código como este:

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

    donde points y levels son los datos que hemos extraído de la respuesta en JSON. Usted puede ir a través de la matriz de geopoints dibujar una línea entre ellos para mostrar sus instrucciones.

    Espero que esto ayude! Kenny


    EDIT: parece que las direcciones de google API ya no devuelve los niveles de zoom de la cadena como parte de la respuesta en JSON, no te preocupes, todos estábamos usando este fue a comprobar el número de puntos, por lo que simplemente puede poner en una lista como:

    public static List <GeoPoint> decodePoints(String encoded_points){
    int index = 0;
    int lat = 0;
    int lng = 0;
    List <GeoPoint> out = new ArrayList<GeoPoint>();
    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;
    }

    EDIT: CÓDIGO ANTIGUO

    public class PolylineDecoder {
    /**
    * Transform a encoded PolyLine to a Array of GeoPoints.
    * Java implementation of the original Google JS code.
    * @see Original encoding part: <a href="http://code.google.com/apis/maps/documentation/polylinealgorithm.html">http://code.google.com/apis/maps/documentation/polylinealgorithm.html</a>
    * @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;
    }
    }
    gracias voy a dar que un intento.
    Wow! Muchísimas gracias por esta clase!
    Kenny, muchas gracias!!!!!
    hola Kenny, ¿cómo puedo obtener niveles de la cadena codificada? o niveles y puntos de cadenas son iguales?
    Hola, ahora hay un nuevo mapa de google de la versión y GeoPoint clase no apoyo por parte de la api. puedo usar LatLng(doble lat,doble gnl) en lugar de GeoPoint(int, int)?

    OriginalEl autor Kenny

  2. 0

    GeoPoint no me funciona, no puedo encontrar la biblioteca que utiliza. Aquí es una función que devuelve LatLng valores.

    public static ArrayList<LatLng> decodePolyPoints(String encodedPath){
    int len = encodedPath.length();
    final ArrayList<LatLng> path = new ArrayList<LatLng>();
    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;
    }

    Agarró de Google Maps Android API de la biblioteca de utilidad.
    Puedes encontrar el código de aquí

    Algunos recordatorios cuando las pruebas de este con codificados cadenas en el código Java no puede leer correctamente

    "\"

    necesita agregar otra barra para que se lea correctamente por java.

    "\\"

    Sólo un mano a mano porque en cadenas codificadas contener caracteres extraños.

    OriginalEl autor Marlon

Dejar respuesta

Please enter your comment!
Please enter your name here