编码多段线算法格式
使用集合让一切井井有条
根据您的偏好保存内容并对其进行分类。
多段线编码是一种有损压缩算法,利用这种算法,
坐标为单个字符串。点坐标使用带符号的值进行编码。
如果只有几个静态点,您可能还希望使用交互式
多段线编码实用程序。
编码过程会将一个二进制值转换为一系列字符代码,
使用熟悉的 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)
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`@
如未另行说明,那么本页面中的内容已根据知识共享署名 4.0 许可获得了许可,并且代码示例已根据 Apache 2.0 许可获得了许可。有关详情,请参阅 Google 开发者网站政策。Java 是 Oracle 和/或其关联公司的注册商标。
最后更新时间 (UTC):2025-07-22。
[null,null,["最后更新时间 (UTC):2025-07-22。"],[[["\u003cp\u003ePolyline encoding is a lossy compression algorithm that represents a series of coordinates as a single string.\u003c/p\u003e\n"],["\u003cp\u003eThe algorithm uses signed values, Base64 encoding, and offsets from the previous point to compress the data.\u003c/p\u003e\n"],["\u003cp\u003ePoints are encoded by converting latitude and longitude to binary, applying bitwise operations, and converting the result to ASCII characters.\u003c/p\u003e\n"],["\u003cp\u003eEncoded polylines are strings that consist of these ASCII characters, representing the sequence of geographical points.\u003c/p\u003e\n"]]],["Polyline encoding compresses coordinates into a single string. It encodes points as signed integers representing offsets from the previous point. The process involves multiplying the decimal by 1e5, converting to binary (using two's complement for negative values), left-shifting, inverting if negative, dividing into 5-bit chunks, reversing chunk order, OR-ing with 0x20, adding 63, and converting to ASCII. Points are represented in Base64 and latitude/longitude are paired, encoded sequentially. The result is a compact string representing the sequence of points.\n"],null,["# Encoded Polyline Algorithm Format\n\nPolyline encoding is a lossy compression algorithm that allows you to store a series of\ncoordinates as a single string. Point coordinates are encoded using signed values.\nIf you only have a few static points, you may also wish to use the interactive\n[polyline encoding utility](/maps/documentation/utilities/polylineutility).\n\nThe encoding process converts a binary value into a series of character codes for\nASCII characters using the familiar base64 encoding scheme: to ensure proper display\nof these characters, encoded values are summed with 63 (the ASCII character '?')\nbefore converting them into ASCII. The algorithm also checks for additional\ncharacter codes for a given point by checking the least significant bit of each\nbyte group; if this bit is set to 1, the point is not yet fully formed and\nadditional data must follow.\n\nAdditionally, to conserve space, **points only include the offset from the\nprevious point** (except of course for the first point). All points are encoded\nin Base64 as signed integers, as latitudes and longitudes are signed values.\nThe encoding format within a polyline needs to represent two coordinates\nrepresenting latitude and longitude to a reasonable precision. Given a maximum\nlongitude of +/- 180 degrees to a precision of 5 decimal places\n(180.00000 to -180.00000), this results in the need for a 32 bit signed\nbinary integer value.\n\nNote that the backslash is interpreted as an escape character within string literals. Any output of this utility should convert backslash\ncharacters to double-backslashes within string literals.\n\nThe steps for encoding such a signed value are specified below.\n\n1. Take the initial signed value: \n `-179.9832104`\n2. Take the decimal value and multiply it by 1e5, rounding the result: \n `-17998321`\n3. Convert the decimal value to binary. Note that a negative value must be calculated using its [two's complement](https://en.wikipedia.org/wiki/Two%27s_complement) by inverting the binary value and adding one to the result: \n\n ```\n 00000001 00010010 10100001 11110001\n 11111110 11101101 01011110 00001110\n 11111110 11101101 01011110 00001111\n ```\n4. Left-shift the binary value one bit: \n `11111101 11011010 10111100 00011110`\n5. If the original decimal value is negative, invert this encoding: \n `00000010 00100101 01000011 11100001`\n6. Break the binary value out into 5-bit chunks (starting from the right hand side): \n `00001 00010 01010 10000 11111 00001`\n7. Place the 5-bit chunks into reverse order: \n `00001 11111 10000 01010 00010 00001`\n8. OR each value with 0x20 if another bit chunk follows: \n `100001 111111 110000 101010 100010 000001`\n9. Convert each value to decimal: \n `33 63 48 42 34 1`\n10. Add 63 to each value: \n `96 126 111 105 97 64`\n11. Convert each value to its ASCII equivalent: \n ```~oia@``\n\nThe table below shows some examples of encoded points, showing the\nencodings as a series of offsets from previous points. \n\n### Example\n\nPoints: (38.5, -120.2), (40.7, -120.95), (43.252, -126.453)\n\n|----------|-----------|----------------|-----------------|--------------------|---------------------|------------------|-------------------|---------------|\n| Latitude | Longitude | Latitude in E5 | Longitude in E5 | Change In Latitude | Change In Longitude | Encoded Latitude | Encoded Longitude | Encoded Point |\n| 38.5 | -120.2 | 3850000 | -12020000 | +3850000 | -12020000 | `_p~iF` | `~ps|U` | `_p~iF~ps|U` |\n| 40.7 | -120.95 | 4070000 | -12095000 | +220000 | -75000 | `_ulL` | `nnqC` | `_ulLnnqC` |\n| 43.252 | -126.453 | 4325200 | -12645300 | +255200 | -550300 | `_mqN` | ``vxq`@`` | ``_mqNvxq`@`` |\n\n**Encoded polyline** : ``_p~iF~ps|U_ulLnnqC_mqNvxq`@``"]]