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 string. Las coordenadas de punto se codifican usando valores firmados. Si solo tienes algunos puntos estáticos, es posible que también desees usar la utilidad de codificación de polilínea interactiva.

El proceso de codificación convierte un valor binario en una serie de códigos de caracteres para los caracteres ASCII mediante el esquema de codificación base64 conocido: a fin de garantizar que se muestren de forma correcta, los valores codificados se suman con 63 (el carácter ASCII '?') antes de convertirlos en ASCII. El algoritmo también verifica los códigos de caracteres adicionales para un punto dado mediante la verificación del bit menos importante de cada grupo de bytes; si este bit se establece en 1, el punto aún no está completamente formado y deben seguir los datos adicionales.

Además, para conservar el espacio, los puntos solo incluyen el desplazamiento desde el punto anterior (excepto, por supuesto, para el primer punto). Todos los puntos se codifican en Base64 como números enteros firmados, ya que las latitudes y las 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. Dada una longitud máxima de +/- 180 grados a una precisión de 5 decimales (de 180.00000 a -180.00000), esto da como resultado la necesidad de un valor entero binario firmado de 32 bits.

Ten en cuenta que la barra inversa se interpreta como un carácter de escape dentro de los literales de string. Cualquier resultado de esta utilidad debe convertir los caracteres de la barra invertida en barras inversas dobles dentro de los literales de string.

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 se debe calcular con su dos complementos de dos mediante la inversión del valor binario y la adición de uno al resultado:
    00000001 00010010 10100001 11110001
    11111100 11101100 010000000000000001000000000101.
  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 (a partir del lado derecho):
    00001 00010 01010 10000 11111 00001
  7. Coloca los fragmentos de 5 bits en orden inverso:
    00001 11111 10000 01010 00010 00001
  8. O cada valor con 0x20 si sigue otro fragmento de bits:
    100001 111111 110000 101010 100010 000001
  9. Convierte cada valor en decimal:
    33 63 48 42 34 1
  10. Agregue 63 a cada valor:
    96 126 111 105 97 64
  11. Convierte cada valor a su equivalente ASCII:
    `~oia@

En la siguiente tabla, se muestran algunos ejemplos de puntos codificados que muestran las codificaciones como una serie de desplazamientos de puntos anteriores.

Ejemplo

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

Latitude 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`@