Próbuję przetestować następujący kod w moim systemie, ale nie mogę uzyskać poprawnych wyników.

  1. Czy ten kod jest poprawny w przypadku używania geopy z GoogleV3?
  2. 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

  • Jakie otrzymujesz wyniki? Czy otrzymujesz komunikat o błędzie?
  • @MaryBeth Chcę zwrócić nazwę kraju i kontynentu (jeśli to możliwe) dla tej szerokości.
  • " Próbuję przetestować następujący kod w moim systemie, ale nie mogę uzyskać poprawnych wyników. " Jakie dane wyjściowe otrzymujesz, a czego oczekujesz? Jeśli otrzymujesz błąd, prześlij go. Z naszej prezentacji : Skoncentruj się na pytaniach dotyczących rzeczywistego problemu, z którym się spotkałeś. Uwzględnij szczegóły tego, co próbowałeś i dokładnie tego, co próbujesz zrobić.
  • Jaka jest wartość location, tj. Ma odwrotny geokod pomyślnie?

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. …

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *