編碼折線演算法格式

折線編碼是有損壓縮演算法,可讓您將一系列座標儲存為單一字串。點座標使用帶正負號的值進行編碼。如果只有幾個靜態點,您也可以使用互動式折線編碼公用程式

編碼程序會使用熟悉的 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. 將二進位值向左移動 1 位元:
    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 之間就會是 0x20:
    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`@