Sto provando a testare il seguente codice sul mio sistema ma non riesco a ottenere loutput corretto.
- Questo codice è corretto per lutilizzo di
geopy
conGoogleV3
? - Se quindi, come posso restituire il nome del paese e del continente?
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
Commenti
Risposta
Non utilizzare un comando esterno per impostare il proxy. Se sei su Windows e il tuo proxy sono già impostati nelle tue opzioni Internet, non è necessario impostarlo nello script, verrà rilevato automaticamente.
Se non hai un proxy già configurato , puoi passare il proxy direttamente al geocodificatore :
geolocator = GoogleV3(api_key, proxies={"http": proxy_addr, "https": proxy_addr})
Oppure puoi impostare il proxy come variabile dambiente senza un comando esterno:
os.environ["HTTP_PROXY"] = proxy_addr os.environ["HTTPS_PROXY"] = proxy_addr geolocator = GoogleV3(api_key)
Quindi puoi accedere allindirizzo restituito come:
location = geolocator.reverse([52.509669, 13.376294], timeout = 10, exactly_one=True) print location.longitude,location.latitude,location.address
Risultato:
13.3756952 52.5102143 Potsdamer Platz 4, 10785 Berlin, Germany
Se desideri estrarre il nome del paese e il codice postale, dai unocchiata al location.raw
dizionario. I componenti della risposta sono specificati nella documentazione dellAPI di 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
Tieni presente che questo è applicabile solo al geocodificatore Google V3 ed è soggetto a rotture se Google modifica la propria API …
Nota. Google non sembra restituire il nome del continente.
Commenti
- Grazie per laiuto. Sto cercando di farlo funzionare da settimane
- Luke, dovè la documentazione per accedere ai componenti grezzi?
- @dustin geopy.readthedocs.org discute di
raw
dizionario - Stavo cercando lì ma non era ' abbastanza prolisso per me da capire. Non potevo ' t trovare molto sui codici postali o su come accedervi, se possibile.
- Questo ' è perché
raw
è solo la risposta originale di t Il server ha analizzato un dizionario Python. La risposta di ciascuna API di geocodifica sarà diversa. Puoi utilizzare tecniche Python standard per ispezionarlo, ad esempioprint
,location.raw.keys()
,dir(location.raw)
ecc. …
location
, cioè ha il geocodice inverso riuscito?