Încerc să testez următorul cod pe sistemul meu, dar nu pot obține rezultatul corect.
- Este acest cod corect pentru utilizarea
geopy
cuGoogleV3
? - Dacă deci, cum pot returna numele țării și continentului?
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
Comentarii
Răspundeți
Nu utilizați o comandă externă pentru a vă seta proxy-ul. Dacă sunteți activat Windows și proxy-ul dvs. sunt deja configurate în opțiunile dvs. de internet, nu trebuie deloc să îl configurați în script, acesta va fi detectat automat.
Dacă nu aveți deja un proxy configurat , puteți transmite proxy-ul direct la geocoder :
geolocator = GoogleV3(api_key, proxies={"http": proxy_addr, "https": proxy_addr})
Sau puteți seta proxy-ul ca o variabilă de mediu fără o comandă externă:
os.environ["HTTP_PROXY"] = proxy_addr os.environ["HTTPS_PROXY"] = proxy_addr geolocator = GoogleV3(api_key)
Apoi puteți accesa adresa returnată cum ar fi:
location = geolocator.reverse([52.509669, 13.376294], timeout = 10, exactly_one=True) print location.longitude,location.latitude,location.address
Ieșire:
13.3756952 52.5102143 Potsdamer Platz 4, 10785 Berlin, Germany
Dacă doriți să extrageți numele țării și codul poștal, aruncați o privire în location.raw
dicționar. Componentele de răspuns sunt specificate în documentația API 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
Rețineți că acest lucru este aplicabil doar geocoderului GoogleV3 și poate fi defectat dacă Google își modifică API-ul …
Notă – Google nu pare să se întoarcă numele continentului.
Comentarii
- Vă mulțumim pentru ajutor. Am încercat să punem acest lucru în funcțiune săptămâni acum
- Luke, unde este documentația pentru accesarea componentelor brute?
- @dustin geopy.readthedocs.org discută despre
raw
dicționar - Mă uitam acolo, dar nu era ' suficient de detaliat pentru a înțelege. Nu puteam ' nu găsiți multe coduri poștale (coduri poștale) sau cum să le accesați, dacă este posibil.
- ' este pentru că
raw
este doar răspunsul original din t serverul a fost analizat într-un dicționar python. Răspunsul de la fiecare API de geocodificare va fi diferit. Puteți utiliza tehnici standard de python pentru a-l inspecta, adicăprint
,location.raw.keys()
,dir(location.raw)
etc. …
location
, adică are geocodul invers ați avut succes?