Google Map的pb參數
下面整理一些在網路上找到的資訊與比較後我自己的一些觀察,但未必一定正確,因為目前尚未找到比較正式的說明文章。
歡迎大家一起留言討論、指教~
Google Map分享內嵌地圖時的pb參數
我之前到「台興茶場」的 賞景路線圖 中標出了三個地點,分別為「武界台興茶園」、「自定義中途點」、「終點」。從上面的embeded code中,可以看到pb參數可能就是用來描述位置、路線的結構,所以在這邊研究、紀錄一下。
呈現的Google Map如下:
這張Google Map路線圖的embeded語法為
<iframe src="https://www.google.com/maps/embed?pb=!1m30!1m12!1m3!1d2662.7265286115075!2d121.02640570056944!3d23.921239804097265!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!4m15!3e2!4m5!1s0x3468da7bbd7de411%3A0x8791aefed9381e52!2zNTQ25Y2X5oqV57ij5LuB5oSb6YSJ5rOV5rK75p2R6Iy25ZyS5be3MTMtMuiZn-atpueVjOWPsOiIiOiMtuWckg!3m2!1d23.922653!2d121.026494!4m3!3m2!1d23.9198742!2d121.0255447!4m3!3m2!1d23.9187904!2d121.0257846!5e1!3m2!1szh-TW!2stw!4v1587612067847!5m2!1szh-TW!2stw" width="1000" height="600" frameborder="0" style="border:0;" allowfullscreen="" aria-hidden="false" tabindex="0"></iframe>
上面這段Google Map的API(src裡面的連結)只能在<iframe></iframe>的標籤內使用。如果你想要更直接的修改測試,而不想要透過改在網頁中預覽(較為麻煩),可以使用一些 線上的iframe模擬測試工具 較為方便。
上面範例的pb參數擷取後如下
!1m30!1m12!1m3!1d2662.7265286115075!2d121.02640570056944!3d23.921239804097265!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!4m15!3e2!4m5!1s0x3468da7bbd7de411%3A0x8791aefed9381e52!2zNTQ25Y2X5oqV57ij5LuB5oSb6YSJ5rOV5rK75p2R6Iy25ZyS5be3MTMtMuiZn-atpueVjOWPsOiIiOiMtuWckg!3m2!1d23.922653!2d121.026494!4m3!3m2!1d23.9198742!2d121.0255447!4m3!3m2!1d23.9187904!2d121.0257846!5e1!3m2!1szh-TW!2stw!4v1587612067847!5m2!1szh-TW!2stw
在參考了幾篇網路上的文章(stackoverflow(1), stackoverflow(2) Millhouse Group,)後,大致整理如下。
資料的表達方式
pb參數的表達方式,基本上以下面的方式呈現:
![ID][DataType][n]
- !:資料的分隔符號,位於字串最前面
- ID:ID編號
- DataType:資料型態
- n:數量 (如資料型態「m」下會有多個子項目,n用來描述子項目的數量)
資料型態
- b: boolean
- d: double precision floating point
- e: enum
- f: single precision floating point
- i: integer
- m: matrix
- s: string
- u: unsigned int
- v: timestamp, unix epoch in milliseconds
- x: hexdecimal(?)
- z: encoded data or an id or some kind
拆解後的資料結構
接著我們將Google Map中embeded語法中的結構,結構中以「!」作為區隔符號,位於字串的頭部。拆解的方式可以參考以下「m」資料結構的說明,很容易理解。
# 以上面的例子來說,pb中的參數主要包含上圖這幾個區塊。在實驗後,感覺似乎(A)區塊只是提供該地圖的資訊,修改座標並不會造成地圖的移動。下面,我們再來把pb的文字,以我目前的了解在上面新增一些註解。
!1m30 !1m12 !1m3 !1d2662.7265286115075 #地圖的顯示比例 !2d121.02640570056944 #地圖的中央點座標-東西經 !3d23.921239804097265 #地圖的中央點座標-南北緯 !2m3 !1f0 #未知 !2f0 #未知 !3f0 #未知 !3m2 !1i1024 #螢幕水平解析度 - always been 1024, 似乎不影響顯示的真正大小 !2i768 #螢幕垂直解析度 – always been 768, 似乎不影響顯示的真正大小 !4f13.1 #screen size in inches !4m15 !3e2 #代表這個區塊為「路徑」的描述 !4m5 !1s0x3468da7bbd7de411%3A0x8791aefed9381e52 #(0x3468da7bbd7de411:0x8791aefed9381e52)FTID !2zNTQ25Y2X5oqV57ij5LuB5oSb6YSJ5rOV5rK75p2R6Iy25ZyS5be3MTMtMuiZn-atpueVjOWPsOiIiOiMtuWckg #店名或地址資訊(詳細說明請參考下面「z」的說明) !3m2 !1d23.922653 #路徑上標注的地點座標-東西經 !2d121.026494 #路徑上標注的地點座標-南北緯 !4m3 !3m2 !1d23.9198742 #路徑上標注的地點座標-東西經 !2d121.0255447 #路徑上標注的地點座標-南北緯 !4m3 !3m2 !1d23.9187904 #路徑上標注的地點座標-東西經 !2d121.0257846 #路徑上標注的地點座標-南北緯 !5e1 #衛星模式 !3m2 !1szh-TW #語言(修改似乎沒有影響) !2stw #國家(修改似乎沒有影響) !4v1587612067847 #? !5m2 #地圖上的顯示語言 !1szh-TW #語系 !2stw #國家(修改似乎不影響語系)
「m」的資料結構下,一般表示的方法為「xmy」。目前只感覺「x」是有順序性的,但在特殊的階層上,這個x的數字順序是不是有特定的含意或代表則還不太確定。「y」則代表這個matrix下的資料單元數量,而每個父階層的「y」會包其子階層的「xmy」描述與「xmy」下資料單元數量。因此在將資料由平整的字串拆解為上述的階層結構時,可以透過「my」的「y」來確認拆解的結果是否正確。
以上面第二列的「!1m12」為例,這個「12」分別包含了「!1m3」下的3個項目、「!2m3」下的3個項目、「!3m2」下的2個項目以及「!1m3」、「!2m3」、「!3m2」、「!4f13.1」四個階層項目,所以總共為12。
「z」表示後面的字串為編碼後的數值。
在上面第19列的「2z」後面所接的「NTQ25Y2X5oqV57ij5LuB5oSb6YSJ5rOV5rK75p2R6Iy25ZyS5be3MTMtMuiZn-atpueVjOWPsOiIiOiMtuWckg」就是地點名稱。可以隨便從網路上找一個線上的Base64 decoder,將「2z」後的字串貼上去,可以得到結果就是「546南投縣仁愛鄉法治村茶園巷13-2號武界台興茶園」,也就是台興茶園的地址資訊。
而我實驗,如果是美國地點的話,這裡顯示的則是地點的名稱。會以「2s」來做表示,也就是後面直接以字串表示,特殊字元或連接符號則以HTML URL的慣用編碼方式來取代。例如一個地點名稱為「Philz Coffee」的店家,在第19列的位置則會以「!2sPhilz%20Coffee」來表示。其中「%20」為HTML URL編碼方式的「空格」。
順道註記一下第18列的FTID,「1s」後的「0x3468da7bbd7de411%3A0x8791aefed9381e52」也就是「0x3468da7bbd7de411:0x8791aefed9381e52」。FTID是一個地點的唯一識別ID,以上面的地點台興茶園來說,可以從下面的這個連結來驗證它是FTID。
https://google.com/maps?ftid=0x3468da7bbd7de411:0x8791aefed9381e52
「e」的資料結構下,一般表示的方法為「xey」。這似乎是google map裏定義好的功能代號,目前觀察到的規則有:
- !3e2:地圖中有路線
- !5e0:地圖模式(預設)
- !5e1:衛星模式
其他參考連結: