« # »

Estudiando GoogleMaps

NOTA: no se si me darán un toque los señores corbatas de google, pero que conste que toda la información que hay aquí, ha sido extraida manualmente de su página web de acceso público maps.google.com. Toma castaña!

Me voy a hacer un poster grande grande, pero grande de jocones. Para ello me voy a servir de googleMaps. Se que podría estudiar la API de google maps para poder utilizarlo de una forma sencilla, pero si lo hago así no tendrá ninguna gracia (al menos para mi) y es por ello que me he puesto a estudiar como funciona la web de google maps (y sus javascripts) y cómo estructuran la carga de las imagenes, para poder extraer las imágenes sin el dichoso límite de las 50.000 imagenes diarias (una chorrada por mi parte pensar así, pero como he dicho antes, así es más emocionante). Al final he sufrido una revelación al ver que todo es una matriz de 2x2 de forma que cada imagen tiene sus correspondientes 2x2 y así sucesivamente.

Explico un poco como se lo han currado.

Para servir las imágenes disponen de un listado de servidores, de los que se extraen las imagenes que conforman los mapas:

JavaScript:
  1. GLoadApi([
  2. "http://mt0.google.com/mt?n=404&v=w2.29&",
  3. "http://mt1.google.com/mt?n=404&v=w2.29&",
  4. "http://mt2.google.com/mt?n=404&v=w2.29&",
  5. "http://mt3.google.com/mt?n=404&v=w2.29&"
  6. ], [
  7. "http://kh0.google.com/kh?n=404&v=11&",
  8. "http://kh1.google.com/kh?n=404&v=11&",
  9. "http://kh2.google.com/kh?n=404&v=11&",
  10. "http://kh3.google.com/kh?n=404&v=11&"
  11. ], [
  12. "http://mt0.google.com/mt?n=404&v=w2t.30&",
  13. "http://mt1.google.com/mt?n=404&v=w2t.30&",
  14. "http://mt2.google.com/mt?n=404&v=w2t.30&",
  15. "http://mt3.google.com/mt?n=404&v=w2t.30&"
  16. ]);

Para mi objectivo, que es sacar las imagenes reales (de satelite) me he centrado en los servidores kh*, estos tienen un parametro llamado t el cual aceptan un curioso algoritmo, os explico:

Tal como os he comentado antes, todo se conforma de 2x2 imagenes (por cada imagen 4 sub imagenes que hacen el zoom). Todas ellas de 256pixeles de ancho por 256pixeles de alto, según vamos internando dentro de las sub imagenes, obtenemos tamaños mayores en total (en un principio una hace 256x256, pero esta con el zoom llega a 2048x2048 en subimagenes de 256x256, espero que se entienda). Para demostrar esto he hecho un pequeño experimento que aclarará toda duda posible:

Experimento 1 (teneis que clicar en las fotos para que dicho cuadrante se amplie * 2)

El algoritmo que se pasa al argumento "t" es el "cuadrante":

- Superior izquierdo (Q)
- Superior derecho (R)
- Inferior izquierdo (T)
- Inferior derecho (S)

De forma que si queremos ver el mapa entero, tendremos que cargar SOLO t=t:

HTML:
  1. http://kh0.google.com/kh?n=404&v=11&t=t

Si queremos hacer zoom en el cuadrante superior derecho pues:

HTML:
  1. http://kh0.google.com/kh?n=404&v=11&t=tr

Y si en el resultado queremos hacer zoom en el cuadrante inferior derecho, pues sencillo:

HTML:
  1. http://kh0.google.com/kh?n=404&v=11&t=trs

Así que a cada paso de zoom, tenemos una letra más en el argumento.

De momento eso es todo, cuando saque el mapa explicaré el método usado (seguramente una función recursiva)

