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.
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!
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
| Zoom | Tiles pro Achse | Tiles 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!
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.
| Zoom | Pixel pro Achse | Pixel 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:
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
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; }
Es gibt grundsätzlich 4 Typen von Tiles:
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: