多段线编码是一种有损压缩算法,利用这种算法, 坐标为单个字符串。点坐标使用带符号的值进行编码。 如果只有几个静态点,您可能还希望使用交互式 多段线编码实用程序。
编码过程会将一个二进制值转换为一系列字符代码, 使用熟悉的 base64 编码方案的 ASCII 字符:确保正确显示 编码值的总和为 63(ASCII 字符“?”) 然后再将其转换为 ASCII 字符。该算法还会检查是否存在 通过检查每个字符代码的最低有效位, 字节组;如果该位设为 1,表示该点尚未完全成形, 额外数据。
此外,为了节省空间,点仅包含相对于 上一积分(当然,第一点除外)。所有点均已编码 以有符号整数表示,因为纬度和经度是带符号的值。 多段线内的编码格式需要表示两个坐标 以合理的精度表示纬度和经度。给定最大值 经度 +/- 180 度,精确到 5 位小数 (180.00000 到 -180.00000),这会导致需要 32 位有符号 二进制整数值。
请注意,反斜杠会被解释为转义字符 。此实用程序的任何输出都应转换反斜杠 改为双反斜杠。
下文指定了编码此类有符号的值的步骤。
- 取初始有符号值:
-179.9832104
- 将此十进制值乘以 1e5,然后进行四舍五入:
-17998321
- 将十进制值转换为二进制值。请注意,负值必须是
使用 <ph type="x-smartling-placeholder"></ph> 计算
二进制补码:反转二进制值并在结果中添加 1:
00000001 00010010 10100001 11110001 11111110 11101101 01011110 00001110 11111110 11101101 01011110 00001111
- 将二进制值左移 1 位:
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`@