Карта Просмотр направлений рисования с использованием google Directions API – декодирование полилиний

Я пытаюсь использовать API-интерфейс Google, чтобы показывать маршруты на моем карте, но у меня возникают трудности с получением данных из ответа JSON. Я могу получить строки «levels» и «points», но не могу понять, как их декодировать в точки на карте.

Любая помощь приветствуется.

У меня есть class, который может их декодировать, добавьте ниже class, а затем вызовите свой код следующим образом:

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

где points и levels – это данные, которые вы извлекли из ответа JSON. Затем вы можете пройти через массив геотонов, нарисовав линию между ними, чтобы отобразить ваши указания.

Надеюсь это поможет! Kenny


EDIT: Казалось бы, API-интерфейс google больше не возвращает строку уровней масштабирования как часть ответа JSON, но не стоит беспокоиться, но все, что мы использовали для этого, это проверка количества очков, поэтому мы можем просто поместить их в список вроде:

 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: СТАРЫЙ КОД

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

Вы можете использовать утилиту Google Maps Android API Utility Library . Он предлагает PolyUtil.decode(String encoded) который делает именно то, что вам нужно!

GeoPoint не работает для меня, я не могу найти библиотеку, которая ее использует. Вот функция, которая возвращает значения 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; } 

Схватил его из утилиты Google Maps Android API . Код можно найти здесь

Некоторые напоминания при тестировании с жестко закодированными строками в коде Java не может правильно читать

 "\" 

вам нужно добавить еще одну косую черту, чтобы она была правильно прочитана java.

 "\\" 

Просто голова, потому что закодированные строки содержат странные символы.

  • Как использовать данные JSON POST в приложении Express
  • Как преобразовать набор результатов Java в JSON?
  • Получить объект JSON из ответа HTTP
  • Что значит .d в JSON?
  • Как декодировать свойство с типом словаря JSON в Swift 4 decodable protocol
  • Замедленный заказ JSON
  • Может ли JSON начать с "["?
  • Как обрабатывать NumberFormatException с Gson при десериализации JSON-ответ
  • Использование JsonConvert.DeserializeObject для десериализации Json в class C # POCO
  • Сообщение AJAX строкового массива JavaScript в JsonResult как List Всегда возвращает нуль?
  • Должны ли ключи JSON быть уникальными?
  • Interesting Posts

    Java Calendar.set (Calendar.DAY_OF_WEEK, Calendar.WUNDAY), будет ли он откатываться назад, вперед или неизвестно?

    Отображать номера от 1 до 100 без петель или условий

    Преобразование динамического диска в основной диск

    Как заставить клавиатуру вводить японский язык?

    Как создать пользовательские атрибуты пространства имен XML при использовании устаревшей службы SOAP?

    Windows 7 x64 – Как проверить свою память?

    Как работают многоядерные процессоры?

    Лучший способ parsingа данных JSON в .NET-объект

    Как получить один файл из определенной версии в Git

    Инструмент сборки Gradle не может найти play-services-tasks.aar? Зачем?

    Как нарисовать трапецию / трапецию с css3?

    Какие устройства используют скручивание для полосы пропускания?

    Установите изображение в ImageView, сохраните пропорции и измените размер ImageView на размеры изображения?

    Есть ли ошибка в управлении представлением списка Delphi при использовании пользовательского чертежа?

    Список устройств поддержки HCE?

    Давайте будем гением компьютера.