Procesamiento y transformación de datos

Este artículo aloja la organización y contenidos del taller sobre procesamiento y transformación de datos que se impartirá en Informatica 2009, a través de la participación de OSGeo-es. Visita la página de OSGeo en Informatica 2009 para ver todos los talleres y ponencias que se pretenden impartir.
==Resumen del taller==
El taller Procesamiento y transformación de datos pretende ser un punto de entrada para el resto de los talleres, al tiempo que permita a los asistentes tener una visión general de algunas de las herramientas enfocadas al procesado de datos de las que dispone OSGeo. Se pretende captar y procesar datos que estén en el domínio público y adaptarlos para que puedan ser usados con herramientas de SIG.
Se revisarán los objetivos de Openstreetmap y se emplearán los datos que se habrán captado en la Fiesta del mapa y estén ya incorporados a los servidores de OSM. Se revisarán las herramientas de conversión del formato XML de OSM a GML. Se convertirán los datos a formato SHP y se incluirán en una base de datos PostGIS donde se realizarán diversas transformaciones.
==Objetivos==
Los objetivos en función de los tipos de conocimientos a adquirir en este taller son:
* Contenidos conceptuales (qué es)
** Conocer el proyecto OSM
** Conocer la herramienta OGR
** Conocer PostGIS y porj4
* Procedimientos (cómo hacer)
** Obtener cartografía de OSM
** Transformarla a diversos formatos empleando ogr2ogr
** Realizar consultas en PostGIS para optimizar los resultados
==Agenda==
El taller tendrá lugar el lunes 9 de febrero de 2009 de 9 a 11 (am) zona horaria de América/La Habana.
==Contenidos==
=== Introducción a OpenStreetMap ===
OpenStreetMap es un proyecto colaborativo para crear mapas libres y editables. Se dice que OSM es a lo mapas, como la Wikipedia a las enciclopedias. Actualmente hay más de 75000 usuarios registrados (12% realmente activos) que generan unos 3 MB de información al día que se registra en una base de datos cuyo tamaño aproximado es de 100 GB.
La página principal de OSM es http://www.openstreetmap.org/ donde puede verse el mapa que generan los usuarios. La comunidad se organiza a través de una wiki cuya dirección es http://wiki.openstreetmap.org/
El proyecto es propiedad de la Fundación OpenStreetMap cuyo objetivo es <<fomentar el crecimiento, desarrollo y distribución de datos geoespaciales libres y a proveer datos geoespaciales a cualquiera para usar y compartir>>. Los datos tienen una licencia Creative Commons Attribution-ShareAlike 2.0.
==== História ====
El proyecto nace de la mano de Steve Coast en 2004 que por discrepancias personales con la gestión cartográfica y los precios del organismo británico Ordnance Survey decide crear una base de datos cartográfica accesible a todos los públicos. 
En 2006 el proyecto toma forma de fundación sin ánimo de lucro y en ese mismo año Yahoo autoriza a la fundación a utilizar su capa de imágenes aéreas de todo el mundo para que los usuarios puedan digitalizar información sobre ellas. 
En 2007 la empresa Automotive Navigation Data (AND) dona sus datos de los Países Bajos y de las principales carreteras de la India y China a la fundación y además se incorpora la información de TIGER (Censo de EEUU). 
En 2008 la aparece la empresa CloudMade con el objetivo de explotar comercialmente la información del proyecto y que dona a la fundación 2,4 Millones ; en ese mismo año la iniciativa pública canadiense GeoBase.ca dona sus datos de Canadá al proyecto.
==== Procedimiento ====
Los mapas se realizan siguiendo 5 pasos:
# Toma de datos
# Subida de datos a los servidores de OSM
# Edición gráfica de los datos
# Edición alfanumérica de los datos
# Renderizado de los mapas
===== Toma de datos =====
Los datos se recopilan por observación directa, preferentemente empleando GPS, aunque pueden emplearse otros medios como fotografía aérea si los derechos de la imagen lo permite. Aún así el proyecto recomienda conocer y recorrer la zona personalmente para garantizar la máxima calidad del resultado.
Los orígenes más comunes de datos son:
* Trazas GPS, resultado de recorrer la zona usando un dispositivo GPS que almacene dicha información.
* Imágenes de Yahoo, Landsat o el NPE (Ordnance Survey New Popular Edition) y en general cualquier imágen cuyos derechos de autor hayan sido expresamente cedidos, se hayan extinguido o estén en el dominio público.
* Mapas e información de los usuarios. Siempre que se trate de información en el dominio público o cuyos derechos de autor hayan sido expresamente cedidos.
* Información prévia existente que requiera ser incluida en un mapa.
===== Subida de datos a los servidores de OpenStreetMap =====
Una vez recopilada la información, esta debe ser incorporada a la base de datos de OSM. Para ello existen diversos médios, aunque principalmente se emplea el cliente web Potlach y el cliente de escritorio JOSM.
En cualquier caso lo más frecuente es convertir los datos al formato estándar GPX y subirlos posteriormente al repositorio de trazas GPS de OSM de forma que cualquier usuario pueda acceder a dicha información.
===== Edición gráfica de los datos =====
Empleando alguna de las aplicaciones que lo permiten; como Potlach, JOSM o Merkaartor por ejemplo; se descarga del servidor la porción de información que se quiere editar, para que esta se ajuste a los estándares acordados en el proyecto.
OpenStreetMap solo reconoce 3 tipos de datos:
* Nodos Son elementos puntuales
* Vías Conexiones lineales entre nodos.
* Vías cerradas Vías que empiezan y acaban en el mismo nodo y definen una forma poligonal.
===== Edición alfanumérica de los datos =====
El modelo de datos alfanuméricos de OSM se basa en el uso de etiquetas tags consensuadas por los usuarios a través de la wiki del proyecto. 
Las etiquetas se definen por un par clave/valor. Actualmente hay más de 100 claves "oficialmente" reconocidas y varias decenas propuestas.
Esta información adicional alfanumérica permite clasificar los datos para que el proceso de renderizado los muestre correctamente representados.
===== Renderizado de los mapas =====
El proyecto OSM tiene tres motores de renderizado que permiten obtener una imagen de la información de la base de datos.
* Kosmos Pensado para ser usado por los usuarios en local tiene limitaciones en cuanto al tamaño que puede renderizar.
* Osmarender En realidad se trata más bien de un conjunto de reglas XLST que genera SVG.
* Mapnik Toma los datos y los carga en un PostGIS para posteriormente renderizar tiles de 256x256.
Actualmente algunos programas permiten cargar datos OSM directamente, como por ejemplo gvSIG aunque haciendo uso de un conector no oficial.
=== Obteniendo los datos de OpenStreetMap ===
En este taller no se contempla la subida de datos a OSM, si no cómo obtener los datos una vez estos están en los servidores del proyecto.
Revisaremos cómo obtener los datos directamente desde la web de OSM empleando la pestaña habilitada para ello y también cómo hacerlo a través del programa JOSM.
También daremos un rápido vistazo al formato XML de OSM.
==== Pestaña Export de la web de OpenStreetMap ====
A través del mapa de la página web de OSM podemos navegar hasta la localización de la que nos interese obtener datos
Una vez allí activamos la pestaña de Export que habilita las opciones de exportación.
La primera opción es el área a exportar, por defecto nos muestra las coordenadas de la pantalla.
La siguiente opción es el formato de exportación donde se nos ofrecen los siguientes opciones:
* Formato XML de OSM
* Imagen renderizada por Mapnik
* Imagen renderizada por Osmarender
* Código HTML par embeber en web
Por último veremos el recordatorio de la licencia y el botón Export que nos permitirá la descarga de los datos.
Al seleccionar el formato XML y darle al botón comenzará la descarga de los datos en pantalla a un archivo llamado map.osm.
==== JOSM ====
JOSM es el acrónimo de Java OpenStreetMap Editor, se trata de una aplicación multiplataforma desarrollada por Immanuel Scholz y Frederik Ramm. Es el editor preferido por la comunidad OSM, ya que tiene muchas funcionalidades implementadas y permite editar gran cantidad de datos, aunque su curva de aprendizaje puede resultar un poco pronunciada al inicio.
JOSM trabaja por defecto con archivos de formato XML de OSM (archivos .osm). Para obtener un archivo de la zona con la que se quiere trabajar hay que pulsar el botón de Descarga de datos del servidor, el cuarto por la izquierda en la barra de menú principal. Al pulsar el botón se muestra una interfaz donde se puede seleccionar la porción de datos que quiere obtenerse.
El servidor limita las peticiones que cubran gran extensión para no colapsar el servicio, pero si se requiere gran cantidad de datos se pueden realizar diversas peticiones que acabarán almacenándose en un solo fichero.
Una vez seleccinada la zona y aceptada la petición por el servidor creará una capa que aparecerá en lado izquierdo de JOSM. Pulsando con el botón derecho sobre el nombre de la capa nos permitirá almacenar la capa con la ruta y nombre de archivo deseados.
==== OSM XML Data: el formato OpenStreetMap ====
Todo el taller se basa en la versión 0.5 de la API del OSM XML sin embargo entre el 20 y el 23 de marzo de 2009 se procederá al cambio de versión entre la 0.5 y la 0.6. este cambio hará incompatibles los métodos descritos a continuación, hasta que la comunidad modifique el código de las aplicaciones y los scripts y vuelvan a ser funcionales.
Toda la API de OSM está basada en arquitectura RESTFul y reconoce tres elementos:
* Nodos
* Vías
* Relaciones
Los Nodos tienen informacíon como:
* id el identificador
* lat y lon la posición geográfica en EPSG4326
* visible boolean que determina la visibilidad
* user usuario que creó el nodo
* timestamp marca de tiempo de creación
Además el Nodo puede contener información asociada al estilo OSM a traves de pares key/value
<node id="156804" lat="61.8083953857422" lon="10.8497076034546" visible="true" timestamp="2005-07-30T14:27:12+01:00">
 <tag k="tourism" v="hotel" />
 <tag k="name" v="Cockroach Inn" />
