编码多段线算法格式

多段线编码是一种有损压缩算法,利用这种算法, 坐标为单个字符串。点坐标使用带符号的值进行编码。 如果只有几个静态点,您可能还希望使用交互式 多段线编码实用程序

编码过程会将一个二进制值转换为一系列字符代码, 使用熟悉的 base64 编码方案的 ASCII 字符:确保正确显示 编码值的总和为 63(ASCII 字符“?”) 然后再将其转换为 ASCII 字符。该算法还会检查是否存在 通过检查每个字符代码的最低有效位, 字节组;如果该位设为 1,表示该点尚未完全成形, 额外数据。

此外,为了节省空间,点仅包含相对于 上一积分(当然,第一点除外)。所有点均已编码 以有符号整数表示,因为纬度和经度是带符号的值。 多段线内的编码格式需要表示两个坐标 以合理的精度表示纬度和经度。给定最大值 经度 +/- 180 度,精确到 5 位小数 (180.00000 到 -180.00000),这会导致需要 32 位有符号 二进制整数值。

请注意,反斜杠会被解释为转义字符 。此实用程序的任何输出都应转换反斜杠 改为双反斜杠。

下文指定了编码此类有符号的值的步骤。

  1. 取初始有符号值:
    -179.9832104
  2. 将此十进制值乘以 1e5,然后进行四舍五入:
    -17998321
  3. 将十进制值转换为二进制值。请注意,负值必须是 使用 <ph type="x-smartling-placeholder"></ph> 计算 二进制补码:反转二进制值并在结果中添加 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 进行 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`@