Cómo importar una geometría concreta de OpenStreetMap a una base de datos PostgreSQL/PostGIS

En este artículo vamos a ver cómo podemos extraer una geometría concreta de la base de datos de OpenStreetMap en formato EWKT (Extended Well Know Text) para su posterior importación a una base de datos PostgreSQL/PostGIS.

Localizar la geometría a importar dentro de OpenStreetMap

Accediendo al sitio http://www.openstreetmap.org buscamos la geometría  que deseamos importar a nuestra base de datos. En nuestro ejemplo, vamos a importar la geometría que define la ciudad de Barcelona.

01.locate

De todos los resultados obtenidos para “Barcelona” seleccionamos la “ciudad” de Cataluña, España.
Tras pinchar sobre el resultado deseado, accedemos a otra pantalla como la que podemos ver en la siguiente imagen:

02.found


Extraer la geometría en formato EWKT

Entre la información que nos muestra la imagen anterior aparece el identificador de la relación Barcelona cuyo valor es 347950. Los polígonos dentro de OpenStreetMap se tratan como relaciones. Este valor identifica la geometría de la ciudad de Barcelona dentro de la base de datos de OpenStreetMap. Nos apuntamos ese valor y accedemos al sitio http://polygons.openstreetmap.org donde lo introducimos tal y como se muestra a continuación.

03.relation

Al pulsar sobre “Submit Query” nos aparece una nueva pantalla donde podemos seleccionar el formato en el que deseamos obtener la geometría. Seleccionamos WKT (Well Known Text) y obtenemos nuestra geometría en un formato legible donde se indica el sistema de referencia (SRID=4326), el tipo de geometría (MULTIPOLYGON) y un listado con todas las coordenadas que componen esa geometría.

04.format

05.EWKT

Ahora que conocemos las coordenadas de nuestra geometría, podemos utilizar la función de PostGIS St_GeomFromEWKT para insertar esa geometría a nuestra base de datos PostgreSQL/PostGIS. St_GeomFromEWKT recibe como parámetro de entrada una geometría en formato EWKT y retorna un objeto binario de tipo geometry que posteriormente podemos insertar en nuestra base de datos.

Suponiendo que disponemos de una tabla llamada barcelona con una columna geom que contiene datos de tipo geometry, podemos insertar nuestra geometría del siguiente modo:

