Documentación de la API REST
Los objetivos de diseño principales de la API son:
-
Utilización del estilo arquitectural REST.
-
Diseño de una API limpia y agnóstica de su implementación. Actualmente al API está implementada en RubyOnRails pero podrá ser re-implementada o ampliada en el futuro en otras plataformas, como PHP o Zope.
-
Uso de la librería OpenLayers para mostrar y trabajar con los mapas, lo que además permite que seamos directamente compatibles con Mapstraction.
-
Utilizar el semi-estándar TMS para servir los mapas a OpenLayers
- Intentar adherirse a APIs estándares por todas la ventajas de interoperatividad que ofrecen.
-
En un futuro posiblemente implementar los servicios de la Open Geospatial Consortium (OGC), que incluyen:
En general, la API está dividida es dos partes:
- API para hacer consultas y obtener información.
-
API para embeber y trabajar con mapas. Por embeber nos referimos a incrustar una ventana en la aplicación que un tercero está desarrollando.
Consideraciones generales
Esta API es accesible vía HTTP y sigue el estilo REST. El diseño de la API es agnóstico con respecto a una implementación particular, aunque tiene detalles de diseño de la implementación REST de RubyOnRails. Esta influencia de RubyOnRails está documentada en cada caso particular.
Tipo de coordenadas
A no ser que se indique lo contrario de forma explícita, todas las coordenadas (longitud/latitud) usadas en esta API están en la proyección Spherical Mercator con un SRS de "EPSG:900913".
URL base de la API
Todas las URLs que aparecen en este documento se aplican sobre la URL base del servidor donde se aloja la API. De momento esta URL base es:
b5m.gipuzkoa.eus/api/
Cabe destacar que una implementación en RubyOnRails es agnóstica del dominio utilizado ya que por defecto la aplicación web se auto-ajusta al dominio de la URL de petición.
Versionado
La API está versionada, de forma que pueda evolucionar sin interferir con los clientes que actualmente la utilicen. Los números de versión tienen la forma:
mayor.menor
Este documento describe la versión 1.0 de la API, por lo que la URL base será:
b5m.gipuzkoa.eus/api/1.0/
Una versión determinada de la API debe ser estable durante un tiempo prudencialmente largo para no interferir a los clientes actuales que la estén utilizando.
Localización
El resultado de muchas consultas contiene texto que debe aparecer localizado a petición del cliente.
La selección de la localización se hace de una forma RESTful, introduciendo un código de idioma en el path de la URL. Esto se hace en detrimento del uso de query strings (por ejemplo "?lang=es") tal como recomienda la RestBible (pags. 121-123).
Los códigos de idioma están especificados según el estándar ISO 639-1. Los códigos principales para nuestra aplicación son:
- Euskera: eu - Castellano: es - Inglés: en - Francés: fr
La especificación del código de lenguaje aparece después del número de versión de la API, como por ejemplo:
/api/1.0/es/
La parte "estructural" REST del path (cadena de directorios) de las URLs está en ingles y es independiente de la localización seleccionada. Esto es por consistencia, no tiene sentido que las URLs cambien según la localización seleccionada. Debido al estilo REST, hay partes del path que corresponden a parámetros de la consulta, y por tanto podrán estar localizados.
Los casos en los que los parámetros de consulta están localizados son para la "codificación" de entidades (municipios, calles...)
Por ejemplo, para obtener el MBR de un objeto (mas información en los detalles de la API)
/api/1.0/es/locate/mbr/M_069
La selección del locale se hace por medio la URL como se ha descrito, y de momento se ignora la cabecera HTTP Accept-Language. Esto es en concordancia con el estilo REST (RestBible 93,391).
En cualquier caso, todo el contenido textual devuelto por la API está codificado en UTF-8. De momento, la cabecera HTTP Accept-Charset será ignorada (RestBible 390).
Formato de salida
La API expone los recursos (datos) en diferentes representaciones. Típicamente estas representaciones incluyen los formatos:
- JSON
- XML
- TEXT (TXT,CSV)
La selección de la representación se realiza seleccionando de la siguiente lista el primer caso que se cumpla (estilo Rails):
- Añadiendo una "extensión de formato" a la URL de la petición. Como por ejemplo:
/api/1.0/es/locate/mbr/M_069.xml /api/1.0/es/locate/mbr/M_069.json
-
Utilizando la cabecera HTTP Content con el MIME type adecuado.
- Si no se cumple ninguno de los casos anteriores, se devolverá en la representación por defecto que es XML.
No todos los recursos están disponible en todos los formatos. Los recursos exponen la lista de formatos en los que pueden ser obtenidos. La lista de formatos está accesible añadiendo la extensión ".formats" a la URL que prefija la "clase de recursos". Por ejemplo:
-
/api/1.0/es/locate/mbr.formats /api/1.0/es/locate/info.formats
El resultado es una CSV textual con los formatos de representación soportados por esa clase de recursos.
EPSG
El API permite recibir los resultados en los sistemas de referencia: EPSG:900913 (Spherical Mercator -- por defecto), EPSG:4326 (WGS84) y EPSG:25830 (ETRS89). La selección del sistema de referencia se realiza mediante el parámetro srs.
/api/1.0/es/locate/mbr/M_069.xml;srs=epsg:25830 /api/1.0/es/locate/mbr/M_069.xml;srs=epsg:4326 /api/1.0/es/locate/mbr/M_069.xml;srs=epsg:900913
Formato JSONP
La API puede devolver los datos en formato JSONP. Este es un caso particular ya que hay que especificar cual es la función de callback.
Comúnmente se suele especificar este callback utilizando un query string en la URL. En nuestro caso podría ser algo como:
/api/1.0/es/locate/mbr/M_069.jsonp?callback=mi_funcion
Esta forma de especificar el callback no sigue el estilo arquitectural REST y no es caché friendly. Por ello se ha elegido una forma más REST de especificar el callback.
El callback se especifica utilizando un parameter (que no query string) en la URL:
/api/1.0/es/locate/mbr/M_069.jsonp;callback=mi_funcion
El parámetro callback puede estar URL-codificado. En el caso de utilizar un "." en el callback también hay que URL-codificarlo aunque no sea habitual. De hecho se recomienda URL-codificar todos los caracteres a excepción de letras y dígitos:
/api/1.0/es/locate/mbr/M_069.jsonp;callback=form%5B0%5D%2Efuncion # equivale al callback "form[0].funcion"
Algunos ejemplos de peticiones:
Petición:
/api/1.0/es/locate/info/D_4545.json
Resultado:
{ "info": { "type": "postal_id", "postal_code": { "id_municipality": "017", "name": "SALESIANOS, CONVENTO", "bis": " ", "postal_code": "20720", "district_code": "02", "municipality": "AZKOITIA", "num": "012", "street": "AIZKIBEL KALEA", "section_code": "002", "id_street": "1240" } } }
Petición:
/api/1.0/es/locate/info/D_4545.jsonp;callback=funcion
Resultado:
funcion({ "info": { "type": "postal_id", "postal_code": { "id_municipality": "017", "name": "SALESIANOS, CONVENTO", "bis": " ", "postal_code": "20720", "district_code": "02", "municipality": "AZKOITIA", "num": "012", "street": "AIZKIBEL KALEA", "section_code": "002", "id_street": "1240" } } })
Petición:
/api/1.0/es/locate/info/D_4545.jsonp;callback=form%5B0%5D%2Efuncion
Resultado:
form[0].funcion({ "info": { "type": "postal_id", "postal_code": { "id_municipality": "017", "name": "SALESIANOS, CONVENTO", "bis": " ", "postal_code": "20720", "district_code": "02", "municipality": "AZKOITIA", "num": "012", "street": "AIZKIBEL KALEA", "section_code": "002", "id_street": "1240" } } })
Organización jerárquica de la API (''namespaces'' o espacios de nombres)
Las URLs de la API están estructuradas de forma jerárquica. En un primer nivel, se distingue el tipo de recurso a acceder por medio de un identificador:
Namespace | Uso |
configuration/ | Información sobre las capas disponibles |
locate/ | Para acceder a los recursos (datos) geográficos |
library/ | Para cargar las librerías Javascript |
osgeo/ | Para acceder a API's definidas por la Open Source Geospatial Foundation. Mayormente para TMS. |
Posteriormente, la URL sigue identificando los recursos de una forma jerárquica, desde el recurso que "engloba" a los demás hacia el recurso "más pequeño".
Operaciones REST de modificación
La versión actual de la API sólo soporta el método GET de HTTP, esto es, sólo permite obtener datos. Los métodos PUT, POST y DELETE no están soportados actualmente.
Seguridad y control de uso
La versión actual de la API no soporta ningún sistema de autentificación (API key). Todos los accesos son anónimos y no limitados.
Resumen de la estructura de las URLs
Dominio base | Versión | Locale | Namespace | Ruta al recurso | [Representación (formato)] |
b5m.gipuzkoa.eus/api/ | M.m/ | xy/ | vwxyz/ | .../... | .xyz |
Ejemplo | |||||
b5m.gipuzkoa.eus/api/ | 1.0/ | es/ | locate/ | mbr/M_069 | .json |
Definición de la API
Las URLs de estas definiciones son relativas al prefijo de su URL correspondiente.
Namespace "configuration/"
Estas URLs devuelven datos de configuración.
URL | Resumen | Descripción |
configuration/layers/foreground | Capas de primer plano | Las capas que están activas y pueden acceder vía TMS |
configuration/layers/background | Capas de segundo plano | Las capas que están activas y pueden acceder vía APIs de Google, Yahoo, Microsoft... |
Se pueden ver ejemplos de su uso en: "ejemplos del namespace configuration".
Namespace "locate/"
Todas estas URLs devuelven datos y hacen referencia a objetos.
URL | Resumen | Descripción |
mbr/{code} | Minimum Bounding Rectangle del objeto especificado | Coordenadas del rectángulo mínimo que engloba al objeto |
geometry/{code} | Geometría que define el objeto | La geometría es una serie de coordenadas que definen un polígono que representa al objeto. Representaciones soportadas: GML |
center/{code} | Centro del Objeto | Coordenadas del centro del objeto |
info/{code} | Descripción textual del objeto | La descripción textual incluye su nombre normalizado, tipo... |
search/{cadena_de_busqueda} | Término que se quiere buscar | Nombre del topónimo que se desea buscar |
Los Objetos permitidos son los siguientes:
Objeto | Código | Valor de ejemplo |
Comarcas | S_codcomarca | S_3 |
Municipios | M_codmuni | M_045 |
Calles como conjunto de edificios | K_codmuni_codcalle | K_003_1110 |
Calles como vial | V_codmuni_codcalle | V_003_1110 |
Distritos y secciones | SC_codmuni_coddistri_codseccion | SC_045_01_003 |
Direcciones postales | D_idpostal | D_4545 |
Direcciones postales2 | F_codmuni_codcalle_portal | F_045_1110_003 F_034_1104_004B |
Edificios | E_idarea | E_33360 |
Carreteras y tren | T_codcarre | T_9044 |
Punto Kilométrico | PK_nombrecarretera_kilómetro | PK_GI-2132_5 |
Barrios (código de área) | B_idarea | B_14278 |
Barrios (código de nombre) | Z_idbarrio | Z_15400 |
Cuencas | C_codcuenca | C_11 |
Núcleos | N_codnucleo | N_30145 |
Rios | I_idrio | I_17609 |
Orografía (código de área) | O_idarea | O_21669 |
Orografía (código de nombre) | G_idorogra | G_24071 |
Cuevas | CV_codigo | CV_CE0708 |
Carte megalitica | GK_codigo | GK_GARK153 |
Estaciones Megaliticas | EM_codigo | EM_AR13019 |
El formato de la respuesta de la búsqueda para search/:
Campo | Descripción |
type | El tipo de nombre del que se trata, por ejemplo, EDIFICIO, MUNICIPIO, BARRIO, ARROYO, CALLE, DIRECCION POSTAL |
name | El nombre de elemento encontrado que contiene la palabra clave consulada por el usuario. |
code | Es el código del elemento en la base de datos. Éste es necesario para hacer cualquier tipo de consulta al API REST |
urls | Array de las urls a los distintos tipos de mapas y aplicaciones |
ortho | URL a la ortofoto de B5Map |
map | URL al mapa de B5Map |
pictometry | URL a la vista de pájaro de B5Map |
map2d | URL al mapa de !B5M |
info | URL del callejero |
map3d | URL a la aplicación Gipuzkoa3D |
URL a GoogleMaps? |
Se pueden ver ejemplos de su uso en: "ejemplos del namespace locate".
Namespace "query/"
Estas URLs permiten obtener información sobre los objetos que están alrededor de una coordenada.
URL | Resumen | Descripción |
whatisthis/lat/{lat}/lon/{lon}/tolerance/:tolerance/codes/{codes} | Devuelve una lista de objetos geográficos que se encuentran en un punto | (*) |
(*) Dada una coordenada y una lista de tipos de objetos geográficos a consultar devuelve una lista de objetos geográficos en cuya superficie está contenida la coordenada ("objetos que hay en ese punto"). Sólo se comprueban los tipos de objetos geográficos especificados, así que nunca se devolverá un objeto geográfico de un tipo no especificado. Parámetros:
lat: latitud lon: longitud tolerance: radio en KMs que define un area alrededor del punto en la cual se buscan los objetos (0 para buscar exactamente en el punto dado) codes: lista de tipos de objetos geográficos separados por coma ("T,D,E") o asterisco ("*") para comprobar todos los códigos disponibles
Namespace "layer/"
Estas URLs devuelven información asociada a una capa (ya sea ortofoto o mapa).
URL | Descripción |
layer/scenetype/layer/{layer}/mbr/xmin/{xmin}/ymin/{ymin}/xmax/{xmax}/ymax/{ymax} | Comprueba si el MBR pasado está dentro, parcialmente fuera o totalmente fuera de Gipuzkoa. Devuelve de forma textual: * 1: totalmente dentro * 2: parcialmente fuera * 3: totalmente fuera |
Se pueden ver ejemplos de su uso en: "ejemplos del namespace layer".
Namespace "pictometry/"
Estas URLs devuelven información sobre las imágenes de pictometry,
pictometry/coordinate-search/lat/{lat}/lon/{lon}.{format} | Obtiene las imágenes de pictometry disponibles en las coordenadas dadas. Devuelve una lista de vistas, y por cada vista: * URL TMS base de la imagen * una coordenada dentro de esa imagen que representa el "centro" más aproximado correspondiente a las coordenadas planares originales * orientación de la imagen (N/S/E/O/NW...) |
pictometry/checkfast/lat/{lat}/lon/{lon}.{format} | Comprueba de forma rápida si hay imágenes de pictometry en las coordenadas dadas. Devuelve TRUE o FALSE. |
Se pueden ver ejemplos de su uso en: "ejemplos del namespace pictometry".
Namespace "library/"
Estas URLs permiten la carga de la librerías Javascript por parte del cliente. La librería base es "openlayers" pero en todos los ejemplos (y productos) vamos a utilizar las librerías "prototype" y "scriptaculous", así que (de momento) también las ponemos a disposición de los clientes.
Utilizamos un prefijo con el nombre de la librería para simplificar el rutado, ya que, por ejemplo, dentro de openlayers/ va a haber más directorios "ocultos" con resources que necesita OpenLayers (img/, css/ ...).
Los clientes pueden optar a cargar estas librerías desde otros sitios.
URL | Resumen | Descripción |
openlayers/OpenLayers.js | Librería OpenLayers, OJO! Utilizar el nombre exacto de fichero "OpenLayers.js" (y no "openlayers.js" por ejemplo) o la librería no se va a cargar correctamente (es un detalle de implementación de la librería OpenLayers) | http://openlayers.org/ |
openlayers/OpenLayers.js.version | Versión de la librería OpenLayers que proveemos | |
prototype/prototype.js | Librería Prototype | http://www.prototypejs.org/ |
prototype/prototype.js.version | Versión de la librería Prototype que proveemos | |
scriptaculous/scriptaculous.js | Librería script.aculo.us | http://script.aculo.us/ |
scriptaculous/scriptaculous.js.version | Versión de la librearía script.aculo.us que proveemos |
Se pueden ver ejemplos de su uso en: "ejemplos del namespace library".
Namespace "osgeo/"
Estas URLs son para acceder a "estándares" definidos por la OSGEO, de momento sólo para TMS.
URL | Resumen | Descripción | Ejemplo |
osgeo/tms/tileset/1.0.0/ort/.. | Tile Resources para OpenLayers | Ortofotos (Actual) | http://b5m.gipuzkoa.eus/api/1.0/es/osgeo/tms/tileset/1.0.0/ort/17/64822/83058.jpg |
osgeo/tms/tileset/1.0.0/map/.. | Tile Resources para OpenLayers | Map (Actual) | http://b5m.gipuzkoa.eus/api/1.0/es/osgeo/tms/tileset/1.0.0/map/17/64822/83058.png |
osgeo/tms/tileset/1.0.0/ort2006/.. | Tile Resources para OpenLayers | Ortofotos 2006 | http://b5m.gipuzkoa.eus/api/1.0/es/osgeo/tms/tileset/1.0.0/ort2006/17/64822/83058.jpg |
osgeo/tms/tileset/1.0.0/map2008/.. | Tile Resources para OpenLayers | Map 2008 | http://b5m.gipuzkoa.eus/api/1.0/es/osgeo/tms/tileset/1.0.0/map2008/17/64822/83058.png |
Cartografías disponibles:
Cartografía | Año | ID |
Mapa | actual | map |
2010 | map2010 | |
2009 | map2009 | |
2008 | map2008 | |
2007 | map2007 | |
Ortofoto | actual | ort |
2009 | ort2009 | |
2008 | ort2008 | |
2007 | ort2007 | |
2006 | ort2006 | |
2005 | ort2005 | |
2004 | ort2004 | |
2002 | ort2002 | |
2001 | ort2001 | |
Pictometry | 2007 | pictometry |
Se pueden ver ejemplos de su uso en :"ejemplos del namespace osgeo".
Aplicación de ejemplo
Se puede ver una simple aplicación haciendo uso de esta API en: "aplicación de ejemplo".