Jul 312014
 

El API Overpass está especializado en la realización de consultas a la base de datos de Openstreetmap. Este artículo explica la sintaxis del lenguaje de Overpass.

Introducción

OpenStreetMap es una base de datos de información geográfica de gran tamaño, mantenida por un gran número de colaboradores de todo el mundo.

El API principal que ofrece OpenStreetMap está diseñado para la edición del contenido de la base de datos. Pero algunas aplicaciones no se centran en la edición, sino en la presentación del contenido de OpenStreetMap. Para ello, a menudo requieren realizar consultas de grandes volúmenes de datos utilizando distintos criterios de selección, y para este propósito se han ido desarrollando otros interfaces más especializados:

Inicialmente, se desarrolló un interfaz XAPI (eXtended API) de sólo lectura, que estaba basado en el API principal de OSM, para proporcionar capacidades mejoradas de búsqueda.

Posteriormente, se desarrolló Overpass API, que implementa un lenguaje de consultas más potente. Overpass API también es compatible con XAPI.

Los servidores que ofrecen acceso público a OSM a través de Overpass API son:

 

Cómo consultar la base de datos OSM mediante Overpass

Las consultas se realizan en forma de peticiones HTTP GET o POST a la url que ofrece el servicio, con un parámetro “data” cuyo valor es la consulta que se desea realizar, escrita en el lenguaje Overpass_QL

http://overpass-api.de/api/interpreter?data=consulta

Existen una serie de utilidades de línea de comandos, como wgetcurl, que permiten obtener el contenido de una url, y que pueden ser utilizadas para realizar consultas a la base de datos de OpenStreetMap con el API de Overpass.

Por ejemplo, podemos utilizar el comando wget para obtener los datos del nodo con identificador 1422314245, de la siguiente forma:

$ wget 'http://overpass-api.de/api/interpreter?data=node(1422314245);out;'

Y obtenemos el resultado en formato XML:

<?xml version="1.0" encoding="UTF-8"?>
<osm version="0.6" generator="Overpass API">
<note>The data included in this document is from www.openstreetmap.org. The data is made available under ODbL.</note>
<meta osm_base="2014-08-01T07:07:02Z"/>

  <node id="1422314245" lat="51.8979282" lon="-8.4705806">
    <tag k="is_in" v="County Cork"/>
    <tag k="is_in:continent" v="Europe"/>
    <tag k="name" v="Cork"/>
    <tag k="name:ar" v="كورك"/>
    <tag k="name:cy" v="Corc"/>
    <tag k="name:en" v="Cork"/>
    <tag k="name:ga" v="Corcaigh"/>
    <tag k="name:ru" v="Корк"/>
    <tag k="name:sr" v="Корк"/>
    <tag k="note" v="Experimental import of Irish places and POIs from GNS Dataset"/>
    <tag k="place" v="city"/>
    <tag k="place_county" v="Cork"/>
    <tag k="population" v="127000"/>
    <tag k="ref:LOCODE" v="IEORK"/>
    <tag k="source" v="gns_ei"/>
    <tag k="wikipedia:en" v="Cork_(city)"/>
  </node>

</osm>

Nota: Como vemos, la url que se le pasa al comando wget debe estar encerrada entre comillas, porque la cadena de consulta puede contener caracteres especiales como paréntesis, corchetes cuadrados, etc., que de otro modo serían interpretados por el shell.

Realizar consultas por programa

Normalmente, existen librerías para los distintos lenguajes de programación que permiten obtener el contenido de una URL, que pueden ser utilizadas para realizar consults a la base de datos de OpenStreetMap desde un programa o script, utilizando el API de Overpass.

La única precaución que hay que tener es codificar adecuadamente la cadena de búsqueda, ya que a menudo contiene caracteres especiales, como paréntesis y corchetes cuadrados.

Por ejemplo, podemos realizar la consulta desde un script PHP con las sentencias:

    $id_nodo = 1422314245;
    $consulta = "node($id_nodo);out;";
    $nodo_xml = file_get_contents("http://overpass-api.de/api/interpreter?data=" .
        urlencode($consulta));
    echo $nodo_xml;

En donde, como vemos, utilizamos la función urlencode() de PHP para codificar adecuadamente la consulta.

Estructura de las consultas

Una consulta en lenguage Overpass_QL es una secuencia de sentencias, cada una de ellas terminada en “;”. La sintaxis de cada sentencia es similar a la utilizada en el lenguage “C”.

Una consulta comienza normalmente con una sentencia “node”, “way” o “relation”, que solicita un conjunto de nodos, vías o relaciones, utilizando un filtro que especifica los criterios de búsqueda.

Consulta de nodos, vías o relaciones contenidas en un área rectangular

Uno de los filtros más habituales es un área rectangular (bounding box).

Por ejemplo, para obtener todos los nodos contenidos en un área rectangular, la sintaxis de la consulta es:

node(50.745,7.17,50.75,7.18);out;

En donde las coordenadas del rectángulo siguen la secuencia (latitud sur,longitud sur,latitud norte,longitud norte).

En el ejemplo vemos que, en la consulta, la sentencia de selección de nodos debe ir seguida de la sentencia “out” que entrega el resultado.

De la misma manera, podemos solicitar el conjunto de vías contenidas en un rectángulo:

way(50.745,7.17,50.75,7.18);out;

O el conjunto de relaciones contenidas en el rectángulo:

relation(50.745,7.17,50.75,7.18);out;

Consulta de nodos, vías o relaciones por su identificador único

Si conocemos el identificador numérico de un nodo, vía o relación, podemos solicitar la información relativa al mismo con una consulta de la forma:

Nodo:

node(507464799);out;

Vía:

way(24777894);out;

Relación:

relation(1745069);out;

Búsqueda por nombre y otros atributos

En la búsqueda de nodos, vías y relaciones, se pueden especificar condiciones que deben cumplir los atributos (“tags”) asociados. Por ejemplo:

node
  ["highway"="bus_stop"]
  ["shelter"]
  ["shelter"!="no"]
  (50.7,7.1,50.8,7.25);
out;

En este ejemplo, estamos solicitando los nodos dentro de un bounding box, que cumplan con los criterios:

  1. El valor del tag “highway” es “bus_stop”
  2. El tag “shelter” existe
  3. El valor del tag “shelter” no es “no”

También se pueden utilizar expresiones regulares. Por ejemplo, para solicitar todas las vías de un bounding box que no tienen el tag “highway”:

way
  ["highway"!~"."]
  (50.74,7.17,50.75,7.18);
out;

Obtener todos los elementos dependientes

Si realizamos la búsqueda de una vía, obtendremos los tags asociados a la misma y sus valores, así como los identificadores de los nodos pertenecientes a la misma. Por ejemplo:

way
  ["name"="Gielgenstraße"]
  (50.7,7.1,50.8,7.25);
out;

Pero si queremos obtener también las coordenadas de los nodos (por ejemplo, para representar la vía en un mapa) deberemos hacer una búsqueda de cada uno de los nodos.

Este conjunto de búsquedas se puede combinar en una única busqueda recursiva, utilizando la sentencia “>”. Por ejemplo:

(
  way
    ["name"="Gielgenstraße"]
    (50.7,7.1,50.8,7.25);
  >;
);
out;

La búsqueda recursiva también se puede utilizar para relaciones. En este caso, además de la información asociada a la relación, se obtendrá toda la información asociada a cada uno de los miembros (nodos, vías y relaciones) pertenecientes a la relación buscada.

Obtener todos los elementos de los que dependen los elementos encontrados

También es posible realizar una búsqueda recursiva en sentido inverso, utilizando la sentencia “<“. Con esta sentencia, se incluirán en los resultados de busqueda la información completa todas las vías y relaciones de las que dependen los nodos encontrados.

Ejemplo:

(
  way
    ["name"="Gielgenstraße"]
    (50.7,7.1,50.8,7.25);
  <;
);
out;

Por último, es posible combinar las sentencias “<” y “>”, para obtener la información completa de todas las vías y relaciones incluidas en el resultado de la búsqueda:

(
  way
    ["name"="Gielgenstraße"]
    (50.7,7.1,50.8,7.25);
  <;
  >;
);
out;

Obtener el resultado de la consulta en JSON y otros formatos

Por defecto, el resultado de la consulta se entrega en formato XML.

Al comienzo de la consulta se puede añadir una sentencia solicitando el resultado en formato JSON. Por ejemplo:

[out:json];node(507464799);out;

Además de “xml” y “json”, se pueden solicitar los formatos “custom” y “popup”. El significado de estos formatos y la manera de configurarlos se puede consultar en “Overpass API – Output Formats”

 

Referencias

 Publicado por en 7:06 am

 Deja un comentario

(requerido)

(requerido)