декодер ломаной линии, дающий StringIndexOutOfBoundsException - PullRequest
1 голос
/ 12 февраля 2012

У меня есть приложение, которое анализирует ответ json после получения 2 почтовых индексов в URL-запросе к Google Maps.Я получил узел Overviewpolyline из ответа и привел его к строке.Я предполагаю, что узел Overviewpolyline - это весь маршрут в виде ломаной линии.

Ниже приведен код, который, как я обнаружил, при передаче полилинии в виде строки преобразует эту строку в список GeoPoints.Я проверил, не является ли строка ломаной строки пустой, и, скажем, для двух почтовых индексов в строке было более 700 символов.так что никаких проблем нет.

Я отметил, где исключение происходит в коде источника ниже.Любые идеи, почему есть ошибка индекса.зацикливание контролируется оператором while и повторяется только тогда, когда длина полилинии меньше.

@SuppressWarnings("unchecked")
    private List decodePolyLine(final String poly) {



         int len = poly.length();
         Log.e(TAG, "poly string length = "+poly.length());
         int index = 0;
         List decoded = new ArrayList();
         int lat = 0;
         int lng = 0;


         while (index < len) {

         int b;
         int shift = 0;
         int result = 0;

         do {

         b = poly.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 = poly.charAt(index++) - 63;     <--------****error here****
         result |= (b & 0x1f) << shift;
         shift += 5;

         } while (b >= 0x20);



         int dlng = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1));
         lng += dlng;

         decoded.add(new GeoPoint(

                 (int)(lat*1e6) , (int)(lon * 1e6)));

         }

         return decoded;

         }//end of decodePolyLine

Ответы [ 2 ]

0 голосов
/ 03 июня 2019

Некоторые закодированные «обзор_полинии», которые мы получаем из этого отклика направлений, закодированы, имеют двойные обратные слэши.Чтобы работать в запросе на статическую карту, необходимо перевести \ в \

0 голосов
/ 12 февраля 2012

решена.проблема была не в том, что касается приведенного выше кода, а в том, как я анализировал ответ json.Мне нужно, чтобы получить объект точек внутри объекта Overviewpolyline.например,

JSONObject results = null;

        try {

            results = new JSONObject(jsonOutput);


            routes = results.getJSONArray("routes");

            anonObject = routes.getJSONObject(0);
            bounds = anonObject.getJSONObject("bounds");
            overViewPolyline = anonObject.getJSONObject("overview_polyline");
            polyPoints = overViewPolyline.getString("points");
            Log.e(TAG,"overview_polyline  = " + overViewPolyline);
            Log.e(TAG,"points  = " + polyPoints);


            northeast = bounds.getJSONObject("northeast");


            lat =  (Double) northeast.get("lat");


            lon = (Double) northeast.get("lng");


        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
...