Ik probeer de volgende code op mijn systeem te testen, maar ik kan de juiste uitvoer niet krijgen.

  1. Is deze code correct voor het gebruik van geopy met GoogleV3?
  2. 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

  • Welke output krijg je? Ontvang je een foutmelding?
  • @MaryBeth Ik wil de naam van het land en het continent (indien mogelijk) voor die lat lang retourneren.
  • " Ik probeer de volgende code op mijn systeem te testen, maar ik kan de juiste output niet krijgen. " Welke output ontvang je versus wat verwacht je? Als u een fout ontvangt, plaats deze dan. Uit onze rondleiding : concentreer u op vragen over een echt probleem waarmee u te maken heeft gehad. Voeg details toe over wat u heeft geprobeerd en wat u precies probeert te doen.
  • Wat is de waarde van location, dwz heeft de omgekeerde geocode geslaagd?

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

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *