Google Maps

Google Maps und Google Earth basieren auf fast identischem Kartenmaterial.
Bei Google Maps wird die Mercator Projektion verwendet um die Erde darzustellen:

Hinweis:Google Maps verwendet eine etwas verzerrte Mercator Projektion , da alles über dem 85. Breitengrad nicht mehr dargestellt wird um die Polargebiete nicht zu sehr vergrößert darzustellen. Bei Google Earth gibt es diese Problem nicht.

Allgemeines über Tiles

Wenn ein Benutzer auf Google Maps etwas ansehen will, macht es keinen Sinn rießige Bilder zu laden und nur einen Ausschnitt davon zu zeigen. Ebenso macht es keinen Sinn beim Herauszoomen große Bilder zu laden und diese verkleinert darzustellen. Deswegen wird Karte in sog. Tiles geteilt, die in jeder Zoomstufe vorhanden sind und eine fixe Größe haben. Die Anzahl der Tiles (bzw. die Fläche die auf einem Tile dargestellt wird) ist von der Zoomstufe abhängig!

 

Es gibt 20 verschiedene Zoomstufen, wobei in der kleinsten Zoomstufe die ganze Erde als ein Bild gespeichert, und in jeder weiteren Zoomstufe das Bild gevierteilt wird.


Die ganze Karte ist in Tiles eingeteilt die ALLE genau 256*256 px groß sind.
In der kleinsten Zoomstufe(0) ist also die Erde in einem 256*256px großen Quadrat abgespeichert, in der Zoomstufe 1 gibt es schon 4 Quadrate von denen jedes 256*256px groß ist. Insgesamt wären es also 512*512px bei Zoomstufe 1;
Jedes Tile hat 3 Koordinaten: x,y,z ; wobei x und y beschreiben wo sich das Tile befinden und z beschreibt die Zoomstufe. Die Darstellung erfolt so: X/Y/Z.


Hier sind die ersten 4 Zoomstufen aufgetragen:

Zu beachten ist, dass jedes schwarze Quadrat eine Auflösung von 256*256px haben sollte, was aber aus Platzgründen hier nicht möglich ist!

0/0/0
0/0/1 1/0/1
0/1/1 1/1/1
0/0/2 1/0/2 2/0/2 3/0/2
0/1/2 1/1/2 2/1/2 3/1/2
0/2/2 1/2/2 2/2/2 3/2/2
0/3/2 1/3/2 2/3/2 3/3/2
0/0/3 1/0/3 2/0/3 3/0/3 4/0/3 5/0/3 6/0/3 7/0/3
0/1/3 1/1/3 2/1/3 3/1/3 4/1/3 5/1/3 6/1/3 7/1/3
0/2/3 1/2/3 2/2/3 3/2/3 4/2/3 5/2/3 6/2/3 7/2/3
0/3/3 1/3/3 2/3/3 3/3/3 4/3/3 5/3/3 6/3/3 7/3/3
0/4/3 1/4/3 2/4/3 3/4/3 4/4/3 5/4/3 6/4/3 7/4/3
0/5/3 1/5/3 2/5/3 3/5/3 4/5/3 5/5/3 6/5/3 7/5/3
0/6/3 1/6/3 2/6/3 3/6/3 4/6/3 5/6/3 6/6/3 7/6/3
0/7/3 1/7/3 2/7/3 3/7/3 4/7/3 5/7/3 6/7/3 7/7/3
ZoomTiles pro AchseTiles insgesamt
0 1 1
1 2 4
2 4 16
3 8 64
4 16 256
5 32 1024
6 64 4096
7 128 16384
8 256 65536
9 512 262144
10 1024 1048576
11 2048 4194304
12 4096 16777216
13 8192 67108864
14 16384 268435456
15 32768 1073741824
16 65536 4294967296
17 131072 17179869184
18 262144 68719476736
19 524288 274877906944
Summe:
366503875925

Es sind nicht überall in jeder Zoomstufe alle Tiles vorhanden, realistisch wäre etwa die Hälfte dieser Zahl(183 Milliarden).

Ein Tile hat durchschnittlich 20kb, also benötigen 366 Milliarden Tiles insgesamt einen Speicherplatz von 3665 Terabyte.
Es gibt aber 4 verschiedene Kartentypen, es sind also ganze 14660 Terabyte(!) die alle Google Maps Bilder benötigen!


Mit einer Internetverbingung mit 3,6Mbit/s braucht man 1162 Jahre um all diese Bilder herunterzuladen!

Und wenn man alle Bilder auf 32GB micro-SD Karten speichert, benörigt man genau einen Kubikmeter Karten!

Koordinaten

Es ist möglich von einem Punkt mit Latitude (Breiengrad) und Longitude(Längengrad) bei einer Zoomstufe die Koordinaten des Tiles auszurechne, in dem der Punkt liegt. Der Punkt liegt dann aber irgendwo im Tile!

 

Damit man aber trotzdem jeden Punkt pixelgenau darstellen kann, werden die Tiles in ein neues Koordinatensystem unterteilt, wo jeder der 65 Tausend Pixel in jedem Tile beschrieben werden kann.

ZoomPixel pro AchsePixel insgesamt
0 256 65536
1 512 262144
2 1024 1048576
3 2048 4194304
4 4096 16777216
5 8192 67108864
6 16384 268435456
7 32768 1073741824
8 65536 4294967296
9 131072 17179869184
10 262144 68719476736
11 524288 274877906944
12 1048576 1099511627776
13 2097152 4398046511104
14 4194304 17592186044416
15 8388608 70368744177664
16 16777216 281 Tera-Pixel
17 33554432 1.13 Peta-Pixel
18 67108864 4.5 Peta-Pixel
19 134217728 18 Peta-Pixel
Summe:
24 Peta-Pixel

Jeder Punkt auf der Erde hat also genau gesehen 5 Parameter bei Google Maps:

  • Zoom 0-19
  • X (tile) abhängig von Zoomstufe, siehe erste Tabelle
  • Y(tile) abhängig von Zoomstufe, siehe erste Tabelle
  • x(pixel) 0-255
  • y(pixel) 0-255

Die Schreibwise sieht so aus: Z-X-Y-x-y

der Punkt mit den Geografischen Koordinaten S0°, E0° kann so dargestellt werden:

0-0-0-128-128
1-1-1-0-0
2-2-2-0-0
3-4-4-0-0
4-7-7-0-0
...
19-68719476735-68719476735-0-0

Rechnen mit Koordinaten und Tiles

struct point{
       double latitude;
       double longitude;
       unsigned char zoom;//Kann beliebig gewählt werden (0-19)
       int x_tile;//Abhängig vom Zoom
       int y_tile;//Abhängig vom Zoom
       unsigned char x_pixel;//Abhängig vom Zoom
       unsigned char y_pixel;//Abhängig vom Zoom
       
       double left;//Längengrad der linken Seite des Tiles
       double right;//Längengrad der rechten Seite des Tiles
       double top;//Breitengrad der oberen Seite des Tiles
       double bottom;//Breitengrad der unteren Seite des Tiles
};

 

Hier sind 2 Funktionen in C mit denen man Latitude und Longitude (Längengrad und Breitengrad) in die Mercator Projektion für Google Maps umrechnen kann bzw. von der Mercator Projektion wo x und y des tiles gegeben ist zurückrechnen.

 

