Định dạng thuật toán đa tuyến đã mã hoá

Mã hoá nhiều đường là một thuật toán nén có tổn hao cho phép bạn lưu trữ một loạt các toạ độ dưới dạng một chuỗi duy nhất. Toạ độ điểm được mã hoá bằng các giá trị có dấu. Nếu chỉ có một vài điểm tĩnh, bạn cũng nên sử dụng tiện ích mã hoá nhiều dòng tương tác.

Quá trình mã hoá chuyển đổi một giá trị nhị phân thành một chuỗi mã ký tự cho các ký tự ASCII bằng cách sử dụng lược đồ mã hoá base64 quen thuộc: để đảm bảo hiển thị đúng cách các ký tự này, các giá trị đã mã hoá được tổng hợp bằng 63 (ký tự ASCII "?") trước khi chuyển đổi chúng thành ASCII. Thuật toán cũng kiểm tra các mã ký tự bổ sung cho một điểm nhất định bằng cách kiểm tra bit ít quan trọng nhất trong từng nhóm byte; nếu bit này được đặt thành 1, điểm đó chưa được hình thành đầy đủ và cần phải có thêm dữ liệu bổ sung.

Ngoài ra, để tiết kiệm không gian, các điểm chỉ bao gồm phần bù trừ so với điểm trước (tất nhiên là ngoại trừ điểm đầu tiên). Tất cả các điểm đượ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 phải biểu thị 2 toạ độ đại diện cho vĩ độ và kinh độ với độ chính xác hợp lý. Với kinh độ tối đa là +/- 180 độ với độ chính xác là 5 chữ số thập phân (180.00000 đến -180.00000), điều này dẫn đến sự cần thiết phải có một giá trị số nguyên nhị phân có dấu 32 bit.

Xin lưu ý rằng dấu gạch chéo ngược được hiểu là một ký tự thoát trong giá trị cố định kiểu chuỗi. Mọi đầu ra của tiện ích này đều phải chuyển đổi ký tự dấu gạch chéo ngược thành dấu gạch chéo ngược trong giá trị cố định dạng chuỗi.

Các bước để mã hoá một giá trị đã ký như vậy được chỉ định bên dưới.

  1. Lấy giá trị đã ký ban đầu:
    -179.9832104
  2. Lấy giá trị thập phân rồi nhân với 1e5, làm tròn kết quả:
    -17998321
  3. Chuyển đổi giá trị thập phân sang nhị phân. Lưu ý rằng một giá trị âm phải được tính bằng cách sử dụng phần bổ sung của 2 bằng cách đảo ngược giá trị nhị phân rồi cộng 1 vào kết quả:
    00000001 00010010 10100001 11110001
    11111110 11101101 01011110 00001110
    11111110 11101101 01011110 00001111
    
  4. Di chuyển sang trái giá trị nhị phân một chút:
    11111101 11011010 10111100 00011110
  5. Nếu giá trị thập phân ban đầu là số âm, hãy đảo ngược mã hoá sau:
    00000010 00100101 01000011 11100001
  6. Chia giá trị nhị phân thành các phần 5 bit (bắt đầu từ phía bên phải):
    00001 00010 01010 10000 11111 00001
  7. Đặt các phân đoạn 5 bit theo thứ tự ngược lại:
    00001 11111 10000 01010 00010 00001
  8. HOẶC mỗi giá trị có 0x20 nếu một phân đoạn bit khác theo sau:
    100001 111111 110000 101010 100010 000001
  9. Chuyển đổi từng giá trị thành số thập phân:
    33 63 48 42 34 1
  10. Cộng 63 vào mỗi giá trị:
    96 126 111 105 97 64
  11. Chuyển đổi từng giá trị sang bộ mã ASCII tương đương:
    `~oia@

Bảng dưới đây cho thấy một số ví dụ về các điểm được mã hoá, cho thấy mã hoá dưới dạng một chuỗi các điểm bù trừ so với 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ĩ độ trong E5 Kinh độ ở E5 Thay đổi vĩ độ Thay đổi kinh độ Vĩ độ đã mã hoá Kinh độ đã 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`@