Google Map的pb參數

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:衛星模式

 

 

其他參考連結: