Jag försöker testa följande kod på mitt system men jag kan inte få rätt utdata.
- Är den här koden korrekt för att använda
geopy
medGoogleV3
? - Om så, hur kan jag returnera land och kontinentnamn?
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
Kommentarer
Svara
Använd inte ett externt kommando för att ställa in din proxy. Om du är på Windows och din proxy är redan inställd i dina internetalternativ, du behöver inte konfigurera det i skriptet alls, det kommer automatiskt att upptäckas.
Om du inte har en proxy redan konfigurerad , du kan skicka proxyn direkt till geokodaren :
geolocator = GoogleV3(api_key, proxies={"http": proxy_addr, "https": proxy_addr})
Eller så kan du ställa in proxyen som en miljövariabel utan ett externt kommando:
os.environ["HTTP_PROXY"] = proxy_addr os.environ["HTTPS_PROXY"] = proxy_addr geolocator = GoogleV3(api_key)
Sedan kan du komma åt den returnerade adressen som:
location = geolocator.reverse([52.509669, 13.376294], timeout = 10, exactly_one=True) print location.longitude,location.latitude,location.address
Output:
13.3756952 52.5102143 Potsdamer Platz 4, 10785 Berlin, Germany
Om du vill extrahera landets namn och postnummer, ta en titt i location.raw
ordbok. Svarkomponenterna anges i Google API-dokumentation .
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
Observera att detta endast gäller för GoogleV3-geokodaren och kan komma att gå sönder om Google ändrar sitt API …
Obs! Google verkar inte returnera kontinentets namn.
Kommentarer
- Tack för hjälpen. Försökte få detta att fungera veckor nu
- Luke, var är dokumentationen för åtkomst till råkomponenterna?
- @dustin geopy.readthedocs.org diskuterar
raw
ordbok - Jag tittade där men det var inte ' t tillräckligt för att jag skulle förstå. Jag kunde inte ' t hittar mycket på postnummer (postnummer) eller hur man kommer åt dem om möjligt.
- Att ' beror på att
raw
är bara det ursprungliga svaret från t servern analyseras i en pythonordbok. Svaret från varje geokodning-API kommer att vara annorlunda. Du kan använda standardpytontekniker för att inspektera den, dvsprint
,location.raw.keys()
,dir(location.raw)
etc …
location
, dvs har den omvända geokoden lyckats?