Google Map Downloader

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
dg2015
User
Beiträge: 3
Registriert: Sonntag 20. September 2015, 16:15

Moin Moin Freunde

Die schlechte Nachricht vorab: Ich habe nie Python gelernt und es auch nicht vor, ich kann leider im Moment nicht Stundenweise ins Programmieren investieren :(

Die gute Nachricht: Ich bin fit in einigen anderen Dingen, PHP, Matlab, Java, ...

Deswegen stelle ich euch hier mal ne Frage von der ich hoffe, dass es eine fixe lösung gibt

Und zwar benutze ich das Script hier: https://gist.github.com/eskriett/6038468 , welches auch sehr gute Dienste leistet. Allerdings möchte ich Hybrid-Satellitenbilder haben

Denken wir uns die Koordinaten: x = 67, y = 42, z = 7

Dann benutzt das Script, wenn ich das richtig sehe, den Link:
https://mt0.google.com/vt?x=67&y=42&z=7

für Satellitenbilder allerdings brauche ich einen weiteren Parameter (lyrs=s,p)

https://mt0.google.com/vt?x=67&y=42&z=7&lyrs=s,p

also, dachte ich mir, ändere ich einfach Zeile 91 um in:

url = 'https://mt0.google.com/vt?lyrs=s,p&x='+ ... elf._zoom)

Das wiederum wirft mir aber den Fehler aus Zeile 111.
print("Could not generate the image - try adjusting the zoom level and checking your coordinates")
Kann mir da jemand helfen?
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

@dg2015: Du solltest das Exception-Handling mal entfernen, um den wirklichen Fehler zu bekommen. Wenn ich raten müßte, dann hast Du keine Schreibrechte in dem Verzeichnis, aus dem Du das Skript aufrufst.
dg2015
User
Beiträge: 3
Registriert: Sonntag 20. September 2015, 16:15

Okay, habe ich gemacht. Man, musste erstmal rausfinden wie wichtig einrücken ist. Also hier der relevante Code:

Code: Alles auswählen

#!/usr/bin/python
(...)
    def generateImage(self, **kwargs):
        """
            Generates an image by stitching a number of google map tiles together.
            
            Args:
                start_x:        The top-left x-tile coordinate
                start_y:        The top-left y-tile coordinate
                tile_width:     The number of tiles wide the image should be -
                                defaults to 5
                tile_height:    The number of tiles high the image should be -
                                defaults to 5
            Returns:
                A high-resolution Goole Map image.
        """

        start_x = kwargs.get('start_x', None)
        start_y = kwargs.get('start_y', None)
        tile_width = kwargs.get('tile_width', 5)
        tile_height = kwargs.get('tile_height', 5)

        # Check that we have x and y tile coordinates
        if start_x == None or start_y == None :
            start_x, start_y = self.getXY()

        # Determine the size of the image
        width, height = 256 * tile_width, 256 * tile_height

        #Create a new image of the size require
        map_img = Image.new('RGB', (width,height))

        for x in range(0, tile_width):
            for y in range(0, tile_height) :
                url = 'https://mt0.google.com/vt?lyrs=s&x='+str(start_x+x)+'&y='+str(start_y+y)+'&z='+str(self._zoom)

                current_tile = str(x)+'-'+str(y)
                urllib.urlretrieve(url, current_tile)
            
                im = Image.open(current_tile)
                map_img.paste(im, (x*256, y*256))
              
                os.remove(current_tile)

        return map_img

def main():
    # Create a new instance of GoogleMap Downloader 4,11 -> 127,88
    gmd = GoogleMapDownloader(81.5,-166, 7)

    print("The tile coorindates are {}".format(gmd.getXY()))

    img = gmd.generateImage()
    img.save("high_resolution_image.png")
    print("The map has successfully been created")


if __name__ == '__main__':  main()
Hier der Fehler:

Code: Alles auswählen

Traceback (most recent call last):
  File "GoogleMapDownloader.py", line 58, in <module>
    if __name__ == '__main__':  main()
  File "GoogleMapDownloader.py", line 53, in main
    img = gmd.generateImage()
  File "GoogleMapDownloader.py", line 41, in generateImage
    map_img.paste(im, (x*256, y*256))
  File "/Library/Python/2.7/site-packages/PIL/Image.py", line 1088, in paste
    im.load()
  File "/Library/Python/2.7/site-packages/PIL/ImageFile.py", line 189, in load
    d = Image._getdecoder(self.mode, d, a, self.decoderconfig)
  File "/Library/Python/2.7/site-packages/PIL/Image.py", line 385, in _getdecoder
    raise IOError("decoder %s not available" % decoder_name)
IOError: decoder jpeg not available
(Zeilennummern an obiges Beispiel angepasst)

Mir kommt das ganze echt ziemlich komisch vor. Vielleicht hat die Datei ja auf einmal ein anderes Format? Ohne die änderung funktioniert es wunderbar.

https://mt0.google.com/vt?x=67&y=42&z=7 und
https://mt0.google.com/vt?lyrs=s,p&x=67&y=42&z=7
geben ja aber doch nicht so unterschiedliche resultate aus
BlackJack

@dg2015: Nicht nur vielleicht: Die erste URL liefert Bilder im PNG-Format, die zweite im JPG-Format. Und da scheint eine Abhängigkeit zu fehlen um die lesen zu können. `libjpeg` wahrscheinlich.
dg2015
User
Beiträge: 3
Registriert: Sonntag 20. September 2015, 16:15

libjpeg habe ich jetzt mal installiert.

Code: Alles auswählen

Traceback (most recent call last):
  File "GoogleMapDownloader.py", line 58, in <module>
    if __name__ == '__main__':  main()
  File "GoogleMapDownloader.py", line 53, in main
    img = gmd.generateImage()
  File "GoogleMapDownloader.py", line 40, in generateImage
    im = Image.open(current_tile)
  File "/Library/Python/2.7/site-packages/PIL/Image.py", line 1980, in open
    raise IOError("cannot identify image file")
IOError: cannot identify image file
ich habe mir dann das folgende ausgeben lassen:

Code: Alles auswählen

print(urllib.urlopen(url).read())
ersterer Link gibt mir:

Code: Alles auswählen

?PNG

IHDk?XT	pHYs??PLTE????Cf@UIDATx????? ?O?H?47N?UIEND?B`?
der zweite:

Code: Alles auswählen

????JFIF???
		
(...) Viele Zeilenumbrüche

?"??3!"12ABRQabr?#q????CS????%"2!1ABRrb??(...)
jetzt habe ich rausgefunden, dass hier verschiedene dateitypen vorliegen. aber wie geht es weiter?
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Welches OS hast du? Welche Python Version willst du benutzen?

Ich habe einfach mal das Script mit deiner neuen Zeile 91, und dem Testausschnitt "gmd = GoogleMapDownloader(51.5171, 0.1062, 13)" ausprobiert, und es funktioniert.
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

@dg2015: einfach nur libjpeg zu installieren reicht nicht. Man muß pillow auch mit JPEG-Unterstützung neu übersetzen.
Antworten