編碼折線演算法格式

折線編碼是一種容易失真的壓縮演算法,可讓您將一連串座標儲存為單一字串。點座標是以帶正負號的值編碼的。如果您只有少數幾個靜態點,您也可以使用互動式的折線編碼公用程式

編碼程序使用常見的 base64 編碼配置,將二進位值轉換為一連串 ASCII 字元的字元碼:為確保這些字元能正確顯示,編碼值會先加上 63(ASCII 字元「?」),才轉換為 ASCII。演算法也會透過檢查各位元組群組的最低有效位元,來檢查針對特定點的額外字元碼;如果該位元設定為 1,則該點尚未完全形成,需要補充額外資料。

此外,為節省空間,每個點只會包含距離前一點的位移 (當然,第一個點除外)。由於緯度和經度均為帶正負號的值,因此所有的點會以 Base64 編碼為帶正負號的整數。折線的編碼格式必須能在合理的精確度下,代表緯度和經度這兩個座標。若最大經度 +/- 180 度的精確度為小數點後 5 位數(180.00000 至 -180.00000),這會需要 32 位元的帶正負號二進位整數值。

請注意,字串常值中的反斜線會被解譯為逸出字元。 在此公用程式的所有輸出中,字串常值中的反斜線字元都應該轉換為雙反斜線。

以下示範為這類帶正負號的值進行編碼的步驟。

  1. 擷取初始帶正負號的值:
    -179.9832104
  2. 擷取十進位值並乘以 1e5,再將結果四捨五入:
    -17998321
  3. 將十進位值轉換為二進位。請注意,負值必須以其二補數計算,做法是將二進位值反轉,並在結果加上 1:
    00000001 00010010 10100001 11110001
    11111110 11101101 01011110 00001110
    11111110 11101101 01011110 00001111
  4. 將二進位值左移一個位元:
    11111101 11011010 10111100 00011110
  5. 如果原始十進位值為負值,請反轉此編碼:
    00000010 00100101 01000011 11100001
  6. 將二進位值每 5 位元分為一區塊(從右邊開始):
    00001 00010 01010 10000 11111 00001
  7. 將這些 5 位元區塊以反向順序排列:
    00001 11111 10000 01010 00010 00001
  8. 如果有另一個位元區塊緊接其後,則將每一個值與 0x20 進行 OR 運算:
    100001 111111 110000 101010 100010 000001
  9. 將每個值轉換成十進位:
    33 63 48 42 34 1
  10. 將每個值加上 63:
    96 126 111 105 97 64
  11. 將每個值轉換成相等的 ASCII 字元碼:
    `~oia@

下表顯示編碼點的部分範例,可從中看出這些編碼是一系列與前一點之間的位移。

範例

點:(38.5, -120.2)、(40.7, -120.95)、(43.252, -126.453)



緯度 經度 E5 表示的緯度 E5 表示的經度 緯度變化 經度變化 編碼後的緯度 編碼後的經度 編碼點
38.5 -120.2 3850000 -12020000 +3850000 -12020000 _p~iF ~ps|U _p~iF~ps|U
40.7 -120.95 4070000 -12095000 +220000 -75000 _ulL nnqC _ulLnnqC
43.252 -126.453 4325200 -12645300 +255200 -550300 _mqN vxq`@ _mqNvxq`@

編碼折線:_p~iF~ps|U_ulLnnqC_mqNvxq`@

傳送您對下列選項的寶貴意見...

這個網頁
Google Maps API
Google Maps API