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

Mã hoá nhiều dòng là một thuật toán nén mất dữ liệu cho phép bạn lưu trữ một loạt toạ độ dưới dạng một chuỗi duy nhất. 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 tiện ích mã hoá nhiều dòng tương tác.

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

Ngoài ra, để tiết kiệm dung lượng, các điểm chỉ bao gồm độ lệch từ điểm trước (ngoại trừ điểm đầu tiên). Tất cả các điểm đều được mã hoá ở 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 một polyline cần phải thể hiện hai tọa độ đại diện cho vĩ độ và kinh độ với độ chính xác hợp lý. Do có 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 sẽ dẫn đến việc cần giá trị số nguyên nhị phân 32 bit có dấu.

Hãy lưu ý rằng dấu gạch chéo ngược được diễn giải là ký tự thoát trong giá trị cố định kiểu chuỗi. Mọi đầu ra của tiện ích này sẽ chuyển đổi ký tự dấu gạch chéo ngược thành dấu gạch chéo đôi trong chuỗi ký tự.

Bạn có thể xem các bước mã hóa giá trị đã ký như dưới đây.

  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 thành nhị phân. Xin lưu ý rằng bạn phải tính toán giá trị âm bằng cách sử dụng phần bổ sung hai phẩy
  4. Di chuyển sang trái giá trị nhị phân một bit:
    11111101 11011010 10111100 00011110
  5. Nếu giá trị thập phân ban đầu là số âm, hãy đảo ngược mã này:
    00000010 00100101 01000011 11100001
  6. Chia giá trị nhị phân thành các phân đoạ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 5 bit theo thứ tự đảo ngược:
    00001 11111 10000 01010 00010 00001
  8. HOẶC mỗi giá trị có giá trị 0x20 nếu một phân đoạn bit khác sau đây:
    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. Thêm 63 vào mỗi giá trị:
    96 126 111 105 97 64
  11. Chuyển đổi từng giá trị thành ASCII tương đương:
    `~oia@

Bảng bên dưới cho thấy một số ví dụ về điểm được mã hoá, thể hiện quá trình mã hoá dưới dạng một loạt các giá trị chênh lệch 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 độ trong E5 Thay đổi trong Latitude Thay đổi về kinh độ Vĩ độ được mã hoá Kinh độ mã hóa Đ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`@

Nhiều đường mã hoá: _p~iF~ps|U_ulLnnqC_mqNvxq`@