2013-08-23 3 views
6

Im пытаясь выяснить, как извлечь широту/долготу в начале/конце в Google Maps направления ссылки, которая выглядит так: «!»Как декодировать/кодировать параметры URL для новых карт Google?

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

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

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

ответ

0

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

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); 
4

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

Данные представляют собой кодированный массив 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?))

+1

Я создал основной Javascript GIST на основе вашего ответа грамматического разбора «данных» значение атрибута в 'Array': https://gist.github.com/jeteon/e71fa21c1feb48fe4b5eeec045229a0c – jeteon

1

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

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

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

enter image description here

Смежные вопросы