geolocalizacion-con-coordenadas-en-excel-ii-problemas-encontrados

Google Geocoding API in Excel (II), problems found.

El mes pasado hablaba sobre la API de Google para la geolocalización de coordenadas en mi anterior post, dónde comentaba que había tenido una serie de problemas en la implementación. Pues bien, voy a detallarlos y sobre todo, a explicar qué hice para solucionarlos. Empezaré explicando aquellos pequeños inconvenientes que son fáciles de superar.

Cuando realizamos la búsqueda de las coordenadas para aquellos nombres de países, comunidades autónomas, provincias, municipios, etc… debemos de prestar especial atención a su escritura, pues si éstos llevan la letra ‘ñ’ o bien van tildados seguramente causarán conflictos.

Hay diferentes opciones de salvar este escollo, la más rápida, bajo mi punto de vista fue crearme una función que transformase la ‘ñ’ o ‘Ñ’ en ‘n’ o ‘N’ y las vocales acentuadas por vocales sin acentuar.

Esta función se da de alta de la misma manera que la anterior y el código puede ser éste:

Function txtNoAcc(texto) As String
Dim largoTexto As Long, iX As Long
Dim Lett As Long

txtNoAcc = ""

largoTexto = Len(texto)

For iX = 1 To largoTexto
Lett = Asc(Mid(texto, iX, 1))
Select Case Lett
Case Is = 225
txtNoAcc = txtNoAcc & Chr(97)
Case Is = 193
txtNoAcc = txtNoAcc & Chr(65)
Case Is = 233
txtNoAcc = txtNoAcc & Chr(101)
Case Is = 201
txtNoAcc = txtNoAcc & Chr(69)
Case Is = 237
txtNoAcc = txtNoAcc & Chr(105)
Case Is = 205
txtNoAcc = txtNoAcc & Chr(73)
Case Is = 243
txtNoAcc = txtNoAcc & Chr(111)
Case Is = 211
txtNoAcc = txtNoAcc & Chr(79)
Case Is = 250
txtNoAcc = txtNoAcc & Chr(117)
Case Is = 218
txtNoAcc = txtNoAcc & Chr(85)
Case Is = 241
txtNoAcc = txtNoAcc & Chr(110)
Case Is = 209
txtNoAcc = txtNoAcc & Chr(78)
Case Else
txtNoAcc = txtNoAcc & Mid(texto, iX, 1)
End Select
Next iX
End Function

Una vez más decir que en la red seguramente encontremos funciones que nos parezcan mejores, de resolución más elegante,…

Como cualquier otra función en Excel para llamarlas en cada celda bastaría con escribir:

= GoogleGeocode(txtNoAcc(nombreCelda))

El segundo de los problemas, con el que nos podemos encontrar es que a veces, el proceso nos devuelve un mensaje del tipo “Not found (try again, you may have done too many too fast)”

A veces el error simplemente consiste en que el nombre de la localización existe en más de una provincia, estado… o lo que es lo mismo que existen diferentes coordenadas para ese nombre.

Esto suele pasar con nombres de municipios, sugerimos que en estos casos se le añada en la búsqueda la Comunidad Autónoma o cualquier otro dato que la pueda diferenciar.

Pero en otros casos el error es imposible de resolver ya que se trata de una restricción de Google.

Server-side geocoding through the Geocoding Web Service has a quota of 2,500 requests per IP per day, so all requests in one day count against the quota. In addition, the Web Service is rate-limited, so that requests that come in too quickly result in blocking. Client-side geocoding through the browser is rate limited per map session, so the geocoding is distributed across all your users and scales with your userbase. Geocoding quotas and rate limits drive the strategies outlined in this article.

In Google Maps API for Business, quotas are tied to client IDs, which provide much higher quotas. To learn more about Maps API for Business quotas and error handling, we recommend reviewing our article, Usage Limits for Google Maps API Web Services. If you’re still running into quota limits using the Google Maps API for Business, file a support request here: https://google.secure.force.com/

Se puede consultar más al respecto aquí:

https://developers.google.com/maps/documentation/geocoding/geocoding-strategies

En estos casos sólo queda esperar a que nos quiten la restricción para poder seguir consultando.

Precisamente para eludir este problema ideamos una forma más refinada de hacer las operaciones de geolocalización.

Si en lugar de realizar 4000 consultas, una por registro, obtenemos los países diferentes, o las provincias únicas que aparecen, etc…bajaríamos mucho las posibilidades de saturar el máximo de peticiones.

Explico a continuación qué se hizo y cómo:

Lo primero es usar la opción de la pestaña Datos, Filtro Avanzado, pulsando sobre Avanzadas. Una vez se nos abre la ventana correspondiente indicamos que queremos copiar a otra celda y lo fundamental que queremos quedarnos únicamente con aquellos valores diferentes.

