Próbuję przetestować następujący kod w moim systemie, ale nie mogę uzyskać poprawnych wyników.
- Czy ten kod jest poprawny w przypadku używania
geopy
zGoogleV3
? - Jeśli więc jak mogę zwrócić nazwę kraju i kontynentu?
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
Komentarze
Odpowiedz
Nie używaj zewnętrznego polecenia do ustawiania serwera proxy. Jeśli jesteś w Windows i serwer proxy są już skonfigurowane w opcjach internetowych, nie musisz w ogóle konfigurować go w skrypcie, zostanie on automatycznie wykryty.
Jeśli nie masz jeszcze skonfigurowanego serwera proxy , możesz przekazać proxy bezpośrednio do geokodera :
geolocator = GoogleV3(api_key, proxies={"http": proxy_addr, "https": proxy_addr})
Lub możesz ustawić proxy jako zmienną środowiskową bez zewnętrznego polecenia:
os.environ["HTTP_PROXY"] = proxy_addr os.environ["HTTPS_PROXY"] = proxy_addr geolocator = GoogleV3(api_key)
Następnie możesz uzyskać dostęp do zwróconego adresu, na przykład:
location = geolocator.reverse([52.509669, 13.376294], timeout = 10, exactly_one=True) print location.longitude,location.latitude,location.address
Wynik:
13.3756952 52.5102143 Potsdamer Platz 4, 10785 Berlin, Germany
Jeśli chcesz wyodrębnić nazwę kraju i kod pocztowy, zajrzyj do location.raw
słownik. Składniki odpowiedzi są określone w dokumentacji interfejsu 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
Uwaga: dotyczy to tylko geokodera GoogleV3 i może ulec awarii, jeśli Google zmieni ich API …
Uwaga – Google nie wydaje się zwracać nazwa kontynentu.
Komentarze
- Dziękuję za pomoc. Starałem się, żeby to pracowało już kilka tygodni.
- Luke, gdzie jest dokumentacja dotycząca dostępu do surowych komponentów?
- @dustin geopy.readthedocs.org omawia
raw
słownik - Szukałem go, ale nie był ' t wystarczająco wyczerpujący, abym zrozumiał. Nie mogłem ' t znaleźć wiele informacji o kodach pocztowych (kodach pocztowych) lub o tym, jak uzyskać do nich dostęp, jeśli to możliwe.
- To ' s, ponieważ
raw
to tylko oryginalna odpowiedź z t serwer przeanalizował słownik języka Python. Odpowiedź z każdego interfejsu API geokodowania będzie inna. Możesz użyć standardowych technik Pythona, aby go sprawdzić, np.print
,location.raw.keys()
,dir(location.raw)
itd. …
location
, tj. Ma odwrotny geokod pomyślnie?