Capture intégré carte google image avec Python sans l'aide d'un navigateur
J'ai remarqué que, à partir de Google Maps page, vous pouvez obtenir un "embed" lien à mettre dans un iframe et charger la carte dans un navigateur. (pas de news ici)
La taille de l'image peut être ajustée en très grande, donc je suis intéressé à obtenir som de grandes images .Le format png.
Plus précisément, je voudrais définir une zone rectangulaire à partir d'une boîte englobante (en haut à droite et en bas à gauche de coordonnées), et d'obtenir l'image correspondante, avec un facteur de zoom.
Mais ma question est: Comment puis-je utiliser Python pour obtenir le "pixel contenu" de cette carte comme une image de l'objet?
(Mon raisonnement est le suivant: si le navigateur peut obtenir et rendre le contenu de l'image, puis Python devrait être capable de le faire, trop).
EDIT: c'est le contenu du fichier HTML qui montre mon exemple de carte:
<iframe
width="2000"
height="1500"
frameborder="0"
scrolling="yes"
marginheight="0"
marginwidth="0"
src="http://maps.google.com.br/maps?hl=pt-BR&ll=-30.027489,-51.229248&spn=1.783415,2.745209&z=10&output=embed"/>
EDIT: j'ai fait comme l'a suggéré Ned Batchelder, et de lire le contenu d'un urllib.urlopen()
appel à l'aide de la src
adresse de l'iframe ci-dessus. Le résultat a été beaucoup de code javascript, ce qui je pense est de le faire avec les Cartes Google maps JavaScript API. Donc, la question reste: comment ai-je pu faire quelques trucs utiles, à partir de tous ces trucs en Python afin d'obtenir l'image de la carte?
EDIT: ce lien semble contenir quelques jolies de l'information pertinente sur la manière de Google Maps tuiles leurs cartes:
http://www.codeproject.com/KB/scrapbook/googlemap.aspx
aussi:
http://econym.org.uk/gmap/howitworks.htm
OriginalL'auteur heltonbiker | 2011-09-20
Vous devez vous connecter pour publier un commentaire.
Je remercie pour toutes les réponses. J'ai fini par résoudre le problème d'une autre manière, à l'aide de Google Maps Statique de l'API et de certaines formules pour convertir à partir de l'espace de Coordonnées de l'espace de Pixel, afin que je puisse obtenir des images précises que "couture" bien ensemble.
Pour les personnes intéressées, voici le code. Si ça aide quelqu'un, s'il vous plaît commentaire!
=============================
Mise à jour pour Python 3: stackoverflow.com/a/47776466/5859283
Wow, ces mathématiques sont hideux!! Voir ma réponse: stackoverflow.com/a/50536888/1840698
BUG: il faut faire "maxsize -= en bas" avant de l'utiliser, sinon, "alturaplus" va dépasser la limite de 640 pixels et l'API de recadrer l'image. Plus précisément, pour y remédier il suffit de supprimer la ligne "en bas = 120" et insérez les lignes "bas = 120" et "maxsize -= en bas" en dessous de la ligne "maxsize = 640". Aussi peut-veux renommer "largura" et "altura" à la "largeur" et "hauteur", respectivement.
OriginalL'auteur heltonbiker
Plutôt que d'essayer d'utiliser le lien encastré, vous devriez aller directement à l'API de Google pour obtenir des images comme statique graphique. Voici le lien vers le Google Maps image statique de l'API - on dirait que vous pouvez juste passer en long/lat paramètres dans l'URL comme vous le faites pour la normale intégrable. Par exemple:
vous donne un 600x600 au niveau de la rue aperçu centrée sur les coordonnées que vous donnez ci-dessus, qui semble être de Porto Alegre, au Brésil. Maintenant, vous pouvez utiliser
urlopen
etPIL
que Nie suggère:OriginalL'auteur Daniel Roseman
C'est Daniel Roseman, la réponse de pour les personnes qui utilisent python 3.x:
Python 3.x code:
OriginalL'auteur Tanasis
Basé sur l'excellente réponse de heltonbiker avec des changements de BenElgar, voici un code mis à jour pour Python 3 et l'ajout de la clé de l'API d'accès, l'espérance de son utilité pour quelqu'un:
OriginalL'auteur 4Oh4
Plus concis Python 2.x compatible avec la méthode
OriginalL'auteur user423805
@4Oh4 la réponse est juste, mais les maths sont plus compliquées qu'elles ne devraient l'être. Les Conversions entre les degrés et les radians passe plus souvent qu'ils en ont besoin. Du rayon de la Terre est appelé pour aucune raison du tout—il annule dans tous les calculs. Un décalage est ajouté au pixel de coordonnées pour aucune raison du tout. Le logo de coupure est plus grand qu'il ne devrait l'être. Et quelques autres bricoles qui ont été écrits dans les changements. Voici ma version:
OriginalL'auteur enigmaticPhysicist
Le plus simple pour avoir le Google carte statique de l'image capturée/enregistré (au format png):
OriginalL'auteur Nabeel Ahmed
urllib.urlopen
va ouvrir une URL, le résultat aura un.read()
méthode que vous pouvez utiliser pour obtenir l'image en octets.cStringIO
a un fichier comme objet basé sur une chaîne de caractères en mémoire. PIL a unImage.open
fonction qui ouvre un fichier de vous donner une image de l'objet. Les objets de l'Image peuvent être interrogés à propos de leurs valeurs de pixel.désolé, je ne sais pas comment les aider avec le problème plus complexe. La description originale semblait plus simple.
Je suis très reconnaissant pour vos idées et les intérêts. En fait, j'utilise votre suggestion avec Google Maps Statique de l'API. Le problème posé, bien que, peut-être, est plus facilement résolu en utilisant du javascript directement. Si je trouve une bonne réponse, je vais le poster ici. Merci encore!
OriginalL'auteur Ned Batchelder