Geocodificación con PHP y el API Google Maps (5)

Autor: Quentin Zervaas

Fuente original: http://www.phpriot.com/articles/google-maps-geocoding/5

Acceder a los datos del geocodificador con SimpleXML

Ahora que sabemos cómo recuperar la respuesta del geocodificador, y qué significa realmente el XML que devuelve, vamos a analizar sintácticamente este XML para poder utilizar los datos. Para ello, vamos a utilizar SimpleXML, que, como su nombre indica, hace que el manejo de XML en PHP sea muy sencillo. SimpleXML está disponible de forma nativa desde PHP 5.

Para leer los valores de un archivo XML sólo necesitamos crear una instancia de la clase SimpleXMLElement, pasando como constructor el XML que queremos analizar sintácticamente. Esto se ilustra en el siguiente ejemplo:

 

$str = '<kml><Response> .... </Response></kml>'; // Archivo XML de ejemplo

$xml = new SimpleXMLElement($str);

Una vez tenemos el objeto SimpleXMLElement, podemos acceder a cualquier elemento del archivo XML del mismo modo que accedemos a las propiedades de los objetos PHP. Por ejemplo, para acceder al código de estado de la petición, escribimos:

 

$xml = new SimpleXMLElement($geocoderResponse);

echo $xml->Response->Status->code;

De hecho, el tipo de $xml->Response->Status->code es otra instancia de SimpleXMLElement; por lo tanto, debemos convertir este valor al tipo que necesitamos realmente (una cadena o un entero, por ejemplo). El siguiente ejemplo lee el código de estado de la petición y se asegura de que ésta se completa correctamente. (Recordemos que un código de respuesta 200 significa que la petición es correcta).


$xml = new SimpleXMLElment($geocoderResponse);

$status = (int) $xml->Response->Status->code;

if ($status == 200) {

// La petición al geocodificador se ha completado correctamente

}

Ahora ya sabemos leer los valores de las etiquetas XML. Sin embargo, algunos datos se guardan en atributos, como por ejemplo el atributo Accuracy de los elementos Placemark. Para acceder a un atributo con SimpleXML, su elemento padre se trata como una matriz. El siguiente ejemplo itera sobre los elementos Placemark de la respuesta y accede a sus valores Accuracy; también imprime la dirección:


$xml = new SimpleXMLElement($geocoderResponse);

foreach ($xml->Response->Placemark as $placemark){

$accuracy = (int) $placemark->AddressDetails['Accuracy'];

if ($accuracy == 8) {

// Nivel de precisión de la dirección

}

echo $placemark->address."\n";

}

Llegados a este punto, hemos cubierto los conocimientos básicos necesarios para hacer una consulta al geocodificador: entender la respuesta y leer los valores específicos del archivo XML con SimpleXML. Ahora implementaremos un geocodificador funcional con PHP 5 que combina todo lo que explica este artículo.

Anuncios

Geocodificación con PHP y el API Google Maps (4)

Autor: Quentin Zervaas

Fuente original: http://www.phpriot.com/articles/google-maps-geocoding/4

Entendiendo la respuesta del geocodificador

Después de enviar la petición al geocodificador recibimos la respuesta en el formato especificado. Por ejemplo, si solicitamos la dirección de la Casa Blanca mediante el URL http://maps.google.com/maps/geo?q=1600+pennsylvania+ave+washington+dc&output=xml&key=123456, recibimos la siguiente respuesta XML:

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://earth.google.com/kml/2.0">
  <Response>
    <name>1600 pennsylvania ave washington dc</name>
    <Status>
      <code>200</code>
      <request>geocode</request>
    </Status>
    <Placemark id="p1">
      <address>1600 Pennsylvania Ave NW, Washington, DC 20006, USA</address>
      <AddressDetails Accuracy="8" xmlns="urn:oasis:names:tc:ciq:xsdschema:xAL:2.0">
        <Country>
          <CountryNameCode>US</CountryNameCode>
          <AdministrativeArea><AdministrativeAreaName>DC</AdministrativeAreaName>
          <SubAdministrativeArea>
            <SubAdministrativeAreaName>District of Columbia</SubAdministrativeAreaName>
              <Locality>
                <LocalityName>Washington</LocalityName>
                <Thoroughfare>
                  <ThoroughfareName>1600 Pennsylvania Ave NW</ThoroughfareName>
                </Thoroughfare>
                <PostalCode>
                  <PostalCodeNumber>20006</PostalCodeNumber>
                </PostalCode>
              </Locality>
            </SubAdministrativeArea>
          </AdministrativeArea>
        </Country>
      </AddressDetails>
      <Point>
        <coordinates>-77.036655,38.898774,0</coordinates>
      </Point>
    </Placemark>
  </Response>
