Map View draw directions using google Directions API - decoding polylines

前端 未结 3 2054
日久生厌
日久生厌 2020-11-28 07:08

I\'m trying to use the Google directions API to show directions on my mapview but I am having difficulties getting the data from the JSON response. I can get the \"levels\"

3条回答
  •  情深已故
    2020-11-28 08:01

    I have a class which can decode them for you, add the class below then call in your code like this:

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

    where points and levels are the data you've extracted from the JSON response. You can then go through the array of geopoints drawing a line between them to display your directions.

    Hope this helps! Kenny


    EDIT: It would seem that the google directions API no longer returns the zoom levels string as part of the JSON response, not to worry though, all we were using this for was to check the number of points, so we can simply put these into a list like:

    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;
    }
    

    EDIT: OLD CODE

    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;
    
    }
    }
    

提交回复
热议问题