編碼折線演算法格式
透過集合功能整理內容
你可以依據偏好儲存及分類內容。
折線編碼是一種有損壓縮演算法,
做為單一字串的參考。點座標使用含正負號的值編碼。
如果只有幾個靜態要點,不妨使用
折線編碼公用程式。
編碼程序會將二進位值轉換為一系列
採用熟悉的 Base64 編碼配置的 ASCII 字元:確保正確顯示
都會將編碼值加總為 63 (ASCII 字元「?」)
才轉換為 ASCII。演算法也會檢查
字元碼,方法是檢查每個點的最小有效位元
位元組群組;如果這個位元設為 1,表示該點尚未形成完整,
其他資料必須遵循
此外,為了節省空間,控點只會包括
(第一點除外)。所有點都經過編碼
視為帶正負號整數,因為經緯度均為帶正負號值。
折線中的編碼格式必須代表兩個座標
將經緯度調整為合理的精確度。達到上限
經度 +/- 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)
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`@
除非另有註明,否則本頁面中的內容是採用創用 CC 姓名標示 4.0 授權,程式碼範例則為阿帕契 2.0 授權。詳情請參閱《Google Developers 網站政策》。Java 是 Oracle 和/或其關聯企業的註冊商標。
上次更新時間:2025-08-29 (世界標準時間)。
[null,null,["上次更新時間:2025-08-29 (世界標準時間)。"],[[["\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`@``"]]