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.