2013-08-23 57 views
6

林試圖找出如何提取緯度/長谷歌的開始/結束的地圖路線鏈接,看起來像這樣:「」我如何解碼/編碼新的谷歌地圖的網址參數?

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

林猜測是變量之間的一個分隔符,後面跟着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%確定的。在這裏你可以擁有的東西看起來很靈活,只要它是一個整數。然而,第二個人物更重要。它定義了該值的數據類型。我不知道如果我發現所有的數據類型,但我已經想通了的是:

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數據類型來存儲緯度/經度信息,並且這不是以十六進制的,但是一個無符號長與設定爲 value = coordinate<0 ? (430+coordinate)*1e7 : coordinate*1e7

一個例子的X數據類型的(直接從谷歌地圖拉動)的值以這種方式被使用: 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按照特定的順序讀取值,因此在構建您自己的編碼數據時,請始終記住順序重要;你需要做一些研究/測試來確定訂單。至於閱讀,你最好的希望是重建矩陣結構,然後掃描它看起來像緯度/長度值的東西(即一個包含兩個類型爲double(或x?))

+1

我創建了一個基本的JavaScript要點根據你的回答來分析「數據」屬性值轉換成'Array':https://gist.github.com/jeteon/e71fa21c1feb48fe4b5eeec045229a0c – jeteon

1

看起來像來自當前瀏覽器的開發人員工具(我正在使用Chrome)可以爲您提供大量信息。

嘗試以下操作:

  • 轉到與Chrome的谷歌地圖(或調整其他瀏覽器的說明);
  • 打開開發者工具(Ctrl + Shift + I);
  • 轉到網絡選項卡。清除當前顯示的值;
  • 拖動地圖,直到出現一些帶編碼數據的網址;
  • 點擊該網址,然後轉到預覽子選項卡;

enter image description here

相關問題