Estou tentando testar o código a seguir em meu sistema, mas não consigo obter a saída correta.
- Este código está correto para usar
geopy
comGoogleV3
? - Se então, como posso retornar o nome do país e do 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
Comentários
Resposta
Não use um comando externo para definir o seu proxy. Se você estiver no O Windows e seu proxy já estão configurados nas opções de internet, você não precisa configurá-lo no script, ele será detectado automaticamente.
Se você ainda não tiver um proxy configurado , você pode passar o proxy diretamente para o geocodificador :
geolocator = GoogleV3(api_key, proxies={"http": proxy_addr, "https": proxy_addr})
Ou você pode definir o proxy como uma variável de ambiente sem um comando externo:
os.environ["HTTP_PROXY"] = proxy_addr os.environ["HTTPS_PROXY"] = proxy_addr geolocator = GoogleV3(api_key)
Então você pode acessar o endereço retornado como:
location = geolocator.reverse([52.509669, 13.376294], timeout = 10, exactly_one=True) print location.longitude,location.latitude,location.address
Resultado:
13.3756952 52.5102143 Potsdamer Platz 4, 10785 Berlin, Germany
Se você deseja extrair o nome do país e código postal, dê uma olhada no location.raw
dicionário. Os componentes de resposta são especificados na documentação da API do 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
Observe que isso só se aplica ao geocodificador Google V3 e está sujeito a interrupções se o Google alterar sua API …
Observação – o Google não parece retornar o nome do continente.
Comentários
- Obrigado pela ajuda. Estou tentando fazer com que isso funcione semanas agora
- Luke, onde está a documentação para acessar os componentes brutos?
- @dustin geopy.readthedocs.org discute o
raw
dicionário - Eu estava procurando lá, mas não era ' tão detalhado para que eu pudesse entender. Não consegui ' t descobrir muito sobre CEPs (códigos postais) ou como acessá-los, se possível.
- Isso ' s porque
raw
é apenas a resposta original de t O servidor analisado em um dicionário python. A resposta de cada API de geocodificação será diferente. Você pode usar técnicas padrão do Python para inspecioná-lo, ou seja,print
,location.raw.keys()
,dir(location.raw)
etc. …
location
, ou seja, tem o geocódigo reverso teve sucesso?