Estoy buscando una solución que me permita realizar la codificación geográfica de direcciones en Excel utilizando la API de codificación geográfica de Google Maps.
Básicamente, la tarea es posible a través de Google Sheets, como se discutió en ¿Cómo geocodificar una hoja de cálculo de Google?
y se explicó en detalles aquí:
http://www.mkrgeo-blog.com/the-costless-way-to-geocoding-addresses-in-excel/
Las Hojas de cálculo de Google tienen un buen complemento: Awesome Table, que puede hacerlo hasta 1000 registros diarios. Lo más incómodo es que funciona de alguna manera en una plataforma externa, que es la hoja de cálculo de Google y en cualquier momento requiere la transferencia a nuestra hoja de cálculo de Excel.
Me gustaría tenerlo directamente en Excel. Lamentablemente, debido a la política de Google Maps, la API de codificación geográfica ya no es gratuita ( incluso para la pequeña cantidad de consultas ).
La política cambió en el verano de 2018, sin embargo, detecté algo en la web que podría ser útil para solucionar este problema, incluso sin la participación de macros de VBA.
De acuerdo con el hilo a continuación:
https://www.reddit.com/r/excel/comments/a2r3aq/converting_addresses_to_lat_and_long/eb0mkys/
este problema se puede resolver hasta 2500 registros por día , cuando:
-
cree nuestra clave de API
-
restringirla a la opción de API de geocodificación
-
Pegue en nuestra fórmula de Excel, que parece de la siguiente manera:
= WEBSERVICE (" https://maps.googleapis.com/maps/api/directions/xml?key=PUTYOUROWNAPIKEYHERE&origin="&SUBSTITUTE (A1, " ", "% 20 ") & " destino = " & SUSTITUIR (A2, " ", "% 20 "))
Al traducirlo a mi ejemplo (con mi propia clave de API de geocodificación) se ve como sigue:
=WEBSERVICE("https://maps.googleapis.com/maps/api/directions/xml?key=AIzaSyCiAhXX59p2G2PworpQeu8ADcqIo0s8h8A&origin="&SUBSTITUTE(Z18," ","%20")&"&destination="&SUBSTITUTE(Z19," ","%20"))
Desafortunadamente, no funciona, ya que obtengo una cadena como esta:
REQUEST_DENIED < error_message > Este proyecto de API no está autorizado para utilizar esta API. < / error_message >
Pensé que eso significa que mi API recién creada no está habilitada. Fui aquí y lo hice.
No ayudó tampoco. Entonces, ¿significa que no hay ninguna opción para la codificación geográfica gratuita? en Google? ¿Alguien puede aclarar quién encontró este problema o estaba dispuesto a realizar una codificación geográfica a través de Google Maps?
Comentarios
- ¿Cuántos códigos geográficos en total tienes? Algunos como la API de Google Maps solo le permite geocodificar si lo muestra en un mapa de Google y no lo almacena en un archivo o base de datos.
- básicamente 2 códigos postales. De acuerdo con el hilo de Reddit, ' s factible a través de la función WEBSERVICE
- MapQuest todavía funciona developer.mapquest.com/documentation/samples/geocoding/v1/…
- Se lo agradezco, sin embargo, mi objetivo es hacer la codificación geográfica directamente desde la hoja de Excel cuando sea posible. Sé acerca de Nominatim y Bing Apis, sin embargo r Quiero una aclaración sobre la API de Google Maps. Sabía que era ' pagadero, hasta que encontré esta pista en Reddit que me hizo tropezar.
Responder
Con el paquete Python GeoPy puede geocodificar utilizando la API de Google Maps v3. https://geopy.readthedocs.io/en/stable/#googlev3
Según https://developers.google.com/maps/documentation/geocoding/usage-and-billing , parece que ya no hay un nivel gratuito.
«Recordatorio: para use la API de codificación geográfica, debe incluir una clave de API con todas las solicitudes de API y debe habilitar la facturación en cada uno de sus proyectos «.
Dicho esto, He utilizado este paquete con otras opciones de geocodificador como Nominatim y ArcGIS con éxito.
El código siguiente se puede utilizar para codificar direcciones en cada fila de una columna para cada hoja en una hoja de cálculo de Excel y escribir cada resultado en una nueva columna. Lo tengo configurado para codificar geográficamente un par «ciudad, estado» y escribir lat y long en columnas individuales.
import pandas as pd from geopy.geocoders import ArcGIS from openpyxl import load_workbook import xlrd from geopy.extra.rate_limiter import RateLimiter geolocator = GoogleV3(api_key, "maps.googleapis.com") #alter min_delay param if getting too many request error. May not need if using ArcGIS geocoder geocode = RateLimiter(geolocator.geocode) #min_delay_seconds=0.5 # Spreadsheet path adr_tble = (r"") #get sheet names sheets = [i for i in xlrd.open_workbook(adr_tble, on_demand = True).sheet_names()] book = load_workbook(adr_tble) writer = pd.ExcelWriter(adr_tble, engine="openpyxl") writer.book = book writer.sheets = dict((ws.title, ws) for ws in book.worksheets) for i in sheets: print("Sheet: " + i + "\n") #read in dataframe df = pd.read_excel(adr_tble, sheet_name = i) #check if city state column exists if "CITY_STATE" in df: # create empty lists list_lat = [] list_long = [] for index, row in df.iterrows(): cityState = row["DUTY_CITY_STATE"] location = geocode(cityState) lat = location.latitude long = location.longitude print(cityState + " = " + str(lat), str(long)) list_lat.append(lat) list_long.append(long) df["lat"] = list_lat df["lon"] = list_long df.to_excel(writer, sheet_name=i) print("\n-----------------------------------------------------------------------------------\n") writer.save() writer.close()