Formato del algoritmo de polilínea codificada

La codificación de polilínea es un algoritmo de compresión con pérdida que te permite almacenar una serie de coordenadas como una sola cadena. Las coordenadas de punto se codifican usando valores firmados. Si solo tienes algunos puntos estáticos, quizás también quieras usar la utilidad de codificación de polilínea.

El proceso de codificación convierte un valor binario en una serie de códigos de caracteres para Caracteres ASCII que usan el esquema de codificación Base64 conocido para garantizar una visualización adecuada de estos caracteres, los valores codificados se suman con 63 (el carácter ASCII "?") antes de convertirlos a ASCII. El algoritmo también comprueba códigos de caracteres de un punto determinado verificando el bit menos significativo de cada uno. grupo de bytes; Si este bit se establece en 1, el punto aún no está formado por completo y deben incluir datos adicionales.

Además, para ahorrar espacio, los puntos solo incluyen el desplazamiento de la punto anterior (excepto, por supuesto, en el primer punto). Todos los puntos están codificados en Base64 como números enteros firmados, ya que las latitudes y longitudes son valores firmados. El formato de codificación dentro de una polilínea debe representar dos coordenadas que representan la latitud y la longitud con una precisión razonable. Dado un máximo longitud de +/- 180 grados con una precisión de 5 decimales (de 180.00000 a -180.00000), esto da como resultado la necesidad de un número entero binario.

Ten en cuenta que la barra inversa se interpreta como un carácter de escape. dentro de literales de cadena. Cualquier resultado de esta utilidad debería convertir la barra inversa. caracteres de doble barra inversa dentro de literales de cadena.

A continuación, se especifican aspectos de codificación como los valores firmados.

  1. Toma el valor inicial firmado:
    -179.9832104
  2. Toma el valor decimal y multiplícalo por 1e5. Redondea el resultado:
    -17998321
  3. Convierte el valor decimal en binario. Ten en cuenta que un valor negativo debe ser se calculó mediante su complemento de dos invirtiendo el valor binario y agregando uno al resultado:
    00000001 00010010 10100001 11110001
    11111110 11101101 01011110 00001110
    11111110 11101101 01011110 00001111
    
  4. Desplaza el valor binario un bit a la izquierda:
    11111101 11011010 10111100 00011110
  5. Si el valor decimal original es negativo, invierte esta codificación:
    00000010 00100101 01000011 11100001
  6. Divide el valor binario en fragmentos de 5 bits (comenzando por el lado derecho):
    00001 00010 01010 10000 11111 00001
  7. Coloca los bloques de 5 bits en orden inverso:
    00001 11111 10000 01010 00010 00001
  8. O bien, cada valor con 0x20 si sigue otro bloque de bits:
    100001 111111 110000 101010 100010 000001
  9. Convierte cada valor en decimal:
    33 63 48 42 34 1
  10. Agrega 63 a cada valor:
    96 126 111 105 97 64
  11. Convierte cada valor a su equivalente en ASCII:
    `~oia@

En la siguiente tabla se muestran algunos ejemplos de puntos codificados que muestran los como una serie de desplazamientos respecto de puntos anteriores.

Ejemplo

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

Latitud Longitud Latitud en E5 Longitud en E5 Cambio de latitud Cambio de longitud Latitud codificada Longitud codificada Punto codificado
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`@

Polilínea codificada: _p~iF~ps|U_ulLnnqC_mqNvxq`@