Hackear las imágenes de los mapas II

Lunes 8 de diciembre de 2008, por Horacio González Diéguez

Buenas noticias para los Google hackeadores!!! Google ha modificado recientemente la URL de las imágenes de la capa Satélite. Ahora, en lugar de la tradicional URL codificada mediante las letras q, r, s, t, se puede acceder a dichas imágenes a través de una dirección similar a la de las capas Mapa y Relieve.

Es una pena porque acababa de actualizar el mapa coordenadas-pixels-2 para que devolviera la URL de las imagenes de la capa Relieve y Satélite y no solo de la capa Normal. Basándome en el tutorial que cité en el artículo anterior, en el que describo como funciona la codificación q, r, s, t y explico como obtener las coordenadas x e y de una imagen, he diseñado un pequeño script que calcula la URL codificada de la capa Satélite partiendo de dichos valores y del nivel de zoom.

La estrategia es sencilla. Primero hay que transformar los valores X e Y a un numero binario de un dígito mas que el nivel de zoom. A continuación substituir el primer dígito del valor binario de Y por 1 (todavía no tengo ni idea de cual es la razón, pero funciona). Y por último calcular la correspondencia con una letra de las distintas combinaciones de cada uno de los dígitos X e Y.

/* ****************************************************************** */

/* <!-- Script by hscripts.com --> */
function deciToBin(arg) {
        res1 = 999;
        args = arg;
        while(args>1) {
                arg1 = parseInt(args/2);
                arg2 = args%2;
                args = arg1;
                if(res1 == 999) {
                        res1 = arg2.toString();
                } else {
                        res1 = arg2.toString()+res1.toString();
                }
        }
        if(args == 1 && res1 != 999) {
                res1 = args.toString()+res1.toString();
        } else if(args == 0 && res1 == 999) {
                res1 = 0;
        } else if(res1 == 999) {
                res1 = 1;
        }
        var ll = res1.length;
        while(ll%4 != 0) {
                res1 = "0"+res1;
                l = res1.length;
        }       
        return res1;
}
/* <!-- www.hscripts.com/scripts/JavaScript/decimal-binary-convertor.php --> */

// script para buscar la antigua drección de la capa satélite codificada
// calculamos os valores binarios de x e y
var binx = deciToBin(imgx);
var biny = deciToBin(imgy);
             
// calculamos el número de dígitos que habra que añadir en función del nivel de zoom
var digitsx = (zoom +1) - binx.length;
var digitsy = (zoom +1) - biny.length;
for (i=0; i<digitsx; i++) {
        binx = '0' + binx;
}
for (i=0; i<digitsy; i++) {
        biny = '0' + biny;
}
          
// el primer dígito de v siempre es 1
biny = '1' + biny.substring(1);
          
// codificamos los valores a través de las letras q r t s
var coded = "";
for (i=0; i<binx.length; i++) {
        switch(binx.charAt(i)) {
                case '0':
                        switch(biny.charAt(i)) {
                                case '0':
                                        coded += 'q';
                                        break;
                                case '1':
                                        coded += 't';
                                        break;
                        }
                        break;
                case '1':
                        switch(biny.charAt(i)) {
                                case '0':
                                        coded += 'r';
                                        break;
                                case '1':
                                        coded += 's';
                                        break;
                        }
                        break;
        }
}

/* ****************************************************************** */

Ahora todas las URL funcionan, aunque todavía no he probado con la capa Híbrido. Sin embargo tanto en la capa Relieve como en la capa Satélite, la versión de la API suele cambiar con frecuencia, así que de vez en cuando es necesario comprobar estos valores.

  • G_PHYSICAL_MAP => ’v=app.87’
  • G_SATELLITE_MAP => ’v=33’

En este momento estoy tratando de averiguar si a través de la función GMapType.getTileLayers(); y la función GTileLayer.getTileUrl(tile, zoom); se puede recoger la URL base de las imágenes, para evitar el problema del desfase del valor de la versión de la API.

2015 VHPLab. I 2014 I 2013 I
English I Galego