</node> 
Las Vías son agrupaciones de nodos que tienen información como:
* id el identificador
* visible boolean que determina la visibilidad
* user usuario que creó el nodo
* timestamp marca de tiempo de creación
Debe tener una lista de nodos agrupados en la etiqueta XML nd con la referencia id de los nodos que agrupa.
Además la Vía puede contener información asociada al estilo OSM a traves de pares key/value
<way id="35" visible="true" timestamp="2006-03-14T10:07:23+00:00" user="johnz">
 <nd ref="156804"/>
 <nd ref="156805"/>
 <nd ref="156806"/>
 <tag k="highway" v="secondary"/>
</way>
Por último las Relaciones, que son objetos en si mismas, que sirven para definir relaciones entre cualquier tipo de objeto. También tienen información como:
* id el identificador
* visible boolean que determina la visibilidad
* user usuario que creó el nodo
* timestamp marca de tiempo de creación
Y además en una etiqueta XML member definir atributos type, ref y role que permiten configurar la relación.
<relation id="77" visible="true" timestamp="2006-03-14T10:07:23+00:00" user="fred">
 <member type="way" ref="343" role="from" />
 <member type="node" ref="911" role="at" />
 <member type="way" ref="227" role="to" />
 <tag k="type" v="turn_restriction"/>
</relation>
=== Conversión de formatos ===
El formato XML utilizado por OSM no sigue ningún estándar. Para poder utilizar los datos de OSM como fuente de información en cualquier trabajo, es necesario transformarlos a otro formato que sí sea interoperable.
A continuación se revisarán diversos métodos de transformación de la información.
==== Conversión a GML ====
Para la conversión de los datos OSM a GML emplearemos algunos de los métodos que están descritos en el wiki de OSM a partir de las indicaciones de Chris Schmidt y Schuyler Erle, ambos miembros de OSGeo.
Una vez la información está en GML es fácil utilizarla o convertirla a otros formatos.
===== Usando Python 2.4 =====
A través de un script en Python de Christian Zietz basado en un script de Chris Schmidt y Schuyler Erle, podremos transformar la información de OSM a GML.
En linux la transformación es inmediata tecleando:
cat map.osm | ./osm2gml.py > salida.gml
Por defecto el script solo exportará las Vías. Si queremos además que exporte los Nodos hay que modificar la variable que se encuentra en la línea 9 del script original.
exportNodes = 1
Sin embargo, si queremos usar el script en Windows, habrá que realizar algunos cambios.
====== Modificado para Windows ======
Al parecer el espacio de nombres del paquete ElementTree no es igual para Windows que para Linux. En el script tendremos que sustituir la línea
from xml.etree.cElementTree import Element, SubElement, ElementTree
por esta otra
import elementtree.ElementTree as ET
Después añadir a todas las llamadas a las funciones de ElementTree la partícula ET.
Por último sustituir en la penúltima línea la referencia a stdin por una referencia a argv de forma que la línea quede así:
xml.sax.parse(sys.argv[1],osmParser)
De esta manera, en vez de hacer un cat, se le pasa el archivo como parámetro al script.
Puede encontrarse una versión modificada del script aquí que debería funcionar en Windows teniendo instalados los paquetes necesarios.
==== Utilizando GPSBabel ====
GPSBabel es una herramienta de Software Libre para la transformación entre formatos de datos GPS.
Empleando este método transformaremos los datos del formato OSM a GPX. Por este método se puede obtener la geometría pero con muy pocos datos asociados.
En este caso se puede realizar la transformación tecleando en la consola la siguiente instrucción.
gpsbabel -i osm -tag -f map.osm -o gpx -F mapa.gpx
Una vez la información está en GPX es fácil utilizarla o convertirla a otros formatos.
==== Utilizando OGR ====
OGR es una parte de la librería GDAL escrita en C++, que provee acceso de lectura, y en algunos casos escritura, a formatos vectoriales.
Se trata de diversos binarios que permiten obtener información de capas, cambiar entre formatos e indexar capas, aunque nos centraremos en el conversor de formatos llamado ogr2ogr.
NOTA en Windows antes de usar ogr2ogr hay que cargar unas variables de entorno a traves de un script bat.
C:\programa\FWTools2.1.0\setfw.bat
Usaremos ogr2ogr para realizar las transformaciones desde GML o GPX hacia Shape o PostGIS.
ogr2ogr -f 'ESRI Shapefile' cuba.shp cuba.gml
ogr2ogr -f 'PostgreSQL' PG:'host=localhost user=gcarto password=******** dbname=Cuba' cuba.gml
ogr2ogr -f "ESRI Shapefile" -overwrite prueba.shp prueba.gpx
Recordar que si hemos cambiado la variable de osm2gml para la exportación de nodos tendremos varios shapefiles.
==== gvSIG ====
gvSIG es uno de los proyectos punteros de SIG en el mundo del software libre. El software por si tiene un driver que permite leer directamente archivos GML, así que una vez obtenido el GML ya puede leerse directamente
Además gvSIG, haciendo uso de un conector no oficial, programado por Luis W. Sevilla, puede leer directamente archivos OSM.
Una vez cargada la información en gvSIG pueden usarse sus capacidades para exportar las capas de información.
=== Referencias y enlaces de interés ===
Página principal de OpenStreetMap: 	http://www.openstreetmap.org/
Wiki de OpenStreetMap: 	http://wiki.openstreetmap.org/
Información sobre Potlach: 	http://wiki.openstreetmap.org/wiki/Potlatch
Información sobre JOSM: 	http://wiki.openstreetmap.org/wiki/JOSM
Información sobre Merkaator: 	http://wiki.openstreetmap.org/wiki/Merkaartor
Etiquetas aceptadas por la comunidad OSM: 	http://wiki.openstreetmap.org/wiki/Tags
Exportación vía web de OSM: 	http://openstreetmap.com/export/
API de OSM versión 0.5: 	http://wiki.openstreetmap.org/wiki/OSM_Protocol_Version_0.5
Página sobre conversión de OSM a GML: 	http://wiki.openstreetmap.org/wiki/Converting_OSM_to_GML
Script en Python versión de Linux: 	http://www.chzsoft.com.ar/geo/osm2gml.py.txt
Script en Python versión de Windows: 	http://vehrka.googlepages.com/osm2gml.py
Página principal de GPSBabel: 	http://www.gpsbabel.org/
Página principal de OGR: 	http://www.gdal.org/ogr/
Página principal de GDAL: 	http://www.gdal.org/
Página principal de gvSIG: 	http://www.gvsig.org/
Conector no oficial para gvSIG de GPX y OSM:	http://forge.osor.eu/projects/gvsig-poc/
==Enlaces==
* Web de Openstreetmap: http://www.openstreetmap.org/
* Herramienta ogr2ogr: http://www.gdal.org/ogr/ogr2ogr.html
Category:Cursos