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:
-
GLoadApi([
-
"http://mt0.google.com/mt?n=404&v=w2.29&",
-
"http://mt1.google.com/mt?n=404&v=w2.29&",
-
"http://mt2.google.com/mt?n=404&v=w2.29&",
-
"http://mt3.google.com/mt?n=404&v=w2.29&"
-
], [
-
"http://kh0.google.com/kh?n=404&v=11&",
-
"http://kh1.google.com/kh?n=404&v=11&",
-
"http://kh2.google.com/kh?n=404&v=11&",
-
"http://kh3.google.com/kh?n=404&v=11&"
-
], [
-
"http://mt0.google.com/mt?n=404&v=w2t.30&",
-
"http://mt1.google.com/mt?n=404&v=w2t.30&",
-
"http://mt2.google.com/mt?n=404&v=w2t.30&",
-
"http://mt3.google.com/mt?n=404&v=w2t.30&"
-
]);
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:
-
http://kh0.google.com/kh?n=404&v=11&t=t
Si queremos hacer zoom en el cuadrante superior derecho pues:
-
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:
-
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
Marc, eres un friki. Ole. Estoy deseando ver que más montas con esto.
Poca feina!
Usease: marc + vacaciones = vacilo mucho
Me
Joder Lesmes, i aquest moc? que no t’agraden els meus inventillos?
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”;
?>
Aqui tienes copia del PHP y PERL.
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.
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
Me pregunto si seras capaz de hacer algo mejor que el flashearth de neave:
http://www.flashearth.com/
just no :)
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…
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.
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.
DANILO, aquí te dejo un ejemplo:
http://www.econym.demon.co.uk/googlemaps/customtile.htm
saludos!
Deja un comentario