Formato del algoritmo de polilíneas codificadas
Las polilíneas codificadas almacenan dos tipos de información codificada para cualquier conjunto de puntos determinado: la latitud y la longitud de los puntos y el nivel máximo de acercamiento con el que se deben mostrar. Los niveles se codifican con valores sin firmar, mientras que las coordenadas de puntos necesitan utilizar valores firmados, por lo que el proceso de codificación es ligeramente diferente en cada caso. Este proceso se describe a continuación. Si sólo tienes unos pocos puntos estáticos, también puedes utilizar la utilidad de codificación de polilíneas interactiva.
Codificación de latitudes y longitudes
El proceso de codificación convierte un valor binario en una serie de códigos de caracteres ASCII mediante el habitual esquema de codificación en Base-64: to ensure proper display of these characters, encoded values are summed with 63 (the ASCII character '?') antes de su conversión a ASCII. El algoritmo también comprueba si existen códigos de caracteres adicionales en un punto determinado, comprobando el bit menos significativo de cada grupo de bytes; si el bit tiene el valor 1, el punto no está formado completamente y requiere datos adicionales.
Además, para conservar espacio, los puntos sólo incluyen el desplazamiento desde el punto anterior (excepto en el caso del primer punto). Todos los puntos se codifican en Base-64 como números enteros firmados, ya que las latitudes y las longitudes son valores firmados. El formato de codificación de una polilínea debe representar dos coordenadas que indiquen la latitud y la longitud con una precisión razonable. Dada una longitud máxima de +/- 180 grados con una precisión de 5 lugares decimales (de 180,00000 a -180,00000), da lugar a 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 la cadena. Cualquier resultado de esta utilidad debe convertir los caracteres de barra inversa a barras inversas dobles dentro de la cadena.
Los pasos para codificar los valores firmados se especifican a continuación.
- Utiliza el valor firmado inicial:
-179.9832104
- Utiliza el valor decimal y multiplícalo por 1e5, y se obtendrá el resultado:
-17998321
- Convierte el valor decimal en binario. Ten en cuenta que los valores negativos se deberán invertir y se deberán proporcionar valores aislar hacia el límite de bytes:
00000001 00010010 10100001 11110001
11111110 11101101 10100001 00001110
11111110 11101101 01011110 00001111
- Cambia el valor binario:
11111110 11101101 01011110 00001111 0
- Si el valor decimal original es negativo, invierte esta codificación:
00000001 00010010 10100001 11110000 1
- Divide el valor binario en fragmentos de 5 bits (comenzando desde la derecha):
00001 00010 01010 10000 11111 00001
- Coloca los fragmentos de 5 bits en el orden inverso:
00001 11111 10000 01010 00010 00001
- O bien, cada valor con 0x20 si le sigue otro fragmento de bit:
100001 111111 110000 101010 100010 000001
- Convierte cada valor a decimal:
33 63 48 42 34 1
- Añade 63 a cada valor:
96 126 111 105 97 64
- Convierte cada valor a su equivalente ASCII:
`~oia@
En la siguiente tabla encontrarás algunos ejemplos de puntos codificados, con las codificaciones como una serie de desplazamientos desde los puntos anteriores.
Ejemplo
Puntos: (38.5, -120.2), (40.7, -120.95), (43.252, -126.453)
| 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`@
Codificación de niveles
Una polilínea codificada también almacena información que especifica la precisión al dibujar la polilínea. Esta información permite que el mapa omita el dibujo de segmentos en niveles de acercamiento en los que no se necesita tanta precisión. Cada punto de una polilínea codificada almacena esta información en una cadena levels que también se incluye con los puntos codificados.
Nota: este nivel de codificación no corresponde directamente a un nivel de acercamiento, aunque están relacionados. De forma más precisa, el parámetro numLevels divide los niveles de acercamiento existentes (actualmente 18) en grupos de niveles de acercamiento. Por ejemplo, dado un valor de numLevels de 4, los niveles de acercamiento se agrupan en los siguientes niveles:
| Nivel 0 |
Niveles de acercamiento 0 a 5 |
| Nivel 1 |
Niveles de acercamiento 6 a 10 |
| Nivel 2 |
Niveles de acercamiento 11 a 14 |
| Nivel 3 |
Niveles de acercamiento 15 a 18 |
Un valor de nivel codificado igual a 3 en este caso aseguraría la aparición de un punto en todos los niveles de zoom, mientras que un nivel igual a 0, ignoraría los puntos por encima del nivel de 5. Los puntos finales de una polilínea se suelen establecer en el nivel de codificación más grande para garantizar que los puntos finales aparezcan en todos los niveles de zoom y que la línea se dibuje correctamente.
Para la optimización, el parámetro zoomFactor debe reflejar la ampliación aproximada entre los distintos grupos de niveles de zoom especificados en numLevels. Por ejemplo, si consideramos una duplicación por cada nivel de acercamiento y unos 4 niveles de acercamiento en cada grupo, el valor debe ser de 16.
Estos valores de niveles se codifican en Base-64 como números enteros no firmados. Ten en cuenta que, dado que los valores de niveles suelen ser pequeños, no deben superar un límite de 5 bits. Esto hace que las codificaciones de niveles sean muy sencillas: simplemente se añade 63 al valor. En cualquier caso, el proceso de codificación siguiente presupone la conversión a un valor binario y a la inversa, por lo que el código debe llevar a cabo esta conversión en caso de que los valores de los niveles cambien en una revisión del API.
Los pasos para codificar los valores no firmados se especifican a continuación:
- Utiliza el valor sin firmar inicial:
174
- Convierte el valor decimal en un valor binario:
10101110
- Divide el valor binario en fragmentos de 5 bits (comenzando desde la derecha):
101 01110
- Coloca los fragmentos de 5 bits en el orden inverso:
01110 101
- O bien, cada valor con 0x20 si le sigue otro fragmento de bit:
101110 00101
- Convierte cada valor a decimal:
46 5
- Añade 63 a cada valor:
109 68
- Convierte cada valor a su equivalente ASCII:
mD