Ik probeer de volgende code op mijn systeem te testen, maar ik kan de juiste uitvoer niet krijgen.
- Is deze code correct voor het gebruik van
geopy
metGoogleV3
? - Als dus, hoe kan ik land- en continentnaam retourneren?
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
Reacties
Antwoord
Gebruik geen extern commando om uw proxy in te stellen. Als u op Windows en je proxy zijn al ingesteld in je internetopties, je hoeft het helemaal niet in het script in te stellen, het wordt automatisch gedetecteerd.
Als je nog geen proxy hebt ingesteld , je kunt de proxy rechtstreeks doorgeven aan de geocoder :
geolocator = GoogleV3(api_key, proxies={"http": proxy_addr, "https": proxy_addr})
Of je kunt de proxy instellen als een omgevingsvariabele zonder een extern commando:
os.environ["HTTP_PROXY"] = proxy_addr os.environ["HTTPS_PROXY"] = proxy_addr geolocator = GoogleV3(api_key)
Vervolgens heeft u toegang tot het geretourneerde adres zoals:
location = geolocator.reverse([52.509669, 13.376294], timeout = 10, exactly_one=True) print location.longitude,location.latitude,location.address
Uitvoer:
13.3756952 52.5102143 Potsdamer Platz 4, 10785 Berlin, Germany
Als je de landnaam en postcode wilt extraheren, kijk dan eens in de location.raw
woordenboek. De responscomponenten worden gespecificeerd in de Google API-documentatie .
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
Merk op dat dit alleen van toepassing is op de GoogleV3-geocoder en onderhevig is aan breuk als Google hun API wijzigt …
Opmerking – Google lijkt niet terug te keren de naam van het continent.
Opmerkingen
- Bedankt voor de hulp. Ik probeer dit nu al weken te laten werken
- Luke, waar is de documentatie voor toegang tot de onbewerkte componenten?
- @dustin geopy.readthedocs.org bespreekt de
raw
woordenboek - Ik was daar aan het zoeken, maar het was niet ' t breed genoeg om het te begrijpen. Ik kon ' vindt niet veel over postcodes (postcodes) of hoe je ze kunt openen, indien mogelijk.
- Dat ' is omdat
raw
is slechts het oorspronkelijke antwoord van t De server is geparseerd in een python-woordenboek. Het antwoord van elke geocoderings-API zal anders zijn. U kunt standaard Python-technieken gebruiken om het te inspecteren, bijv.print
,location.raw.keys()
,dir(location.raw)
enz. …
location
, dwz heeft de omgekeerde geocode geslaagd?