Mã hoá polyline là thuật toán nén có tổn hao cho phép bạn lưu trữ chuỗi các toạ độ dưới dạng một chuỗi đơn. Toạ độ điểm được mã hoá bằng các giá trị đã ký. Nếu chỉ có một vài điểm tĩnh, bạn cũng có thể sử dụng tính năng tiện ích mã hoá nhiều dòng.
Quá trình mã hoá sẽ chuyển đổi một giá trị nhị phân thành một chuỗi mã ký tự cho Ký tự ASCII sử dụng lược đồ mã hoá base64 quen thuộc: để đảm bảo hiển thị chính xác trong số các ký tự này, các giá trị được mã hoá được cộng lại bằng 63 (ký tự ASCII '?') trước khi chuyển đổi chúng thành ASCII. Thuật toán này cũng kiểm tra các bước bổ sung các mã ký tự cho một điểm nhất định bằng cách kiểm tra bit có ý nghĩa nhỏ nhất của mỗi mã nhóm byte; nếu bit này được đặt bằng 1 thì điểm đó chưa được định dạng đầy đủ và dữ liệu bổ sung sẽ đi kèm.
Ngoài ra, để tiết kiệm không gian, điểm chỉ bao gồm phần bù trừ của điểm trước (tất nhiên ngoại trừ điểm đầu tiên). Tất cả các điểm đều được mã hoá trong Base64 dưới dạng số nguyên có dấu, vì vĩ độ và kinh độ là các giá trị có dấu. Định dạng mã hoá trong hình nhiều đường cần biểu thị 2 toạ độ thể hiện vĩ độ và kinh độ với độ chính xác hợp lý. Đã cho tối đa kinh độ +/- 180 độ đến độ chính xác là 5 chữ số thập phân (180.00000 đến -180.00000), điều này dẫn đến nhu cầu có chữ ký 32 bit giá trị số nguyên nhị phân.
Xin lưu ý rằng dấu gạch chéo ngược được hiểu là ký tự thoát trong giá trị cố định kiểu chuỗi. Mọi kết quả đầu ra của phần mềm tiện ích này phải chuyển đổi dấu gạch chéo ngược thành dấu gạch chéo ngược hai lần trong giá trị cố định kiểu chuỗi.
Các bước mã hoá giá trị đã ký như vậy được nêu rõ bên dưới.
- Lấy giá trị có dấu ban đầu:
-179.9832104
- Lấy giá trị thập phân và nhân với 1e5, làm tròn kết quả:
-17998321
- Chuyển đổi giá trị thập phân sang nhị phân. Lưu ý rằng giá trị âm phải là
được tính theo công thức
phần bù của 2 bằng cách đảo ngược giá trị nhị phân rồi cộng thêm một vào kết quả:
00000001 00010010 10100001 11110001 11111110 11101101 01011110 00001110 11111110 11101101 01011110 00001111
- Di chuyển sang trái giá trị nhị phân một bit:
11111101 11011010 10111100 00011110
- Nếu giá trị thập phân ban đầu là số âm, hãy đảo ngược phương thức mã hoá này:
00000010 00100101 01000011 11100001
- Chia giá trị nhị phân thành các đoạn 5 bit (bắt đầu từ phía bên phải):
00001 00010 01010 10000 11111 00001
- Sắp xếp các đoạn 5 bit theo thứ tự đảo ngược:
00001 11111 10000 01010 00010 00001
- HOẶC mỗi giá trị có giá trị 0x20 nếu có một đoạn bit khác theo sau:
100001 111111 110000 101010 100010 000001
- Chuyển đổi từng giá trị thành số thập phân:
33 63 48 42 34 1
- Thêm 63 vào mỗi giá trị:
96 126 111 105 97 64
- Chuyển đổi từng giá trị sang bộ mã ASCII tương đương:
`~oia@
Bảng bên dưới trình bày một số ví dụ về các điểm được mã hoá, hiển thị mã hoá dưới dạng một chuỗi các giá trị bù trừ từ các điểm trước đó.
Ví dụ:
Điểm: (38,5, -120,2), (40,7, -120,95), (43,252, -126,453)
Vĩ độ | Kinh độ | Vĩ độ tại E5 | Kinh độ tại E5 | Thay đổi vĩ độ | Thay đổi theo kinh độ | Vĩ độ đã mã hoá | Kinh độ được mã hoá | Điểm đã mã hoá |
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`@ |
Hình nhiều đường được mã hoá: _p~iF~ps|U_ulLnnqC_mqNvxq`@