</kml>

 En la etiqueta <Response> hay tres elementos clave:

– name: Esta es la consulta de búsqueda que se envía al geocodificador

– Status: Incluye el código de respuesta de la petición. Sirve para determinar de una forma sencilla qué sucede realmente cuando se realiza la petición. Los códigos posibles son los siguientes:

– 200: Petición exitosa (devuelve al menos un Placemark).

– 400: Petición mala (el servidor no pudo entender la petición).

– 500: Error del servidor (ha ocurrido un error interno desconocido).

– 601: Petición perdida. El parámetro q no se ha especificado o se trata de una cadena vacía.

– 602: Dirección desconocida. La petición se lleva a cabo pero no se encuentra ninguna ubicación.

– 603: Dirección no disponible. La dirección no se puede obtener debido a razones legales o contractuales.

– 610: Se ha especificaco una clave API Google Maps inválida.

– 620: Se han realizado demasiadas consultas con la clave API especificada.

– Placemark: Suponiendo que el código de estado es 200, hay al menos un elemento <Placemark> en el archivo XML devuelto. Este elemento contiene toda la información del geocodificador correspondiente a la ubicación o dirección dadas.

Una vez tenemos una respuesta correcta, podemos recorrer los elementos <Placemark> y guardar los datos como corresponde. La primera pieza de información útil de cada <Placemark> es una dirección con formato. Esto es extremadamente útil porque los datos son mucho más consistentes y no tenemos que basarnos en los datos que envía el usuario.

Si echamos un vistazo al ejemplo de arriba, podemos ver que enviamos la cadena de petición 1600 pennsylvania ave washington dc y recibimos la dirección con formato 1600 Pennsylvania Ave NW, Washington, DC 20006, USA .

El siguiente elemento, <AddressDetails>, utiliza el lenguaje extensible de direcciones xAL. Este elemento tiene el atributo Accuracy, que sirve para especificar el nivel de precisión de la ubicación devuelta. Los valores posibles de Accuracy son:

– 0: Desconocido

– 1: País

– 2: Región

– 3: Subregión

– 4: Población

– 5: Código postal

– 6: Calle

– 7: Intersección

– 8: Dirección

En nuestro ejemplo, el nivel de precisión es 8, el máximo. Con el código que hemos desarrollado en este ejemplo puedes probar los diferentes niveles de precisión. Por ejemplo, introduciendo Australia en el término de consulta, se obtiene un nivel de precisión de 1.

Los demás elementos de <AddressDetails> dividen las partes de la dirección completa en sus correspondientes categorías, marcadas según la especifiación xAL.

Finalmente, cada <Placemark> contiene un elemento <Point>. Este elemento tiene una cadena con comas, en que el primer valor es la longitud, el segundo es la latitud y el tercero es la elevación (típicamente no se utiliza). Por lo tanto, en nuestro ejemplo la longitud es 77.036655 y la latitud es 38.898774. Este nivel de precisión corresponde a 11 centímetros (4 pulgadas).

Geocodificación con PHP y el API Google Maps (3)

Autor: Quentin Zervaas

Fuente original: http://www.phpriot.com/articles/google-maps-geocoding/3

Realizar una petición al geocodificador

Cuando realizamos una petición al geocodificador podemos especificar qué tipo de salida queremos utilizar. Las opciones disponibles son: JSON, XML, KML y CSV. En este artículo manejamos datos XML.

Nota: KML (Keyhole Markup Data) es un formato XML que se desarrolló para utilizarse con Google Earth. Las salidas KML y XML del geocodificador son idénticas; sin embargo, el tipo MIME HTTP es diferente.

Aunque los datos JSON se utilizan típicamente dentro del código JavaScript, podemos usarlos fácilmente en vez de la respuesta XML;  para convertir los datos en una matriz PHP podemos utilizar la función json_decode(), disponible desde PHP 5.2.0. En este artículo usamos SimpleXML para leer los datos del geocodificador; para JSON el cambio sería trivial.

Para realizar una petición al geocodificador, se envía una petición HTTP a http://maps.google.com/maps/geo. En esta petición se tienen que especificar tres parámetros en el URI:

q es la dirección o ubicación que queremos geocodificar.

key es la clave API Google Maps que hemos creado anteriormente en este artículo.

