Ну, это старо, но эй. Я сам немного работал над этим, так что вот что я понял:
Данные представляют собой закодированный массив javascript, поэтому хитрость при попытке создать собственную строку данных заключается в том, чтобы убедиться, что ваше форматирование сохраняет структуру массива нетронутой. Для этого давайте посмотрим, что представляет собой каждый шаг.
Как вы правильно поняли, каждый восклицательный знак определяет начало определения значения. Первый символ, значение int, является внутренним счетчиком и (я полагаю) действует как идентификатор, хотя я не уверен в этом на 100%. Это кажется довольно гибким с точки зрения того, что вы можете здесь иметь, если это int. Однако второй персонаж гораздо важнее. Он определяет тип данных значения. Я не знаю, нашел ли я еще все типы данных, но те, которые я понял, это:
m: matrix
f: float
d: double
i: integer
b: boolean
e: enum (as integer)
s: string
u: unsigned int
x: hexdecimal value?
остальные символы фактически содержат само значение, поэтому строка будет просто содержать строку, логическое значение будет «1» или «0» и так далее. Однако есть важный нюанс: матричный тип данных.
Значение матрицы будет целым числом. Это длина матрицы, измеряемая количеством значений. То есть для матрицы !1mx следующие определения значения x будут принадлежать матрице. Это включает определения вложенных матриц, поэтому матрица формы [[1,2]]
будет выглядеть как !1m3!1m2!1i1!2i2
(внешняя матрица имеет трех дочерних элементов, внутренняя матрица имеет 2). это также означает, что для того, чтобы удалить значение из списка, вы также должны проверить его на наличие матричных предков и, если они существуют, обновить их значения, чтобы отразить отсутствующий член.
Тип данных x — еще одна аномалия. Я предполагаю, что для большинства целей он закодирован в шестнадцатеричном формате, но в моей конкретной ситуации (вызов информации об атрибуции) они, похоже, также используют тип данных x для хранения информации о широте / долготе, и это НЕ кодируется в шестнадцатеричном формате , но представляет собой unsigned long со значением, установленным как value = coordinate<0 ? (430+coordinate)*1e7 : coordinate*1e7
Пример (извлеченный непосредственно из карт Google) типа данных x, используемого таким образом: https://www.google.com/maps/vt?pb=!1m8!4m7!2u7!5m2!1x405712614!2x3250870890!6m2!1x485303036!2x3461808386!2m1!1E0!2M20!1E2!2SPSM!4M2!1SGID!2SSNFCVOPRY49WPV6IT72CVW!4M2!1SSP!2SA!15B1!18M5!2B1!3B0!4B1!5B0!6b0!19b1!19u12!3m1!5e1105!4e5!18m1!1b1
Для контекста заданного вопроса важно отметить, что в структуре нет надежных идентификаторов. Google считывает значения в определенном порядке, поэтому при создании собственных закодированных данных всегда помните, что порядок имеет значение; вам нужно будет провести некоторое исследование/тестирование, чтобы определить этот порядок. Что касается чтения, вам лучше всего перестроить матричную структуру, а затем отсканировать ее на наличие чего-то похожего на значения широты/длины (т.е. матрицу, содержащую ровно двух дочерних элементов типа double (или x?))
person
Josh Doebbert
schedule
14.12.2015