編碼折線演算法格式

折線編碼是有損壓縮的演算法,可讓您將一系列座標儲存為單一字串。點座標是以已簽署的值編碼。如果您只有少數靜態點,建議您也使用互動式折線編碼公用程式

編碼程序會使用熟悉的 Base64 編碼架構,將二進位值轉換為一系列 ASCII 半形字元代碼:為確保系統能夠正確顯示這些字元,編碼值會先加總 63 (ASCII 字元 '?'),再將其轉換為 ASCII。演算法也會檢查每個位元組群組的最低位元,藉此檢查指定點的其他半形字元代碼;如果位元設為 1,則點尚未完全格式化,因此必須遵循其他資料。

此外,為了節省空間,分數只包含前一個點的偏移值 (第一個點除外)。所有點會以 Base64 編碼為已簽署的整數,因為緯度和經度都是已簽署的值。折線中的編碼格式必須代表這兩個經緯度,代表合理的精確度。已知最高經度 +/- 180 度,且精確度上限為 5 個小數位數 (180.00000 至 -180.00000),這會導致需要 32 位元的二進位整數。

請注意,反斜線會視為字串常值中的逸出字元。此公用程式的任何輸出內容應將字串常值中的反斜線字元轉換為雙反斜線。

有關編碼這類含正負號值的步驟說明如下。

  1. 使用初始帶正負號的值:
    -179.9832104
  2. 請將十進位值乘以 1e5,並四捨五入結果:
    -17998321
  3. 將十進位值轉換成二進位。請注意,負值必須採用二進制的值並對結果加上一個 2' 補貼,來計算:
    00000001 00010010 10100001 11110101 11101111110111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 只要個這類特定射或者通常會您也可以匯出編輯特定畫面,請提供時間為準
  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 的值:
    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`@