Click here to Skip to main content
Email Password   helpLost your password?

Introduction

This is my analysis about how Google map works, and specially how the tiles are encoded. Google map uses pre-rendered tiles that can be obtained with a simple URL. This article explains how to build the URL for a tile from its geo coordinates (latitude/longitude).

Map Tile Encoding

Google map uses two different algorithms to encode the location of the tiles.

For Google map, the URL of a tile looks like http://mt1.google.com/mt?n=404&v=w2.12&x=130&y=93&zoom=9 using x and y for the tile coordinates, and a zoom factor. The zoom factor goes from 17 (fully zoomed out) to 0 (maximum definition). At a factor 17, the whole earth is in one tile where x=0 and y=0. At a factor 16, the earth is divided in 2x2 parts, where 0<=x<=1 and 0<=y<=1, and at each zoom step, each tile is divided into 4 parts. So at a zoom factor Z, the number of horizontal and vertical tiles is 2^(17-z)

Algorithm to Find a Tile from a Latitude, a Longitude and a Zoom Factor

//correct the latitude to go from 0 (north) to 180 (south),
// instead of 90(north) to -90(south)
latitude=90-latitude;

//correct the longitude to go from 0 to 360
longitude=180+longitude;

//find tile size from zoom level
double latTileSize=180/(pow(2,(17-zoom)));
double longTileSize=360/(pow(2,(17-zoom)));

//find the tile coordinates
int tilex=(int)(longitude/longTileSize);
int tiley=(int)(latitude/latTileSize);

In fact this algorithm is theoretical as the covered zone doesn't match the whole globe.

Servers

Google uses four servers to balance the load. These are mt0, mt1, mt2 and mt3.

Tile Size

Each tile is a 256x256 PNG picture.

For Satellite Images, the Encoding is a Bit Different

The URL looks like http://kh0.google.com/kh?n=404&v=8&t=trtqtt where the 't' parameters encode the image location. The length of the parameter indicates a zoom level.

To see the whole globe, just use 't=t'. This gives a single tile representing the earth. For the next zoom level, this tile is divided into 4 quadrants, called, clockwise from top left : 'q' 'r' 's' and 't'. To see a quadrant, just append the letter of that quadrant to the image you are viewing. For example :'t=tq' will give the upper left quadrant of the 't' image. And so on at each zoom level...

Algorithm to Find a Tile from a Latitude, a Longitude and a Zoom Factor

//initialise the variables;
double xmin=-180;
double xmax=180;
double ymin=-90;
double ymax=90;

double xmid=0;
double ymid=0;

string location="t";

//Google uses a latitude divided by 2;
double halflat = latitude / 2;

for (int i = 0; i < zoom; i++)
    {
        xmoy = (xmax + xmin) / 2;
        ymoy = (ymax + ymin) / 2;
        if (halflat > ymoy) //upper part (q or r)
            {
            ymin = ymoy;
            if (longitude < xmoy)
            { /*q*/
                location+= "q";
                xmax = xmoy;
            }
            else
            {/*r*/
                location+= "r";
                xmin = xmoy;
            }
        }
        else //lower part (t or s)
        {
            ymax = ymoy;
            if (longitude < xmoy)
            { /*t*/

                location+= "t";
                xmax = xmoy;
            }
            else
            {/*s*/
                location+= "s";
                xmin = xmoy;
            }
        }
    }
//here, the location should contain the string corresponding to the tile...

Again, this algorithm is quite theoretical, as the covered zone doesn't match the full globe.

Servers

Google uses four servers to balance the load. These are kh0, kh1, kh2 and kh3.

Tile Size

Each tile is a 256x256 JPG picture.

Mercator Projection

Due to the Mercator projection, the above algorithm has to be modified. In Mercator projection, the spacing between two parallels is not constant. So the angle described by a tile depends on its vertical position.

Here comes a piece of code to compute a tile's vertical number from its latitude.

/**<summary>Get the vertical tile number from a latitude
using Mercator projection formula</summary>*/
        private int getMercatorLatitude(double lati)
        {
            double maxlat = Math.PI;

            double lat = lati;

            if (lat > 90) lat = lat - 180;
            if (lat < -90) lat = lat + 180;

            // conversion degre=>radians
            double phi = Math.PI * lat / 180;

            double res;
            //double temp = Math.Tan(Math.PI / 4 - phi / 2);
            //res = Math.Log(temp);
            res = 0.5 * Math.Log((1 + Math.Sin(phi)) / (1 - Math.Sin(phi)));
            double maxTileY = Math.Pow(2, zoom);
            int result = (int)(((1 - res / maxlat) / 2) * (maxTileY));

            return (result);
        }

Covered Zone

Theoretically, latitude should go from -90 to 90, but in fact due to the Mercator projection which sends the poles to the infinites, the covered zone is a bit less than -90 to 90. In fact the maximum latitude is the one that gives PI (3.1415926) on the Mercator projection, using the formula Y = 1/2((1+sin(lat))/(1-sin(lat))) (see the link in the Mercator paragraph).

Protection

Google map uses a protection mechanism to keep a good quality of service. If one makes too many requests, Google map will add its IP address to a blacklist, and send a nice message:

Google Error

We're sorry... ... but your query looks similar to automated requests from a computer virus or spyware application. To protect our users, we can't process your request right now. We'll restore your access as quickly as possible, so try again soon. In the meantime, if you suspect that your computer or network has been infected, you might want to run a virus checker or spyware remover to make sure that your systems are free of viruses and other spurious software. We apologize for the inconvenience, and hope we'll see you again on Google.

To avoid being blacklisted, developers should use a caching mechanism if possible...

Sat Examples