De esta forma por cada páis, comunidad, municipio sólo tendremos una instancia por la que preguntar y eliminaremos muchas consultas innecesarias a la API de Google para la geolocalización.

Otro pequeño detalle, aunque en este caso pensado para una mejor visualización sería el colocar las coordenadas en dos columnas en lugar de sólo una como sería tras resolverse la función que creamos anteriormente.

En una de las columnas tendríamos la Latitud y en la otra la Longitud, para conseguir esto y dado que tenemos ambos valores en la Columna generada, a la que por ejemplo se le llamó Coordenadas, aplicaremos dos funciones una para cada columna.

  • Para la Latitud aplicaremos ésta: =IZQUIERDA(B1;HALLAR(“,”;B1)-1) donde B es la columna Coordenadas.
  • Para la Longitud usaremos ésta otra: =DERECHA(B1;LARGO(B1)-HALLAR(“,”;B1)) donde B es la columna Coordenadas.

Una vez que tenemos todos los valores para x instancias únicas podríamos pasar estos valores de las coordenadas a la hoja donde se encuentra la información al completo usando funciones de búsqueda y/o consulta.

3 respuestas a «Google Geocoding API in Excel (II), problems found.»

  1. Hola
    Estoy interesandome en usar google maps con Excel y veo que dominas
    el tema.
    Tengo una duda, inserto el activeX de excel (Webbrowser) en una hoja, pero soy incapaz de imprimirlo como parte de una ficha que estoy creando. Me gustaria poder usar las APIS directamente pero no se como se hace. Me prodrias Ayudar?
    Si no te molesta, he modificado un poco la funcion de separar las coordenadas para que se pueda arrastrar y rellenar las celdas consecutivas.
    Gracias por compartir
    Un saludo
    Ppri

    1. Buenos días Francis, a ver si te he entendido.
      ¿Lo que necesitas es incrustar en una hoja de Excel un mapa sobre el que pintar las direcciones?
      Si es así, vas bien.
      Lo primero es irte a la pestaña Programador. Seleccionas Insertar/Más controles.
      En la ventana que te muestra con los distintos controles selecciona Microsoft Web Browser.
      Pulsas Aceptar y a continuación seleccionas con el ratón el área que va a ocupar ese control, cuanto más amplia mejor para manejarte luego en el mapa.
      Hasta ahí entiendo que ya lo has hecho.

      Luego hablas de una ficha, así que interpreto que vas rellenando datos en una columna del tipo Municipio, Provincia, País,…
      Lo más importante es la URL que vas a usar para pedir la localización en GoogleMaps.

      En mi caso, la URL es insertada en una de las celdas como una función de este modo:
      =”https://maps.google.com/maps?q=”&B2
      A medida que quieras pasarle datos tendrás que concatenarlos en la petición.

      En la columna A tengo los títulos de provincia, etc.. y en la columna B los valores.
      Ahora es necesario pasarle el código a ese control que añadimos.
      Para ello en modo Diseño, selecciono el control, botón derecho y selecciono Ver código.
      Al hacer esto se abre una ventana de VB donde escribiré el código.
      Por defecto viene esto:
      Private Sub WebBrowser1_StatusTextChange(ByVal Text As String)

      End Sub

      A lo que yo le añado lo siguiente

      Sub abreGoogle()
      WebBrowser1.Navigate2 Range(“C8”).Value
      End Sub

      C8 es la celda que corresponde a la función que comentaba antes (=”https://maps.google.com/maps?q=”&B2).

      Hasta ahora el funcionamiento es hacer una petición a Google maps con los datos que hemos rellenado en las columnas (B en mi caso) y lanzar la petición que tenemos almacenada en este caso en la celda C8.
      Con este código el control se debe mostrar con cada punto de geolocalización que le indiquemos.
      Probamos primero desde la propia ventana de VB a Ejecutar.
      Si todo va según lo previsto el siguiente paso sería añadir un botón que nos agilice el trámite.
      Eso se hace del mismo modo que se añadió el Web Browser. Se asocia al método del WebBrowser y se ejecuta.
      Con esto deberías ver por cada conjunto de datos que le pases al mapa los puntos correspondientes en Google Maps.
      Espero haber contestado tu pregunta. 🙂

  2. Se me olvido poner la modificacion:

    =IZQUIERDA(GoogleGeocode(A10);HALLAR(“,”;GoogleGeocode(A10))-1)

    =DERECHA(GoogleGeocode(A10);LARGO(GoogleGeocode(A10))-HALLAR(“,”;GoogleGeocode(A10)))

    Lo dicho, Gracias
    Ppri

Los comentarios están cerrados.