Format Algoritme Polyline yang Dienkodekan

Encoding polyline adalah algoritma kompresi lossy yang memungkinkan Anda menyimpan serangkaian koordinat visual sebagai string tunggal. Koordinat titik dienkodekan menggunakan nilai yang ditandatangani. Jika Anda hanya memiliki beberapa titik statis, Anda juga dapat menggunakan utilitas encoding polyline.

Proses penyandian{i> <i}mengubah nilai biner menjadi serangkaian kode karakter untuk Karakter ASCII menggunakan skema encoding base64 yang sudah dikenal: untuk memastikan tampilan yang tepat dari karakter ini, nilai yang dienkode dijumlahkan dengan 63 (karakter ASCII '?') sebelum mengubahnya menjadi ASCII. Algoritma juga memeriksa adanya penambahan kode karakter untuk titik tertentu dengan memeriksa bit yang paling tidak signifikan dari setiap titik {i>byte group<i}; jika bit ini diatur ke 1, titik ini belum sepenuhnya terbentuk dan data tambahan harus menyusul.

Selain itu, untuk menghemat ruang, titik hanya menyertakan offset dari poin sebelumnya (kecuali tentu saja untuk poin pertama). Semua titik dienkode di Base64 sebagai integer bertanda tangan, karena lintang dan bujur adalah nilai yang ditandatangani. Format encoding dalam polyline harus mewakili dua koordinat yang merepresentasikan lintang dan bujur hingga presisi yang wajar. Maksimum yang ditetapkan bujur +/- 180 derajat hingga presisi 5 angka desimal (180.00000 hingga -180.00000), ini menghasilkan kebutuhan tanda tangan 32 bit nilai bilangan bulat biner.

Perhatikan bahwa garis miring terbalik ditafsirkan sebagai karakter escape dalam literal string. Output apa pun dari utilitas ini harus mengonversi garis miring terbalik karakter menjadi garis miring terbalik ganda dalam literal string.

Langkah-langkah untuk mengenkode nilai yang ditandatangani tersebut dijelaskan di bawah ini.

  1. Ambil nilai awal yang ditandatangani:
    -179.9832104
  2. Ambil nilai desimal, lalu kalikan dengan 1e5, dan membulatkan hasilnya:
    -17998321
  3. Konversikan nilai desimal menjadi biner. Perhatikan bahwa nilai negatif harus dihitung menggunakan nilai komplementer dua dengan membalik nilai biner dan menambahkan satu ke hasil:
    00000001 00010010 10100001 11110001
    11111110 11101101 01011110 00001110
    11111110 11101101 01011110 00001111
    
  4. Geser nilai biner ke kiri sebanyak satu bit:
    11111101 11011010 10111100 00011110
  5. Jika nilai desimal aslinya negatif, balikkan encoding ini:
    00000010 00100101 01000011 11100001
  6. Pisahkan nilai biner menjadi potongan 5-bit (mulai dari sisi kanan):
    00001 00010 01010 10000 11111 00001
  7. Tempatkan potongan 5-bit ke dalam urutan terbalik:
    00001 11111 10000 01010 00010 00001
  8. ATAU setiap nilai dengan 0x20 jika potongan bit lain mengikuti:
    100001 111111 110000 101010 100010 000001
  9. Konversi setiap nilai ke desimal:
    33 63 48 42 34 1
  10. Tambahkan 63 ke setiap nilai:
    96 126 111 105 97 64
  11. Konversikan setiap nilai ke padanan ASCII-nya:
    `~oia@

Tabel di bawah menampilkan beberapa contoh titik yang dienkode, yang menunjukkan pengkodean sebagai rangkaian {i> offset<i} dari titik sebelumnya.

Contoh

Poin: (38.5, -120.2), (40.7, -120.95), (43.252, -126.453)

Lintang Bujur Garis Lintang dalam E5 Garis Bujur dalam E5 Perubahan dalam Garis Lintang Perubahan dalam Garis Bujur Garis Lintang yang Dienkodekan Garis Bujur yang Dienkodekan Titik yang Dienkodekan
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`@

Polyline yang dienkode: _p~iF~ps|U_ulLnnqC_mqNvxq`@