point lat_long_to_mercator(double lat,double lng,int zoom){
      point out;
      out.zoom=zoom;
      out.longitude=lng;
      out.latitude=lat;
      if (lng > 180.0){lng -= 360.0;}
      int scale = 1 << zoom;
      out.x_tile=(int)(((180.0 + lng) / 360.0) * scale);
      out.y_tile=(int)((0.5 - log(tan((M_PI / 4.0) + ((M_PI * lat) / (2.0 * 180.0)))) / (2.0 * M_PI)) * scale);
      
      long long  scale2= 1 << (zoom+8);
      out.x_pixel=((long long)(((180.0 + lng) / 360.0) * scale2))%256;
      out.y_pixel=((long long)((0.5 - log(tan((M_PI / 4.0) + ((M_PI * lat) / (2.0 * 180.0)))) / (2.0 * M_PI)) * scale2))%256;
      
      double lngWidth = 360.0 / scale; //breite in grad
      double leftLong = -180.0 + (out.x_tile * lngWidth); //links
      out.left =leftLong;
      out.right = leftLong + lngWidth;
      double latHeightMerc = 1.0 / scale; //höhe in grad
      double topLatMerc = out.y_tile * latHeightMerc; //oben
      double bottomLatMerc = topLatMerc + latHeightMerc;
      out.bottom = (180.0 / M_PI) * ((2.0 * atan(exp(M_PI * (1.0 - (2.0 * bottomLatMerc))))) - (M_PI / 2.0));
      out.top =    (180.0 / M_PI) * ((2.0 * atan(exp(M_PI * (1.0 - (2.0 * topLatMerc))))) - (M_PI / 2.0));
      return out;
}

point mercator_to_lat_long(int zoom,long long x_tile,long long y_tile, /* OPTIMAL: */ int x_pixel=128,int y_pixel=128){
      point out;
      out.zoom=zoom;
      out.x_tile=x_tile;
      out.y_tile=y_tile;
      out.x_pixel=x_pixel;
      out.y_pixel=y_pixel;
      
      x_tile=x_tile*256+x_pixel;
      y_tile=y_tile*256+y_pixel;
      long long  scale= 1 << (zoom+8);
      double lngWidth = 360.0 / scale;
      double leftLong = -180.0 + (x_tile * lngWidth);
      out.left =leftLong;
      out.right = leftLong + lngWidth;
      double latHeightMerc = 1.0 / scale;
      double topLatMerc = y_tile * latHeightMerc;
      double bottomLatMerc = topLatMerc + latHeightMerc;
      out.bottom = (180.0 / M_PI) * ((2.0 * atan(exp(M_PI * (1.0 - (2.0 * bottomLatMerc))))) - (M_PI / 2.0));
      out.top =    (180.0 / M_PI) * ((2.0 * atan(exp(M_PI * (1.0 - (2.0 * topLatMerc))))) - (M_PI / 2.0));
      
      out.longitude=(out.left+out.right)/2;
      out.latitude=(out.top+out.bottom)/2;
      return out;
}


Direkter Download der Tiles

Es gibt grundsätzlich 4 Typen von Tiles:

  • Satellite
  • Map
  • Terrain
  • Transparent Map

Den Kartentyp Hybrid gibt es nicht wirklick, hier wird einfach die "Transparent Map" über das Satellitenbild gelegt. Die "Transparent Map" kann man auch nicht alleine bei Google Maps sehen

 

Es gibt für jeden Typ einen direkten Downloadlink:

  • Satellite: http://khm0.google.at/kh/v=80&x=[ TILE-X ]&y=[ TILE-Y ]&z=[ ZOOM ]
  • Map: http://mt0.google.com/vt/lyrs=m@146&hl=de&x=[ TILE-X ]&y=[ TILE-Y ]&z=[ ZOOM ]
  • Terrain: http://mt1.google.com/vt/lyrs=t@126,r@146&hl=de&x=[ TILE-X ]&y=[ TILE-Y ]&z=[ ZOOM ]
  • Transparent Map: http://mt0.google.com/vt/lyrs=h@146&hl=de&x=[ TILE-X ]&y=[ TILE-Y ]&z=[ ZOOM ]

Empfohlene Seiten: