折線編碼是一種容易失真的壓縮演算法,可讓您將一連串座標儲存為單一字串。點座標是以帶正負號的值編碼的。如果您只有少數幾個靜態點,您也可以使用互動式的折線編碼公用程式。
編碼程序使用常見的 base64 編碼配置,將二進位值轉換為一連串 ASCII 字元的字元碼:為確保這些字元能正確顯示,編碼值會先加上 63(ASCII 字元「?」),才轉換為 ASCII。演算法也會透過檢查各位元組群組的最低有效位元,來檢查針對特定點的額外字元碼;如果該位元設定為 1,則該點尚未完全形成,需要補充額外資料。
此外,為節省空間,每個點只會包含距離前一點的位移 (當然,第一個點除外)。由於緯度和經度均為帶正負號的值,因此所有的點會以 Base64 編碼為帶正負號的整數。折線的編碼格式必須能在合理的精確度下,代表緯度和經度這兩個座標。若最大經度 +/- 180 度的精確度為小數點後 5 位數(180.00000 至 -180.00000),這會需要 32 位元的帶正負號二進位整數值。
請注意,字串常值中的反斜線會被解譯為逸出字元。 在此公用程式的所有輸出中,字串常值中的反斜線字元都應該轉換為雙反斜線。
以下示範為這類帶正負號的值進行編碼的步驟。
- 擷取初始帶正負號的值:
-179.9832104 - 擷取十進位值並乘以 1e5,再將結果四捨五入:
-17998321 - 將十進位值轉換為二進位。請注意,負值必須以其二補數計算,做法是將二進位值反轉,並在結果加上 1:
00000001 00010010 10100001 11110001
11111110 11101101 01011110 00001110
11111110 11101101 01011110 00001111 - 將二進位值左移一個位元:
11111101 11011010 10111100 00011110 - 如果原始十進位值為負值,請反轉此編碼:
00000010 00100101 01000011 11100001 - 將二進位值每 5 位元分為一區塊(從右邊開始):
00001 00010 01010 10000 11111 00001 - 將這些 5 位元區塊以反向順序排列:
00001 11111 10000 01010 00010 00001 - 如果有另一個位元區塊緊接其後,則將每一個值與 0x20 進行 OR 運算:
100001 111111 110000 101010 100010 000001 - 將每個值轉換成十進位:
33 63 48 42 34 1 - 將每個值加上 63:
96 126 111 105 97 64 - 將每個值轉換成相等的 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`@
