多段线编码是一种有损压缩算法,允许您将一系列坐标存储为单个字符串。点坐标使用有符号值进行编码。如果只有几个静态点,您可能还需要使用交互式多段线编码实用程序。
编码过程使用熟悉的 base64 编码方案将二进制值转换为 ASCII 字符的一系列字符代码:为了确保正确显示这些字符,在将其转换为 ASCII 之前,先将编码值与 63(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
- 将二进制值左移 1 位:
11111101 11011010 10111100 00011110
- 如果原始十进制值为负数,请反转以下编码:
00000010 00100101 01000011 11100001
- 将二进制值分成 5 位区块(从右侧开始):
00001 00010 01010 10000 11111 00001
- 将 5 位区块按倒序排列:
00001 11111 10000 01010 00010 00001
- 如果后面有另一个位块,则将每个值与 0x20 进行或运算:
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`@