Encoding polyline adalah algoritma kompresi lossy yang memungkinkan Anda menyimpan serangkaian koordinat sebagai string tunggal. Koordinat titik dienkodekan menggunakan nilai yang ditandatangani. Jika Anda hanya memiliki beberapa titik statis, sebaiknya gunakan utilitas encoding polyline interaktif.
Proses encoding mengonversi nilai biner menjadi serangkaian kode karakter untuk karakter ASCII menggunakan skema encoding base64 yang sudah dikenal: untuk memastikan karakter ini ditampilkan dengan tepat, nilai yang dienkode dijumlahkan dengan 63 (karakter ASCII '?') sebelum mengonversinya menjadi ASCII. Algoritma juga memeriksa kode karakter tambahan untuk titik tertentu dengan memeriksa bit yang paling tidak signifikan di setiap grup byte; jika bit ini disetel ke 1, titik tersebut belum sepenuhnya terbentuk dan data tambahan harus mengikuti.
Selain itu, untuk menghemat ruang, titik hanya menyertakan offset dari titik sebelumnya (kecuali tentu saja untuk titik pertama). Semua titik dienkode di Base64 sebagai bilangan bulat yang ditandatangani, karena lintang dan bujur adalah nilai yang ditandatangani. Format encoding dalam polyline harus mewakili dua koordinat yang mewakili lintang dan bujur dengan presisi yang wajar. Dengan mempertimbangkan garis bujur maksimum /- 180 derajat hingga presisi 5 angka desimal (180,00000 hingga -180,00000), hal ini akan menghasilkan nilai bilangan bulat biner bertanda 32 bit.
Perhatikan bahwa garis miring terbalik ditafsirkan sebagai karakter escape dalam literal string. Setiap output utilitas ini harus mengonversi karakter garis miring terbalik menjadi garis miring terbalik ganda dalam literal string.
Langkah-langkah untuk mengenkode nilai yang ditandatangani tersebut dijelaskan di bawah ini.
- Ambil nilai awal yang ditandatangani:
-179.9832104
- Ambil nilai desimal dan kalikan dengan 1e5, bulatkan hasilnya:
-17998321
- Konversikan nilai desimal menjadi biner. Perhatikan bahwa nilai negatif harus
dihitung menggunakan
pelengkap duanya dengan membalikkan nilai biner dan menambahkan satu ke hasilnya:
00000001 00010010 10100001 11110001 11111110 11101101 01011110 00001110 11111110 11101101 01011110 00001111
- Geser nilai biner ke kiri satu bit:
11111101 11011010 10111100 00011110
- Jika nilai desimal aslinya negatif, balik encoding ini:
00000010 00100101 01000011 11100001
- Pisahkan nilai biner menjadi potongan 5 bit (dimulai dari sisi kanan):
00001 00010 01010 10000 11111 00001
- Tempatkan potongan 5 bit dalam urutan terbalik:
00001 11111 10000 01010 00010 00001
- ATAU setiap nilai dengan 0x20 jika potongan bit lain mengikuti:
100001 111111 110000 101010 100010 000001
- Konversi setiap nilai ke desimal:
33 63 48 42 34 1
- Tambahkan 63 ke setiap nilai:
96 126 111 105 97 64
- Konversi setiap nilai ke padanan ASCII-nya:
`~oia@
Tabel di bawah menunjukkan beberapa contoh titik yang dienkode, yang menampilkan encoding sebagai serangkaian offset 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 dienkodekan: _p~iF~ps|U_ulLnnqC_mqNvxq`@