gmdl

Wer die schönen Karten von google-maps für private Zwecke verwenden will steht vor dem Problem, dass die aus vielen Tausend kleinen Kacheln zusammengesetzt sind. Die kann man zwar herunterladen, oder mehrere Screenshots zusammen setzten, aber komfortabel ist das nicht. Um da Abhilfe zu schaffen habe ich ein Script geschrieben. Wenn du magst, kannst du hier auch schnell den Code überfliegen.
Man kann einen Bereich der Kacheln für die Karte herunter laden und zu einem Bild zusammensetzen lassen. Wer es einfacher möchte, kann sich bei Google die Stelle suchen, den Link kopieren und an das Script übergeben. Einstellen muss man nur noch, wie viele Kacheln das Bild breit und hoch werden soll. Die Satelliten Bilder möchte google nur ungern herausgeben und sperrt den Zugang nach einer größeren Anzahl Kacheln für eine gewisse Zeit. Einfach laufen lassen – sobald du wieder freigeschaltet bist geht’s weiter.
Wichtig: Denke daran, dass Google’s Bilder nur für die private Nutzung freigegeben und rechtlich geschützt sind!

Aktualisierung

Das Script wurde zuletzt am 29. August 2009 angepasst. Durch die ständigen Veränderungen seitens Google ist es möglich, dass es nun nicht mehr funktionstüchtig ist. Normalerweise lässt sich dies durch Anpassen der Kachel-URLs selbst in kurzer Zeit beheben.
Obwohl OpenStreetMap selbst eine Export-Funktion anbietet, erlaubt das Script nun auch das Spiegeln von Mapnik- und Osmarender-Tiles.

Voraussetzungen

Wahrscheinlich hast du alles schon, wenn du eine halbwegs aktuelle Linux-Distrubution installiert hast. Diese Programme werden benutzt:

  • bash (Interpretiert das Script)
  • cURL (Downloaden der Dateien)
  • bc (Berechnungen für die Projektion der Kacheln auf die Längen- und Breitengrade)
  • file (Kontrolle, ob wirklich ein Bild empfangen wurde)
  • ImageMagick (Zusammenfügen der Kacheln zu einem großem Bild)

Aufruf

Welche Parameter das Script versteht kann bekommt man zu Gesicht, wenn man es einfach mal versucht ohne auszuführen.

Kachel-Modus (tiles)

Hier werden schon ganz konkrete Angaben vom Benutzer erwartet. In welcher Zoomstufe (0 = ganz nah, 17 ganz fern) sollen welche Kacheln herunter geladen werden. Dieser Modus ist sicherlich etwas unhandlich, aber bei maschineller Nutzung ganz praktisch.

URL-Modus (url)

Wichtig ist hier, dass man als Adresse nicht das verwendet, der der Browser angezeigt. Rechts über der Karte gibt es einen Link “URL zu dieser Seite”. Diesen kopieren und in Apostrophe ‘gekleidet’ verwenden. Sonst versucht die Shell noch Wildcards aufzulösen und das Ganze geht in die Hose.
Achtung: wenn der Bereich den gedachten Schnitt beim +/-180. Längengrad überlagert funktioniert diese Methode nicht.

Beispiele

Um einen Bildausschnitt herunterzuladen, den man per Browser herausgesucht hat (in diesem Fall ein Stück von Island), kann der Aufruf so aussehen:

./gmdl.sh url satellite \
    --area 4x3 \
    --url 'http://maps.google.de/?ie=UTF8&ll=64.096507,-20.428391&spn=0.210875,0.683212&t=h&z=11&om=0'

Folgender Aufruf hat den gleichen Effekt, nur dass man hier die Zoomstufe und die Kacheln-Koordinaten selbst angeben muss (vielleicht auch will):

./gmdl.sh tiles satellite --zoom 11 --tiles 906,543,909,545

Wenn man nun statt der Satelliten Bilder die Karten herunterladen will, ändert man die “map”:

./gmdl.sh tiles map --zoom 11 --tiles 906,543,909,545

Um die ganze Welt in einer bestimmten Zoomstufe herunterladen will, kann man den “–tiles”-Parameter weglassen:

./gmdl.sh tiles satellite --zoom 4

Wenn wir nun annehmen, man hat einen recht großen “Auftrag” angestoßen und will den Rechner ausmachen oder man wurde von Google geblockt, so kann man das Script mit Ctrl-C abbrechen und zu einem späteren Zeitpunkt mit den gleichen Einstellungen und an exakt der Stelle fortfahren. (Annahme: das Ausgabe-Verzeichnis war “20081101152605″)

./gmdl.sh resume 0 --resume-dir 20081101152605

Hierbei ist die Null nur ein Platzhalter um die Parameterstelle zu füllen, es könnte auch alles andere dort stehen.

Ergebnisse