See the whole globe at http://kh0.google.com/kh?n=404&v=8&t=t.

And the four corresponding quadrants: (note the 4 servers name to balance the load)

Map Examples

See the whole globe at http://mt1.google.com/mt?n=404&v=&x=0&y=0&zoom=17.

And the four corresponding quadrants:

Nice, isn't it?

For a sample code written in C#, see the download at the top of this article.

History

You must Sign In to use this message board.
 
 
Per page   
 FirstPrevNext
GeneralGoogle's server on error
borowiak
22:53 27 Sep '09  
Hello,
Since this weekend, the servers mt google returns errors. Cry
Is this normal?
Thanks

Mike
GeneralPlease
mbaocha
23:06 3 May '09  
Please Have anyone successfully implemented these?


____________________________________________________________________________________

Digital Map Nigeria | Street Level Map of Lagos Abuja Nigeria
GeneralRe: Please
radioman.lt
12:57 19 Jun '09  
use http://www.codeplex.com/gmap4dotnet D'Oh!

peace & serenity

Generalkh0 at v34
eyad al akhras
2:41 27 Feb '09  
kh0 is currently running at v34
GeneralRe: kh0 at v34
vincegavin
6:08 1 Mar '09  
how can I know v34?
GeneralRe: kh0 at v34
eyad al akhras
20:41 1 Mar '09  
it's the v=35 section:

http://kh0.google.com/kh?n=404&v=34&t=tq

from v34 to v38, all are currently working.
GeneralRe: kh0 at v34
vincegavin
1:19 22 Mar '09  
Thank you for answering my question.

I want to know whether there are some methods that can help me to know the value of parameter "v" or not. Can you telp me the method ? please. Also can you tell me the meaning of the parameter "n"? and How I can find the value of the parameter "n"?

Thank you !
GeneralRe: kh0 at v34
eyad al akhras
2:36 22 Mar '09  
i knew the working version (v) by trail and error vince Smile

personaly, i couldn't comprehend the full symantics... perhaps Pascal did.
GeneralRe: kh0 at v34
vincegavin
3:44 22 Mar '09  
Thank you all the same!
Generalwhat 's Current Satellitemap-servers name?
dip2k
19:33 1 Feb '09  
good day~ to you, nice guy!
Upper code does not works.
Maybe the Satellitemap Server was changed.
What's the current server name and the version ?
GeneralRe: what 's Current Satellitemap-servers name?
eyad al akhras
2:38 22 Mar '09  
http://kh0.google.com/kh?n=404&v=35&t=t[^]
General.net2 control
radioman.lt
10:06 6 Dec '08  
..i figure out tile logic and made control, coordinates are identical to google maps ;}

http://www.codeplex.com/gmap4dotnet[^]

Shucks

peace & serenity

General[Message Removed]
Katekortez
10:29 25 Oct '08  
Spam message removed
Generalseffv
senthilmuruganbtech
3:12 13 Aug '08  
xcvxcvxc
GeneralSatellitemap-servers down?
segu@gmx.net
20:21 27 Jul '08  
Why do the kh1 to kh4 servers not function anymore? It seems they are offline since some days...
GeneralRe: Satellitemap-servers down?
CoderCZ
23:36 12 Aug '08  
Use khm0 to khm3 (current version v=30).
GeneralRe: Satellitemap-servers down?
segu@gmx.net
5:44 13 Aug '08  
Thanks.
How do you find out those informations?
GeneralRe: Satellitemap-servers down?
CoderCZ
22:53 13 Aug '08  
Install add-on HttpFox to your Mozilla Firefox.
GeneralRe: Satellitemap-servers down?
segu@gmx.net
23:13 13 Aug '08  
To be able to use this plugin you have to know the servernames first Wink
I meant how you got the new servernames.

What is about your thread "Server numbering and secure word (Galileo)"? For what reason is this needed?
Generallatitude problem
hiuyil
8:43 11 Jul '08  
For the normal encoding algorithm,
I find that there are something wrong about the calculation between latitude and y tile...
Take Banff as an example,
the latitude is 51.1748
longitude is -115.572
The result of x should be 2931 and y should be 5472
Based on your algorithm, the x is 2932, but y is 3533..
Can you answer this problem ?...thank you so much !!!!! Smile Smile
GeneralRe: latitude problem
Romain Vallet
3:03 27 Aug '08  
See the summary article by James Lin below. The correct calculation is in its getTileXY method.
http://guanfenglin.spaces.live.com/blog/cns!4E0822BF6C959B7F!286.entry[^]
GeneralServer numbering and secure word (Galileo) [modified]
CoderCZ
4:03 24 Jun '08  
int servernum = (x + 2 * y) % 4;

string sec1 = ""; // after &x=...
string sec2 = ""&s="; // after &zoom=...
string secword = "Galileo";
int seclen = ( 3 * x + y ) % 8; // corrected from int seclen = ( x + 3 * y ) % 8;
sec2 += secword.Substring( 0, seclen );
if ( y >= 10000 && y < 100000 )
{
sec1 = "&s=";
}

modified on Thursday, August 28, 2008 6:52 AM

GeneralRe: Server numbering and secure word (Galileo)
JasonDiplomat
14:18 27 Aug '08  
seclen is wrong. Should be...

int seclen = ( (x * 3) + y ) % 8;
GeneralRe: Server numbering and secure word (Galileo)
CoderCZ
1:42 28 Aug '08  
It's true. Thanks.
GeneralRe: Server numbering and secure word (Galileo)
segu@gmx.net
19:42 27 Aug '08  
What is this function for?


Last Updated 7 Jan 2008 | Advertise | Privacy | Terms of Use | Copyright © CodeProject, 1999-2010