INSERT INTO barcelona (geom)
VALUES (‘St_GeomFromEWKT (‘SRID=4326;MULTIPOLYGON(((2.0547371 41.4140393……
………..’);

Y si queremos generar la geometría, sin importarla, podemos utilizar la sentencia SQL:

SELECT St_GeomFromEWKT(‘SRID=4326;MULTIPOLYGON(((2.0547371 41.4140393……
………..
‘);

Anuncios

formaSIG, plataforma especializada en el aprendizaje de Software SIG Libre

formaSIG responde a la necesidad de formar profesionales de las soluciones libres en el ámbito de los SIG. Es una plataforma promovida por el Servicio de SIG y Teledetección (SIGTE) de la Universitat de Girona.

Los cursos permiten adquirir, ampliar o reforzar competencias profesionales en temáticas específicas del uso de los SIG de código abierto. A continuación se detalla la oferta formaSIG para este curso 2014-2015:

  • Uso de gvSIG en el Análisis Ambiental de zonas agrícolas

gvSIG es un software con unas elevadas prestaciones para la visualización, edición y análisis de información geográfica. Se trata de un software libre, que se distribuye bajo licencia GNU GPL y que en los últimos años ha experimentado un desarrollo extraodrinario, tanto en relación a las herramientas que ofrece, como en el número de usuarios que lo utilizan en todo el mundo.

Las distintas herramientas que ofrece gvSIG se orientan fundamentalmente al trabajo con datos vectoriales, con multitud de funciones que van desde la representacion y creación de datos a la edición topológica, pasando por un ámplio abanico de geoprocesos espaciales. Su combinación con la librería SEXTANTE, además, dota a gvSIG con mas de 200 algoritmos de análisis raster principalmente, pudiendo de este modo cubrir gran parte de las necesidades del trabajo con datos geoespaciales.

En el curso ‘Uso de gvSIG en el Análisis Ambiental de Zonas Agrícolas’ el alumno se introducirá en el uso de gvSIG y sus flujos de trabajo, y podrá practicar con algunas de las principales funcionalidades que este ofrece.

Más detalles

  • Análisis Geográfico con GRASS GIS

GRASS GIS es, a día de hoy, el decano en el mundo del software libre geoespacial y pasa por ser uno de los programas libres más potentes y versátiles.
Sus altas prestaciones y sus capacidades analíticas tanto en el trabajo con datos vectoriales como en el trabajo con datos raster, hacen de GRASS una excelente herramienta para desempeñar trabajos de análisis espacial o geográfico en muchos campos de aplicación, desde el análisis ambiental hasta el análisis de redes, pasando por la teledetección o la simulación de modelos.

GRASS, en combinación con QGIS, se convierte en un binomio de altas prestaciones y largo recorrido pues, mientras GRASS tiene su rendimiento máximo en el trabajo con datos ráster, algebra de mapas,… QGIS (producto libre, muy escalable y en constante evolución y crecimiento) se integra con GRASS a través de un plugin ofreciendo muchas funcionalidades y posibilidades en el trabajo con datos vectoriales, desde la captura y edición de datos, hasta la aplicación de geoprocesos.

Más detalles

  • Introducción a SQL Espacial con PostGIS

Las bases de datos espaciales se han convertido en una alternativa a los software SIG tradicionales y  SQL es el lenguaje que utilizan los SGBD para gestionar sus bases de datos tanto alfanuméricas como espaciales. Dentro del mundo del software libre PostgreSQL y su extensión espacial PostGIS se han convertido en el sistema gestor de bases de datos (SGDB) más extensamente utilizado a nivel mundial, siendo empleado en multitud de proyectos y aplicaciones SIG tanto de escritorio como web.

Este curso pretende familiarizarnos con el uso del lenguaje SQL en general, así como dar a conocer su potencia y funcionalidad y adentrarse especialmente en su componente espacial y consecuentemente en las funciones para el tratamiento y  manipulación de entidades geográficas vectoriales y el análisis de las relaciones existentes entre ellas dentro del entorno de PostGIS. El curso se centra exclusivamente en las funciones de análisis de datos vectoriales no incluyéndose el análisis raster

Más detalles

  • Introducción a la Teledetección con QGis GRASS

La Teledetección y los Sistemas de Información Geográfica son dos disciplinas estrechamente relacionadas. Las imágenes satelitales constituyen una importantísima fuente de datos a partir de las cuales se generan las bases de datos espaciales que alimentarán nuestro SIG. Por un lado los sensores remotos montados sobre los satélites captan características de la superficie que es muy difícil o costoso de extraer por otros medios. Por otro lado, las imágenes de satélite nos permiten obtener información de grandes extensiones del territorio en periodos cortos de tiempo, siendo el mejor método de obtención de datos lo más actualizados posible.

Este curso pretende introducir al alumno en los fundamentos básicos de la Percepción Remota así como en los principales pasos en el proceso de interpretación, corrección y análisis de imágenes satélites que permitirán su integración en un SIG. Todo ello desde un enfoque eminentemente práctico a través del software QGis y el plugin de GRASS, cuyo binomio  pasa por ser una de las soluciones geoespaciales de código abierto más potentes y versátiles que existen actualmente, gracias a sus altas prestaciones y capacidades analíticas.

Más detalles

  • Trabajando con OSM. Creación y publicación de datos espaciales libres

OpenStreetMap es un proyecto colaborativo para crear y proveer datos geográficos libres de alcance mundial. Esta iniciativa es un referente de cartografía participativa en la que personas de todo el mundo contribuyen a crear una base de datos geográfica libre a nivel mundial siendo hoy en día una importante fuente de datos de gran calidad en la mayor parte del planeta.

Este curso pretende dar a conocer el flujo de trabajo OpenStreetMap: empezando por la captura y adquisición de la información geográfica, hasta la edición y publicación de los datos para finalmente, dar a conocer los usos que podemos dar a esta cartografía.  Una de las  premisas principales del proyecto es que cualquier persona interesada puede contribuir al mapeo de OpenStreetMap, a la vez que es libre de utilizar los datos OpenStreetMap para múltiples proyectos y aplicaciones. El curso se centra básicamente en la edición de los datos geográficos a través de los editores Potlatch y JOSM.

Más detalles

 

Más información: Web formaSIG

 

Herramientas TIG para el análisis del comportamiento de turistas en la ciudad de Girona

Este post expone la metodología llevada a cabo en el marco de un estudio que pretende analizar el comportamiento de turistas en la ciudad de Girona. El objetivo del estudio es conocer las calles más transitadas y las zonas más visitadas de la ciudad por parte de los turístas que a diario recorren la ciudad. Para llevar a cabo este estudio se ha recogido, gracias a la colaboración de los turistas, más de 1000 tracks de GPS. Estos ficheros (en formato .gpx) contienen, con cierto margen de error, toda la información del itinerario que han realizado los visitantes de la ciudad (recorrido, tiempo impartido a lo largo del recorrido, etc) y son el punto de partida de este proyecto.

Un track es una relación ordenada de puntos, donde para cada punto, se conocen sus coordenadas (latitud y longitud) y la fecha (y hora) en que fue tomada cada coordenada.

La siguiente imagen muestra un fragmento del fichero track en formato gpx. A la izquierda se muestra el contenido del fichero track i a la derecha la representación gráfica del track sobre el callejero de la ciudad de Girona.

turistig-1

HERRAMIENTAS

Tras evaluar varias herramientas de trabajo, tanto herramientas privativas como de código abierto, se ha optado por importar los ficheros en formato .gpx a una base de datos PostgreSQL/PostGIS y utilizar las herramientas espaciales de PostGIS para desgranar, a partir de sentencias SQL, la información contenida en esos ficheros gpx.

METODOLOGÍA

El principal desafío del proyecto consiste, en descomponer cada track en una relación de calles (o arcos de calle) por las que se desliza cada track. De este modo se podrá conocer los tramos de las calles por las que pasa cada track y el tiempo invertido en cada uno de esos tramos.

La zona objeto de estudio se localiza en el casco antiguo de la ciudad de Girona. Un casco antiguo, como no, caracterizado por sus calles estrechas y ombrías que inducen a una mala cobertura satelital. Por este motivo, una vez importados los tracks a la base de datos se procederá a la asignación de cada punto del track a su calle más cercana mediante una operación de snap y una tolerancia de 7 metros.

La siguiente imagen muestra los puntos de track y las calles asignadas a cada punto.

turistig-2

Los pasos seguidos en este proyecto son los que se detallan a continuación:

1. Importación y reproyección de los fichero .gpx (track GPS) a coordenadas proyectadas.

2. Importación de un callejero a la base de datos

3. Asignación de los puntos de track sobre el callejero.

4. Presentación de los resultados.

 

1.- Importación de los ficheros .gpx (track GPS) a la base de datos

Para la importación de los ficheros .gpx se ha utilizado la herramienta ogr2ogr. Desde una consola de comandos tecleamos el siguiente comando para importar el fichero track.gpx a la tabla track dentro de la base de datos TURISMO.

ogr2ogr -f “PostgreSQL” PG:”host=localhost user=postgres port=5433 dbname=TURISMO schemas=originals password=contraseña” track.gpx -overwrite -lco GEOMETRY_NAME=geom track_points -nln “track”

Este comando, utiliza el usuario postgres y su contraseña para conectarse a la base de datos TURISMO. Una vez conectado genera una nueva tabla track con toda la información contenida en el fichero track.gpx.

turistig-3

La imagen anterior muestra un framento del contenido de la tabla track tras su importación. El campo gid actúa como clave primaria y sirve para identificar inequívocamente cada punto de la tabla. Este atributo será utilizando posteriormente en nuevas sentencias SQL. La geometría de los puntos se encuentra en la columna geom mientras que la columna time contiene tanto la fecha como la hora en que se tomó cada punto del track.

La importación masiva de los más de 1000 ficheros gpx se lleva a cabo mediante un fichero de comandos (.bat). Este fichero de comandos se genera a partir de un script que lee el contenido de una carpeta (donde se encuentran los tracks) y genera una sentencia de importación para cada fichero .gpx.

Una vez importado cada track es necesario reproyectarlo de coordenadas geográficas (GPS) a coordenadas proyectadas (UTM). Este paso es obligado para poder realizar una posterior operación de Snap indicando una tolerancia en unidades métricas (propias de las coordenadas proyectadas).

Con la siguiente sentencia SQL se crea una nueva tabla con todas las columnas iniciales, más el contenido de la geometría reproyectado al sistema de referencia ETRS89 (srid = 25831)

create table track_reproyectado as

select st_transform(geom,25831) as geom_reproyectada, track.* from track;

2.- Importación de un callejero a la base de datos

Para llevar a cabo este ejercicio es necesario importar a la base de datos un callejero de la zona de estudio. La característica principal de este callejero es que, todas y cada una de las calles que lo componen, estan descompuestas en sus distintos tramos. Cada tramo de cada calle se representa por una entidad espacial propia. Es decir, una misma calle se descompone en tantos tramos como intersecciones tenga con otras calles. Este tipo de callejero permite detectar por qué tramo de una calle pasa cada track, pudiendo discriminar los tramos de la misma calle por los que no pasa.

La siguiente imagen muestra, en rojo, los puntos de intersección entre calles. Los distintos tramos de una misma calle aparecen en un mismo color.

turistig-4

Partiendo de un callejero de este tipo, en formato shp, se ha utilizado la herramienta shp2pgsql (incluida en PostGIS) para importarlo a la base de datos.

Desde una consola de comandos ejecutamos:

Shp2pgsql callejero_shape tabla_callejero > callejero.sql

Este comando generará el fichero callejero.sql con el contenido del fichero .shp traducido a expresiones SQL. El siguiente paso consiste en ejecutar el fichero callejero.sql dentro de la base de datos ‘TURISMO’. Para ejecutar el fichero podemos hacerlo desde pgAdmin o bien, desde una consola de comandos, utilizar el cliente interactivo de linea de comandos de PostgreSQL llamado psql tal y como se muestra a continuación.

psql -d TURISMO -U postgres -W -f callejero.sql

Este comando solicitará la contraseña del usuario (-U) correspondiente.

3.- Asignación de los puntos de track sobre el callejero

Cada punto localizado en el track del GPS debe ser asignado a la calle más próxima. De este modo podremos generar un listado con los nombres de las calles por los que se desplaza el track. Únicamente se han asignado los puntos de track que se encuentran a un máximo de 7 metros de alguna calle. Es resto de puntos ha sido descartado.

Para asignar cada punto del track a una calle se ha ejecutado el siguiente comando SQL inspirado en el post de Paul Ramsey (http://blog.cleverelephant.ca/2008/04/snapping-points-in-postgis.html):

create table track_callejero as

        select distinct on (punto_id) c.gid as calle_id, tp.gid as punto_id

             from track_reproyectado tp

             inner join callejero c on st_DWithin(tp.geom, c.geom, 7.0)

         order by tp.gid, st_Distance(c.geom, tp.geom);

Este comando calcula, para cada punto del track, qué calles están a menos de 7 metros. Si un punto del track tiene más de una calle a menos de 7m, entonces las ordena para que la calle más cercana aparezca en primer lugar. Finalmente, la cláusula distinct(punto_id) indica que solo queremos obtener una calle para cada punto. El hecho de haber ordenado previamente las calles hace que cada punto del track queda asignado, únicamente, a su calle más cercana.

El resultado de la sentencia anterior es una nueva tabla track_callejero que relaciona cada punto del track con la calle más próxima. La relación entre puntos y calles se realiza a partir de los atributos alfanuméricos (gid) que identifican cada punto y cada calle. Estos atributos ‘gid‘ se renombran, respectivamente, a punto_id y calle_id para facilitar su interpretación.

turistig-5Las calles del listado anterior que recogen menos de 5 puntos han sido obviadas del resultado final. De este modo obviamos algunos tramos poco representativos del itinerario seguido por el track.

4.- Presentación de los resultados

Después de obtener las calles por las que pasa el track podemos también averiguar el orden en el que se han visitado las calles y cuanto tiempo se ha invertido en cada calle.

Para extraer esta información es necesario crear una función PL/PSQL denominada ‘itinerario‘. El resultado devuelto por esta función es una estructura de datos en forma de array. Cada elemento del array contiene tres variables: calle_id, punto_id y contador. Siendo contador la variable utilizada para contar cuántas veces un mismo track cruza por la misma calle.

CREATE OR REPLACE FUNCTION itinerario(_tbl character varying, _col1 character varying, _col2 character varying)

RETURNS SETOF integer[] AS $$

DECLARE

        ultima_calle integer;

        contador integer;

        fila RECORD;

        r boolean;

BEGIN

FOR fila IN EXECUTE ‘SELECT ‘ || quote_ident(_col1) || ‘ as calle_id, ‘ || quote_ident(_col2) || ‘ as punto_id FROM ‘ || quote_ident(_tbl) || ‘ ORDER BY ‘ || quote_ident(_col2)

         LOOP

         IF ultima_calle IS NULL THEN

             ultima_calle:= fila.calle_id;

             contador:= 0;

         ELSE

             IF ultima_calle != fila.calle_id THEN

                     ultima_calle:= fila.calle_id;

                     contador:=contador+1;

             END IF;

         END IF;

         RETURN next ARRAY[ fila.calle_id, fila.punto_id, contador];

END LOOP;

END

    $$ LANGUAGE plpgsql VOLATILE;

Como se aprecia la función itinerario recibe tres parámetros. Estos son el nombre de la tabla y los nombres de las columnas que contienen los identificadores de los puntos y de las calles. Estos tres parámetros se corresponden con la tabla track_callejero creada anteriormente.

Con la estructura de datos devuelta por la función itinerario podemos obtener una relación del primer y último punto que pasa por cada calle. Para ello ejecutamos el siguiente comando:

create table itinerario_seguido as

         SELECT calle_id, MIN(punto_id) as primer_pt_id, MAX(punto_id) as ultimo_pt_id FROM (

                 SELECT ar[1] calle_id, ar[2] punto_id, ar[3] contador from (select itinerario(‘track_callejero’,’calle_id’,’punto_id’) ar) as fo

               ) as foo

         GROUP BY calle_id, contador

         ORDER BY contador;

Y obtenemos una nueva relación como la que se aprecia en la siguiente imagen.

turistig-6Con esta nueva tabla podemos, finalmente, calcular el tiempo invertido en cada calle. Para ello utilizamos el tiempo transcurrido entre el primer y último punto de cada calle.

Select calle_id, (t2.time – t1.time) as tiempo_invertido_en_calle

from track t1, track t2, itinerario_seguido i

where i.primer_pt_id= t1.gid and i.ultimo_pt_id = t2.gid;

turistig-7

Referencia: metodología llevada a cabo por el SIGTE en el marco del proyecto MINECO del grupo de investigación LMRT del INSETUR

Cosas que hacer en compañía de OSM (IV)

Tematización de datos

En este cuarto post hablaremos del proceso de generación de mapas con datos de OpenStreetMap (OSM) utilizando un estilo personalizado, para posteriormente servirlos a través de un geoservicio WMS. Para ello, se hará uso de PostGIS, TileMill, OSM Bright y mbtiles.

Almacenar en PostGis los datos de OSM

Antes de empezar a tematizar y generar un mapa con datos procedentes de OSM, hay que determinar el lugar en que almacenar estos datos. Dado que el volúmen de información con el que se trabaja suele ser muy grande, una de las formas más eficientes para ello es utilizar una base de datos espacial, como PosGIS.

Desde el sitio web http://metro.teczno.com pueden descargarse datos de OSM en formato .pbf, que podrán ser importados a una tabla de PostGIS con Imposm (http://imposm.org/docs/imposm/latest/). También podrían usarse datos en formato .osm descargados de cloudmade (http://downloads.cloudmade.com/).

Diseño del mapa con TileMill

TileMill es un software que permite el diseño cartográfico, de forma rápida y eficaz, de los datos procedentes de OSM almacenados en la base de datos PostGIS. Presenta una ventaja comparativa muy grande en relación a las herramientas de tematización y diseño que ofrecen en general los paquetes SIG, al ser mucho más ágil y permitir un amplio abanico de posibilidades. Los mapas generados pueden llegar a presentar un nivel de calidad muy elevado. Además, con TileMill pueden desarrollarse estilos e irlos reaprovechando.

El principal inconveniente de TileMill está en la elaboración de los estilos. Estos deben crearse para cada una de las entidades que configuran la cartografía, y para cada uno de los niveles de zoom con los que se quiera representar. Todo ello implica un trabajo laborioso, al que habrán de destinarse algunas horas de trabajo si quiere conseguirse un mapa original y estético.

El lenguaje con el que se configuran los estilos en TileMill es CartoCSS, muy similar al CSS.

Las fuentes de datos que admite TileMill son las siguientes: CSV, Shapefile, GeoJSON, KML, GeoTIFF, SQLite y PostGIS. El abanico es muy amplio, por lo que no debería haber problemas para crear mapas con los datos generados desde un Sistema de Información Geográfica (SIG).

Hay que tener en consideración que los mapas generados con TielMill se proyectan siempre a ‘Web Mercator‘, y en caso que las fuentes de datos utilizadas no estén en este sistema de referencia, TileMill las reproyectará automáticamente.

 Finalmente, una vez desarrollado el mapa desde TileMill, este puede exportarse a MBTiles, PNG, PDF y SVG. De todos ellos, el formato más eficiente para publicar el mapa en entornos web o móviles es MBTiles. También para poder servir el mapa generado a través de un WMS.

Toda la información acerca del proyecto TielMill, así como el archivo para su instalación (tanto en entornos Windows, Linux y Mac OS X), se encuentra en http://mapbox.com/tilemill/

Aplicar el estilo de OSM Bright

OSM Bright (https://github.com/mapbox/osm-bright) es una plantilla de estilos predefinida para TileMill diseñada para la tematización de datos de OSM. El uso de OSM Bright es de gran utilidad, ya que evita el proceso de creación de estilos para cada una de las entidades de la cartografía, y para cada uno de los niveles de zoom. Asimismo, y en caso de querer diseñar un estilo único y personalizado, el uso de esta plantilla resulta un buen punto de partida a partir del cual ir haciendo modificaciones.

 En la página web del proyecto TileMill se detalla todo el proceso a seguir para descargar y configurar OSM Bright, y poder utilizarlo en la tematización de nuestros datos de Open Street Map almacenados en una base de datos PostGis: http://mapbox.com/tilemill/docs/guides/osm-bright-ubuntu-quickstart/

Apuntar que el proceso de carga en TileMill de los datos de OpenStreetMap tematizados con los estilos de OSM Bright se demora bastante tiempo. Esto ocurre la primera vez, y dependiendo del volumen de datos con los que se trabaje. Luego el proceso es mucho más rápido.

osm_bright

Fig 1. Mapa con estilo de OSM Bright

Servir el mapa generado como WMS

Para servir el mapa generado con TileMill a través de un servicio Web Map Service (WMS), una buena opción es utilizar MapProxy (http://mapproxy.org/). MapProxy es un proxy de código abierto que ofrece soluciones de cacheado, aceleración y transformación de datos geoespaciales tanto para entornos web como de escritorio. De este modo, los tiles generados con TileMill y guardados en el formato mbtiles pueden servirse como un WMS.

MapProxy es multiplataforma, y su proceso de instalación y configuración está muy bien documentado en la misma página web del proyecto: http://mapproxy.org/docs/1.5.0/

Los parámetros de configuración para servir mbtiles también están especificados: http://mapproxy.org/docs/1.5.0/caches.html#mbtiles

Conclusión

Siguiendo este proceso, se consigue disponer de un servicio WMS con datos de OpenStreetMap y con un estilo personalizado. A partir de ahí, puede aprovecharse este WMS como base cartográfica para la generación de mapas desde un Sistema de Información Geográfica.

esquema

Fig 2. Esquema del proceso