Man muss sich dabei im Klaren sein, dass alle Bildteile beim Zusammensetzen gleichzeitig in den Arbeitsspeicher geladen werden (müssen). Also entweder viiiel Speicher kaufen oder mit “kleinen” Bildern zufrieden sein. Eigentlich ist der ganze Größenwahn gar nicht nötig, denn irgendwer will das Ergebnis vielleicht auch noch mal ansehen ;-) Oder man lässt sich den Ausschnitt seiner Wahl als Poster drucken…

world_zoom12_vorschau.pngberlin_fernsehturm_vorschau.jpg

Developer Information

Some things I wrote down for my understanding during programming.

Longitude & latitude example (zoom 3)

    +-----+-----+-----+-----+-----+-----+-----+-----+
    |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |
    |  0  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |
    +-----+-----+-----+-----+-----+-----+-----+-----+
    |  0  |  1  |  2  |  x  |     |     |     |     |
    |  1  |  1  |  1  |  y  |     |     |     |     |
    +-----+-----+-----+-----+-----+-(42.5x90)-+-----+
    |  0  |  1  |  x  |     |     |     |     |     |
    |  2  |  2  |  y  |     |     |     |     |     |
    +-----+-----+-----+-----+-----+-----+-----+-----+
    |  0  |  x  |     |     |     |     |     |     |
    |  3  |  y  |     |     |     |     |     |     |
(-180x0)--+--(-90x0)--+---(0x0)---+--(0x90)---+--(0x180)
    |  0  |     |     |     |     |     |     |     |
    |  4  |     |     |     |     |     |     |     |
    +-----+-----+-----+-----+-----+-----+-----+-----+
    |  0  |     |     |     |     |     |     |     |
    |  5  |     |     |     |     |     |     |     |
    +-----+-----+-----+-----+-----+(-42.5x90)-+-----+
    |  0  |     |     |     |     |     |     |     |
    |  6  |     |     |     |     |     |     |     |
    +-----+-----+-----+-----+-----+-----+-----+-----+
    |  0  |     |     |     |     |     |     |     |
    |  7  |     |     |     |     |     |     |     |
    +-----+-----+-----+-----+-----+-(-85x90)--+-----+

s-Variable

(seems kinda surplus by now)

The length of "Galileo" ist determined by the zero based
tile coordinates:
- length = x / 3
- add tree if (x mod 3) = 1 or six if the expression returns 2
- add the y-coordinate
- length = length mod 8

    zoom 0        zoom 1                  zoom 2

    +-----+    +-----+-----+    +-----+-----+-----+-----+
    |     |    |     | Gal |    |     | Gal | Gali| G   |
    |     |    |     |     |    |     |     | le  |     |
    +-----+    +-----+-----+    +-----+-----+-----+-----+
               | G   | Gali|    | G   | Gali| Gali| Ga  |
               |     |     |    |     |     | leo |     |
               +-----+-----+    +-----+-----+-----+-----+
                                | Ga  | Gali|     | Gal |
                                |     | l   |     |     |
                                +-----+-----+-----+-----+
                                | Gal | Gali| G   | Gali|
                                |     | le  |     |     |
                                +-----+-----+-----+-----+

                          zoom 3

       0   (+3)  (+6)    1   (+3)  (+6)   2     ...
    +-----+-----+-----+-----+-----+-----+-----+-----+
    |     | Gal | Gali| G   | Gali| Gali| Ga  | Gali|
    |     |     | le  |     |     | leo |     | l   |
    +-----+-----+-----+-----+-----+-----+-----+-----+
    | G   | Gali| Gali| Ga  | Gali|     | Gal | Gali|
    |     |     | leo |     | l   |     |     | le  |
    +-----+-----+-----+-----+-----+-----+-----+-----+
    | Ga  | Gali|     | Gal | Gali| G   | Gali| Gali|
    |     | l   |     |     | le  |     |     | leo |
    +-----+-----+-----+-----+-----+-----+-----+-----+
    | Gal | Gali| G   | Gali| Gali| Ga  | Gali|     |
    |     | le  |     |     | leo |     | l   |     |
    +-----+-----+-----+-----+-----+-----+-----+-----+
    | Gali| Gali| Ga  | Gali|     | Gal | Gali| G   |
    |     | leo |     | l   |     |     | le  |     |
    +-----+-----+-----+-----+-----+-----+-----+-----+
    | Gali|     | Gal | Gali| G   | Gali| Gali| Ga  |
    | l   |     |     | le  |     |     | leo |     |
    +-----+-----+-----+-----+-----+-----+-----+-----+
    | Gali| G   | Gali| Gali| Ga  | Gali|     | Gal |
    | le  |     |     | leo |     | l   |     |     |
    +-----+-----+-----+-----+-----+-----+-----+-----+
    | Gali| Ga  | Gali|     | Gal | Gali| G   | Gali|
    | leo |     | l   |     |     | le  |     |     |
    +-----+-----+-----+-----+-----+-----+-----+-----+