Ну, это старый, но эй. Я немного поработал над этим, поэтому вот что я выяснил:
Данные представляют собой кодированный массив 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 для хранения lat/long информации, и это НЕ кодируется в шестнадцатеричном формате , но без знака долго со значением, установленным в value = coordinate<0 ? (430+coordinate)*1e7 : coordinate*1e7
пример (вытащил прямо из Google Maps) типа х данных используется таким образом: https://www.google.com/maps/vt?pb=!1m8!4m7!2u7!5m2!1x405712614!2x3250870890!6m2!1x485303036!2x3461808386!2m1!1e0!2m20!1e2!2spsm!4m2!1sgid!2sznfCVopRY49wPV6IT72Cvw!4m2!1ssp!2s1!8m11!13m9!2sa!15b1!18m5!2b1!3b0!4b1!5b0!6b0!19b1!19u12!3m1!5e1105!4e5!18m1!1b1
Для контексте заданного вопроса , важно отметить, что в структуре нет надежных идентификаторов. Google считывает значения в определенном порядке, поэтому всегда имейте в виду при создании собственных закодированных данных, которые требуют порядка; вам нужно будет провести некоторое исследование/тестирование, чтобы определить этот порядок. Что касается чтения, ваша лучшая надежда состоит в том, чтобы перестроить матричную структуру, а затем сканировать ее для чего-то, что выглядит как значения lat/long (т. Е. Матрица, содержащая ровно два дочерних типа типа double (или x?))
Я создал основной Javascript GIST на основе вашего ответа грамматического разбора «данных» значение атрибута в 'Array': https://gist.github.com/jeteon/e71fa21c1feb48fe4b5eeec045229a0c – jeteon