как декодировать/кодировать параметры URL для новых карт Google?

Я пытаюсь выяснить, как извлечь широту/долготу начала/конца в ссылке направлений Google Maps, которая выглядит следующим образом:

https://www.google.com/maps/preview#!data=!1m4!1m3!1d189334!2d-96.03687!3d36.1250439!4m21!3m20!1m4!3m2!3d36.0748342!4d-95.8040972!6E2!1M5!1S1331-1399+E+14-13-1399+E+14+ST%2C+Tulsa%2C+OK+74120!2S0x87b6ec9a1679f980feebbb5e!3M2!3D36.1424613!4d36.14736986!3M8!1M3!1D189334!2D-96.03687!3d36.1250439!3m2!1i1366!2i705!4f13.1&fid=0

Я угадываю "!" — это разделитель между переменными, за которым следует XY, где x — число, а y — строчная буква, но не совсем понятно, как надежно извлечь координаты, поскольку количество/порядок переменных меняется, а также их префиксы XY.

идеи? спасибо


person laserpanda    schedule 23.08.2013    source источник


Ответы (3)


Ну, это старо, но эй. Я сам немного работал над этим, так что вот что я понял:

Данные представляют собой закодированный массив 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
comment
Я создал базовый Javascript Gist на основе вашего ответа, чтобы проанализировать значение атрибута данных в Array: gist.github. com/jeteon/e71fa21c1feb48fe4b5eeec045229a0c - person jeteon; 21.09.2016
comment
Декодер на PHP: gist.github.com/mingalevme/04702bb7e5e361448cbe44cb7b3895d5 - person MingalevME; 07.08.2019
comment
Есть z-тип: !2z0JfRg9Cx0L7QstGB0LrQuNC5INCxLdGALCA0LCDQnNC-0YHQutCy0LASIDExOTAzNA! - выглядит как двоичные данные в кодировке base64 - person MingalevME; 07.08.2019
comment
x-параметр - это не координаты, это собственный идентификатор места. Подробнее здесь stackoverflow.com/questions/47017387/. - person Alexander; 20.07.2021

Похоже, инструменты разработчика из текущих браузеров (я использую для этого Chrome) могут дать вам много информации.

Попробуйте следующее:

  • Зайдите в Google Maps с помощью Chrome (или адаптируйте инструкции для другого браузера);
  • Откройте Инструменты разработчика (Ctrl+Shift+I);
  • Перейдите на вкладку Сеть. Очистить текущие отображаемые значения;
  • Перетащите карту, пока не появится URL-адрес с закодированными данными;
  • Нажмите на этот URL-адрес, а затем перейдите на вложенную вкладку «Предварительный просмотр»;

введите описание изображения здесь

person heltonbiker    schedule 26.06.2017

Попробуй это.

function URLtoLatLng(url) {
  this.lat = url.replace(/^.+!3d(.+)!4d.+$/, '$1');
  this.lng = url.replace(/^.+!4d(.+)!6e.+$/, '$1');
  return this;
}

var url = new URLtoLatLng('https://www.google.com/maps/preview#!data=!1m4!1m3!1d189334!2d-96.03687!3d36.1250439!4m21!3m20!1m4!3m2!3d36.0748342!4d-95.8040972!6e2!1m5!1s1331-1399+E+14th+St%2C+Tulsa%2C+OK+74120!2s0x87b6ec9a1679f9e5%3A0x6e70df70feebbb5e!3m2!3d36.1424613!4d-95.9736986!3m8!1m3!1d189334!2d-96.03687!3d36.1250439!3m2!1i1366!2i705!4f13.1&fid=0');

console.log(url.lat + ' ' + url.lng);

person StackSlave    schedule 23.08.2013