martes, 25 de junio de 2013

Píldora: Invocando a la API de Google Places

Hoy arranco la sección de píldoras (mini-post) debido a que estoy muy absorbido para poder publicar extensos post.

Google nos provee de una API para acceder a su Google Places para informarnos de los lugares cercanos a una posición dada. Es bastante sencillo, pues solo tenemos que hacer una invocación  a una URL indicando una serie de parámetros.

Activando la API

Para activar la API de Google Places deberemos acceder a https://code.google.com/apis/console. Aquí podremos ver el proyecto API que creamos.



Si no lo tienes aún, necesitas crearlo siguiendo las instrucciones. Es fácil.
Con nuestro proyecto API ya creado, accederemos a Services y buscaremos Places API para activarlo.



Y con esto, navegamos a API Access y creamos un API Server Key. Si ya lo tenemos creado, simplemente copiamos nuestra API key.



API de Google Places

Para la realización de la búsqueda de sitios deberemos ejecutar la siguiente URL en nuestro navegador o invocarla desde nuestra aplicación que estemos desarrollando:

https://maps.googleapis.com/maps/api/place/search/<output>?<parameters>
Donde tendremos que especificar los valores de <output> y <parameter>.
  • En <output> indicaremos el formato de salida: json o xml.


https://maps.googleapis.com/maps/api/place/search/xml?

https://maps.googleapis.com/maps/api/place/search/json?

  • En <parameter> expecificaremos obligatoriamente los siguientes parámetros:
    • key: API key que hemos copiado de la consola de APIs del apartado anterior

https://maps.googleapis.com/maps/api/place/search/xml?...&key=AIzaSyDJ_NY9CC_hy8e-QxgcFCu6A5XbqBj2Eu0

    • location: Localización (latitud, longitud) separada por coma y con punto como caracter decimal.

https://maps.googleapis.com/maps/api/place/search/xml?location=XX.406299,YY.9292673...

    • radius ó rankby=distance: radius nos indica el radio de acción en metros (distancia). rankby=distance nos devolverá la lista de lugares encontrados ordenados por cercanía. Son excluyentes, así que se si se indica rankby=distance no se puede usar radius.

      OJO!
      Si se especifica rankby=distance se debe indicar al menos un valor en el parámetro types.


https://maps.googleapis.com/maps/api/place/search/xml?...rankby=distance...

    • sensor: indicar true o false si el dispositivo dispone de GPS o no.

https://maps.googleapis.com/maps/api/place/search/xml?...sensor=false...

    • types: tipos de sitios que buscamos. Un bar, una farmacia…Separado por “pipes” | y obligatorio en caso de usar rankby=distance. El listado de tipos los tenéis aquí.

https://maps.googleapis.com/maps/api/place/search/xml?...types=pharmacy...

Invocación

Con todo esto, construimos la URL y realizamos la llamada. Por ejemplo, desde el explorador:

https://maps.googleapis.com/maps/api/place/search/xml?location=XX.406299,YY.9292673&types=pharmacy&name=&rankby=distance&sensor=false&key=AIzaSyDJ_NY9CC_hy8e-QxgcFCu6A5XbqBj2Eu0

Y como he especificado que se trata de un xml, el resultado es el siguiente:

<?xml version="1.0" encoding="UTF-8"?>
<PlaceSearchResponse>
  <status>OK</status>
  <result>
    <name>Farmacia Laboratorio XXXXXXXX</name>
    <vicinity>XXXXXXXXXXX</vicinity>
    <type>pharmacy</type>
    <type>store</type>
    <type>health</type>
    <type>establishment</type>
    <geometry>
      <location>
        <lat>XX.4065690</lat>
        <lng>YY.9303690</lng>
      </location>
    </geometry>
    <icon>http://maps.gstatic.com/mapfiles/place_api/icons/generic_business-71.png</icon>
    <reference>XXXXXXXXXXXXXXXXX</reference>
    <id>XXXXXXXXXXXX</id>
  </result>
  <result>
    <name>Farmacia YYYYYYYYYY</name>
(...)


Y ya desde nuestra aplicación solo tendremos que interpretar los resultados.

¿Fácil verdad?