Comentarios

  1. manolo | Noviembre 21st, 2006 | 7:26 pm

    Marc, eres un friki. Ole. Estoy deseando ver que más montas con esto.

  2. Lesmes | Noviembre 21st, 2006 | 7:42 pm

    Poca feina!

    Usease: marc + vacaciones = vacilo mucho

    Me

  3. marc | Noviembre 21st, 2006 | 7:54 pm

    Joder Lesmes, i aquest moc? que no t’agraden els meus inventillos?

  4. pagano | Noviembre 21st, 2006 | 9:10 pm

    15) {$z = 16; $minlon =1; $minlat = 1;}
    $zoomplus=$z-1; $zoomminus=$z+1;
    if ($minlat==”") { $minlat = 41;}
    if ($minlon==”") { $minlon = -4;}
    if ($pda>100) {$pda=100;}if ($pdaGmaps NoScript’;

    # Botoncitos de menu
    $spda=13+round(20*$resize);
    $z1=$pda+10;$z2=$pda-10;

    if ($frames==1) {$cframes=0;} else {$cframes=1;}
    if ($frames==1) {echo ”.”\n”;}

    echo ”.”\n”;
    ######################### Image Menu format:
    # r+# le# up# ra# z+# Fr# resize+/- Zoom +/-
    ######################### Up/down
    # r-# # dw# # z-# Left / right
    ##### ##### ##### Switch Frames/NoFrames

    echo ”.”\n”;
    echo ”.”\n”;
    echo ”.”\n”;
    list($tmplat, $tmplon) = pixel2coord(($pixelx+127),($pixely), $z);$tmplat = round($tmplat,6);$tmplon = round($tmplon,6);
    echo ”.”\n”;
    list($tmplat, $tmplon) = pixel2coord(($pixelx-127),($pixely), $z);$tmplat = round($tmplat,6);$tmplon = round($tmplon,6);
    echo ”.”\n”;
    list($tmplat, $tmplon) = pixel2coord(($pixelx),($pixely+127), $z);$tmplat = round($tmplat,6);$tmplon = round($tmplon,6);
    echo ”.”\n”;
    list($tmplat, $tmplon) = pixel2coord(($pixelx),($pixely-127), $z);$tmplat = round($tmplat,6);$tmplon = round($tmplon,6);
    echo ”.”\n”;
    echo ”.”\n”;
    echo ”.”\n”;
    echo ”.”\n”;
    echo ”.”\n”;
    echo ”.”\n”;

    if ($frames==1) {
    echo “”;

    # Desplazamiento de la ventana para centrar coordenadas
    $dx=(round(-($pixelx-$tlpx)+255)*$resize)+$spda;
    $dy=round(-($pixely-$tlpy)+255)*$resize;
    if ($z>15) {$dx = 1; $dy =1; $tlty++ ;} # Con zoom maximo no hace falta
    echo ”.”\n”;
    echo ”.”\n”;
    } # End noframes

    # Para poder ver en mininavegador usamos una tabla
    echo “\n”;
    $server=0; #Hay 4 servidores de los que cargar los tiles.

    for ($y = $tlty; $y \n”;
    for ($x = $tltx; $x ‘.”\n”;
    }

    # Creando mapa en las imagenes
    { echo ”.”\n”;
    # Centro del sector superior izquierdo del tile
    list($tmplat, $tmplon) = pixel2coord(round(($tlpxx+$ccpxx)/2),round(($tlpyy+$ccpyy)/2), $z);
    $tmplat = round($tmplat,6);$tmplon = round($tmplon,6);
    echo ”.”\n”;
    # Centro del sector superior derecho del tile
    list($tmplat, $tmplon) = pixel2coord(round(($ccpxx+$brpxx)/2),round(($tlpyy+$ccpyy)/2), $z);
    $tmplat = round($tmplat,6);$tmplon = round($tmplon,6);
    echo ”.”\n”;
    # Centro del sector inferior izquierdo del tile
    list($tmplat, $tmplon) = pixel2coord(round(($tlpxx+$ccpxx)/2),round(($ccpyy+$brpyy)/2), $z);
    $tmplat = round($tmplat,6);$tmplon = round($tmplon,6);
    echo ”.”\n”;
    # Centro del sector inferior derecho del tile
    list($tmplat, $tmplon) = pixel2coord(round(($ccpxx+$brpxx)/2),round(($ccpyy+$brpyy)/2), $z);
    $tmplat = round($tmplat,6);$tmplon = round($tmplon,6);
    echo ”.”\n”;
    echo “\n”; }
    $spda=round(256*$resize);
    echo “”;
    echo ”;
    echo “\n”;
    }

    echo “\n”;
    }
    echo “\n”;

    # Entra flotante y redondea positivos y negativos hacia cero
    function myint($f) {
    if ($f 0.9999) { $e=0.9999; }
    if ($e0.9999) { $e=0.9999; }
    if ($e”;
    ?>

  5. pagano | Noviembre 21st, 2006 | 9:18 pm

    Aqui tienes copia del PHP y PERL.

  6. Aml | Noviembre 21st, 2006 | 11:58 pm

    Q loco estás, man… buenos proyectos tenés entre manos… a ver que resulta de todo esto.
    Por lo pronto veo como funciona tu teoria, pero en firefox 2 salen mal maquetadas las img.

  7. Lesmes | Noviembre 22nd, 2006 | 1:27 am

    M’agraden els teus inventillos marc!

    Suposo ke es l’enveja, ke io no tink temps lliure, akista la rabieta :)

    Yo también estoy con Gmaps, pero con la API, ya te pasaré el link cuando finalize el proyecto.

    No es nada dificil pero requiere su tiempo.

    Saludos!

    PD: happy birthday my friend

  8. mr.doob | Noviembre 22nd, 2006 | 11:20 pm

    Me pregunto si seras capaz de hacer algo mejor que el flashearth de neave:
    http://www.flashearth.com/

  9. marc | Noviembre 22nd, 2006 | 11:31 pm

    just no :)

  10. Swayer | Diciembre 1st, 2006 | 1:34 am

    realmente impresionado por la generosidad de este blog. Estoy dando mis primeros pasos en programacion y agradezco a la gente como vos que pone a disposicion, para gente como yo, buena parte de sus conocimientos.

    Muchas gracias…

  11. marc | Diciembre 1st, 2006 | 2:40 am

    SWAYER, yo aprendí gracias a la gente que al igual que hago yo ahora, invirtió sus horas de ocio en montar tutoriales y ayudas para que la gente aprendiese.
    Ahora me gusta poder devolver con la misma moneda a los que hacen que Internet sea la fuente de información que es.
    La verdad es que incluso para aprender, es muy sano escribir los aprendido para repasar y que otros corrijan tus errores respondiendo a lo que tu has escrito.

  12. Danilo Lineros | Mayo 29th, 2007 | 2:24 am

    Excelente aporte, muy bueno lo tuyo. Y viendo los conocimientos que tienes queria preguntarte si crees que es posible usar la api pero con otras imagenes que no sean de googlemaps. te lo digo por un proyecto que estamos haciendo en Chile, ya que aca los mapas no estan muy definidos aun por googlemaps.
    Saludos.

  13. marc | Mayo 29th, 2007 | 12:08 pm

    DANILO, aquí te dejo un ejemplo:

    http://www.econym.demon.co.uk/googlemaps/customtile.htm

    saludos!

Deja un comentario

(*: Datos necesarios para dejar un comentario)

Get Adobe Flash playerPlugin by wpburn.com wordpress themes