output es el formato de salida para la respuesta. Los valores pueden ser json, xml, kml o csv.

Si queremos obtener, por ejemplo, las coordenadas de la Casa Blanca (Pennsylvania Avenue 1600, Washington DC), hacemos una petición a este URL:

http://maps.google.com/maps/geo?q=1600+pennsylvania+ave+washington+dc&output=xml&key=123456

Nota: recuerda sustituir tu propia clave API en este URL.

La dirección exacta que se envía en la cadena no es crítica; necesita datos suficientes para identificar la ubicación y no tiene que ser ambigua.

Geocodificación con PHP y el API Google Maps (2)

Autor: Quentin Zervaas

Fuente original: http://www.phpriot.com/articles/google-maps-geocoding/2

Empezar con Google Maps

Aunque en este artículo no tratamos específicamente con la visualización de mapas en sitios web, necesitamos familiarizarnos con el API Google Maps. Toda la documentación del API se encuentra en http://code.google.com/intl/es/apis/maps/index.html.

Lo primero que tenemos que hacer es crear una clave API para nuestro sitio web. Esta clave se utiliza para identificar todas las peticiones al API. La clave se obtiene de manera gratuita aceptando las condiciones e introduciendo el URL de nuestro sitio web en http://code.google.com/intl/es/apis/maps/signup.html.

En el momento de escribir este artículo, el límite en las peticiones al geocodificador es de 15.000 por día; con un poco de suerte esto es suficiente para nuestras necesidades. Como explicaremos más adelante, te animamos, cuando sea posible, a utilizar cache para los datos del geocodificador.

Una vez tenemos la clave API ya podemos acceder al geocodificador. El resto del artículo, basado en la documentación de http://code.google.com/intl/es/apis/maps/documentation/services.html, explica cómo usar el geocodificador.

Geocodificación con PHP y el API Google Maps (1)

Autor: Quentin Zervaas

Fuente original: http://www.phpriot.com/articles/google-maps-geocoding

Introducción

Se llama geocodificación al proceso de encontrar la longitud y la latitud de una dirección o un lugar determinados. El servicio Google Maps proporciona un acceso libre a su geocodificador a los desarrolladores y a los propietarios de sitios web por medio del API JavaScript Google Maps y del servicio web. En este artículo explicaré cómo acceder al servicio web geocodificador con PHP para que puedas utilizarlo en tus propias aplicaciones.

Hay muchas aplicaciones que pueden hacer uso de un geocodficador; tener acceso a un geocodificador gratuito, fiable y frecuentemente actualizado es una ayuda enorme en el desarrollo de aplicaciones web. Algunos de los ejemplos en que un geocodificador puede ser útil son los siguientes:

– Determinar en un mapa la dirección que un usuario envía.

– Determinar la longitud y la latitud para hacer cálculos, como encontrar otro par de coordeandas a partir de una distancia dada.

– Verificar direcciones (por ejemplo, antes de enviar los pedidos de un almacén de comercio electrónico).

– Recuperar correctamente una dirección a partir de una ubicación determinada. Esto es muy útil si tenemos en cuenta las inconsistencias que puede llegar a tener la dirección que introduce un usuario.

Es sencillo acceder al geocodificador basado en JavaScript cuando utilizamos Google Maps para mostrar mapas en nuestros sitios web; sin embargo, esta no es la solución más adecuada, especialmente desde el punto de vista de la accesibilidad.

Por ejemplo, una aplicación puede recuperar las coordenadas geográficas con el geocodificador JavaScript, a partir de la dirección que el usuario introduce en un formulario, pero esta solución no funciona para los usuarios que tienen JavaScript deshabilitado. Esta barrera se puede derribar utilizando el servicio web; esto quiere decir que todas las peticiones al geocodificador se llevan a cabo en el lado del servidor.

En este artículo desarrollaremos varias clases PHP 5 que facilitan la consulta al geocodificador y el acceso a la respuesta.

Zona de artículos, la nueva categoría de www.tutorialcakephp.wordpress.com

Esta categoría tiene como objetivo exponer y compartir las características de CakePHP para que los programadores puedan utilizarlas en sus desarrollos. Contamos con la colaboración de algunos autores que escriben en español y con el visto bueno de otros, anglohablantes, que desean compartir sus artículos con la comunidad hispanohablante de CakePHP. Además, este apartado cuenta también con textos relacionados con PHP e Internet. Puedes exponer aquí tus ideas, compartir tus clases PHP, hablar de tu experiencia, etc. ¡Esperamos que toda esta información te sea útil!