Formato dell'algoritmo polilinea codificato

La codifica polilinea è un algoritmo di compressione con perdita di dati che consente di archiviare una serie di coordinate come un'unica stringa. Le coordinate di punti sono codificate utilizzando valori firmati. Se disponi solo di pochi punti statici, puoi utilizzare anche l'utilità di codifica polilinea interattiva.

Il processo di codifica converte un valore binario in una serie di codici per i caratteri ASCII utilizzando lo schema di codifica Base64 familiare: per garantire una corretta visualizzazione di questi caratteri, i valori codificati vengono sommati con 63 (il carattere ASCII "?") prima di convertirli in ASCII. L'algoritmo verifica anche la presenza di codici di caratteri aggiuntivi per un determinato punto controllando il bit meno significativo di ogni gruppo di byte. Se questo bit è impostato su 1, il punto non è ancora completamente formato e devono seguire dati aggiuntivi.

Inoltre, per risparmiare spazio, i punti includono solo l'offset rispetto al punto precedente (tranne ovviamente per il primo punto). Tutti i punti sono codificati in Base64 come numeri interi firmati, poiché latitudine e longitudine sono valori firmati. Il formato di codifica all'interno di una polilinea deve rappresentare con una precisione ragionevole due coordinate che rappresentano latitudine e longitudine. Data una longitudine massima compresa tra +/- 180 gradi e una precisione di cinque cifre decimali (da 180,00000 a -180,00000), questo comporta la necessità di un valore intero binario con segno a 32 bit.

Tieni presente che la barra rovesciata viene interpretata come un carattere di escape nei valori letterali stringa. Qualsiasi output di questa utilità dovrebbe convertire i caratteri barra rovesciata in doppie barre rovesciate all'interno di valori letterali stringa.

Di seguito sono specificati i passaggi per la codifica di un valore firmato di questo tipo.

  1. Prendi il valore firmato iniziale:
    -179.9832104
  2. Prendi il valore decimale e moltiplicalo per 1e5, arrotondando il risultato:
    -17998321
  3. Converti il valore decimale in binario. Tieni presente che un valore negativo deve essere calcolato utilizzando il complementare a due, invertendo il valore binario e aggiungendo uno al risultato:
    00000001 00010010 10100001 11110001
    11111110 11101101 01011110 00001110
    11111110 11101101 01011110 00001111
    
  4. Sposta a sinistra il valore binario di un bit:
    11111101 11011010 10111100 00011110
  5. Se il valore decimale originale è negativo, inverti questa codifica:
    00000010 00100101 01000011 11100001
  6. Suddividi il valore binario in blocchi di 5 bit (a partire dal lato destro):
    00001 00010 01010 10000 11111 00001
  7. Inverti l'ordine dei blocchi a 5 bit:
    00001 11111 10000 01010 00010 00001
  8. OPPURE ogni valore con 0x20 se segue un altro blocco di bit:
    100001 111111 110000 101010 100010 000001
  9. Converti ogni valore in decimale:
    33 63 48 42 34 1
  10. Aggiungi 63 a ciascun valore:
    96 126 111 105 97 64
  11. Converti ogni valore nell'equivalente ASCII:
    `~oia@

La tabella seguente mostra alcuni esempi di punti codificati, con le codifiche come una serie di offset dai punti precedenti.

Esempio

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

Latitudine Longitudine Latitudine in E5 Longitudine in E5 Variazione di latitudine Variazione di longitudine Latitudine codificata Longitudine codificata Punto codificato
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`@

Polilinea codificata: _p~iF~ps|U_ulLnnqC_mqNvxq`@