Jessaie de tester le code suivant sur mon système mais je ne parviens pas à obtenir la sortie correcte.
- Ce code est-il correct pour utiliser
geopy
avecGoogleV3
? - Si alors, comment puis-je renvoyer le nom du pays et du continent?
import subprocess from geopy.geocoders import GoogleV3 def set_proxy(proxy_addr): cmd = "set HTTPS_PROXY=" + proxy_addr call = subprocess.call(cmd, shell=True) cmd = "set HTTP_PROXY=" + proxy_addr call = subprocess.call(cmd, shell=True) set_proxy("my.proxy") api_key = "my key" geolocator = GoogleV3(api_key) location = geolocator.reverse("52.509669, 13.376294", timeout = 10) #would like to return just country and continent name
Commentaires
Réponse
Nutilisez pas de commande externe pour définir votre proxy. Si vous êtes sur Windows et votre proxy sont déjà configurés dans vos options Internet, vous navez pas du tout besoin de le configurer dans le script, il sera détecté automatiquement.
Si vous navez pas de proxy déjà configuré , vous pouvez transmettre le proxy directement à le géocodeur :
geolocator = GoogleV3(api_key, proxies={"http": proxy_addr, "https": proxy_addr})
Ou vous pouvez définir le proxy comme variable denvironnement sans commande externe:
os.environ["HTTP_PROXY"] = proxy_addr os.environ["HTTPS_PROXY"] = proxy_addr geolocator = GoogleV3(api_key)
Ensuite, vous pouvez accéder à ladresse renvoyée comme:
location = geolocator.reverse([52.509669, 13.376294], timeout = 10, exactly_one=True) print location.longitude,location.latitude,location.address
Sortie:
13.3756952 52.5102143 Potsdamer Platz 4, 10785 Berlin, Germany
Si vous souhaitez extraire le nom du pays et le code postal, regardez dans le location.raw
dictionnaire. Les composants de la réponse sont spécifiés dans la documentation de lAPI Google .
from geopy.geocoders import GoogleV3 ################################################## # Some dummy values just so the script is # self contained and runnable api_key=None rows=[{"avg_lat":52.509669, "avg_lon":13.376294}] ################################################## def get_component(location, component_type): for component in location.raw["address_components"]: if component_type in component["types"]: return component["long_name"] geolocator = GoogleV3(api_key) for row in rows: location = geolocator.reverse((row["avg_lat"], row["avg_lon"]), timeout = 10, exactly_one=True) post_code = get_component(location, "postal_code") country = get_component(location, "country") print location.longitude,location.latitude,location.address print post_code,country
Notez que cela sapplique uniquement au géocodeur GoogleV3 et peut être cassé si Google modifie son API …
Remarque – Google ne semble pas revenir le nom du continent.
Commentaires
- Merci pour laide. Jessaie de faire en sorte que cela fonctionne des semaines maintenant
- Luke, où se trouve la documentation pour accéder aux composants bruts?
- @dustin geopy.readthedocs.org traite de la
raw
dictionnaire - Je cherchais là-bas, mais ce nétait ' t suffisamment verbeux pour que je puisse comprendre. Je ne pouvais ' t trouver beaucoup sur les codes postaux (codes postaux) ou comment y accéder si possible.
- Cela ' car
raw
est juste la réponse originale de t Le serveur a analysé dans un dictionnaire python. La réponse de chaque API de géocodage sera différente. Vous pouvez utiliser des techniques python standard pour linspecter, cest-à-direprint
,location.raw.keys()
,dir(location.raw)
etc. …
location
, cest-à-dire a le géocode inversé réussi?