Working effectively with legacy code

Hace poco he terminado de leer Working effectively with legacy code, de Michael Feathers, un libro clásico de programación y, como me ha gustado mucho, me he decidido a compartir unas notas sobre él, por si a alguien le pica el gusanillo de leerlo. Forma parte de la colección «Robert C. Martin Series», en el que existen otros libros muy interesantes.

LegacyCode

Es un libro muy práctico, especialmente si programas con orientación a objetos, pero su título quizá es poco afortunado. En realidad, se trata de un libro que habla sobre todo de Tests y Refactoring, y de cómo usar ambas técnicas para trabajar con Legacy Code («código legado»), algo que muchos programadores tratan de evitar siempre que pueden.

El libro está organizado en tres bloques:
  1. Las mecánicas del cambio: en el que presenta unos conceptos generales y herramientas de trabajo.
  2. Cambiando el software: un «catálogo de recetas» ante problemas concretos
  3. Técnicas para romper dependencias

LAS MECÁNICAS DEL CAMBIO

El libro comienza hablando de las causas principales que motivan los cambios en un software: añadir una funcionalidad, corregir un error, mejorar el diseño u optimizar el uso de un recurso.

De aquí me quedo con una reflexión que hace el autor, que me parece muy valiosa, y es que da igual la causa final, probablemente el mayor reto para el programador será mantener el comportamiento existente, algo que ilustra con esta imagen

ExistingBehaviour

Sobre la forma en la que habitualmente hacemos los cambios, el autor critica lo que ya conocemos: muchas veces se usa el arriesgado «Edit and Pray» (editar el código y rezar porque nuestro esfuerzo sea acertado), cuando lo más adecuado sería aplicar «Cover and Modify», es decir cubrir primero el código con tests y, solo después, comenzar a modificarlo.

Los test cumplen aquí una doble misión: actuar como red de seguridad y proporcionar un feedback rápido sobre nuestro conocimiento del sistema, el cual crecerá con ellos.

De hecho, la definición de «Legacy Code» por parte del autor es «un código Legacy es aquel que no tiene tests» (y por tanto es difícil de modificar), algo que si nos paramos a pensar tiene todo el sentido del mundo. Tener buenos tests en un proyecto es una señal de su salud, pero la realidad es que muchas veces no existen y que añadirlos no es fácil. Entonces ¿cómo comenzar a trabajar con un código sin tests e incorporarlos?

El libro sugiere seguir estos pasos:
  • 1. Identificar los puntos de cambio: busquemos primero donde debemos cambiar el código para cumplir nuestros objetivos.
  • 2. Encontrar puntos donde crear tests: hay que valorar los más adecuados para probar los cambios en marcha (no podemos empezar probando todo indiscriminadamente).
  • 3. Romper las dependencias: éstas suelen ser el principal obstáculo para crear los tests. Para eliminarlas, los objetos de tipo fake / mock pueden sernos muy útiles. Nos servirán no solo para separar las clases que queremos probar sino también para sentir a través de ellos que el comportamiento del objeto bajo test es el adecuado.
  • 4. Escribir los tests: si se trata de cubrir primero código existente, con un comportamiento no evidente, podemos crear tests de caracterizacion, que simplemente describen lo que hace actualmente ante unos inputs y nos permitirán detectar si cambiamos involuntariamente su comportamiento más adelante. Otro concepto interesante para los tests es el de «costura» o seam: un lugar en el que se puede «modificar» el comportamiento de un método sin tocar su código. Por ejemplo si el método recibe como parámetro un objeto e invoca un método suyo, podríamos en un test pasar una instancia de ese objeto en el que el método haya sido reescrito, a conveniencia del test.
  • 5. Hacer cambios  y refactorizar, apoyados en herramientas de refactoring automático.

CAMBIANDO EL SOFTWARE
Este bloque del texto sigue un modelo de «recetas», planteando consejos y técnicas de refactoring a una lista extensa de problemas. Por citar algunos de los ejemplos:
  • ¿Cómo añado una funcionalidad?
  • Necesito hacer un cambio, pero no se qué tests escribir
  • Mi aplicación es todo llamadas a un API
  • ¿Cómo sé que no estoy rompiendo nada?

TÉCNICAS PARA ROMPER DEPENDENCIAS

Presenta varias técnicas de forma detallada y con código de ejemplo, algunas adaptadas del libro Refactoring, de Martin Fowler. Técnicas que, una vez aplicadas, rompen dependencias y favorecen la creación de tests.

Algunas de ellas son por ejemplo:
  • Extraer interfaz: si una clase existente es conflictiva para un test, podemos derivar de ella un interfaz y acoger selectivamente algunos de sus métodos. De esta forma, luego podremos sustituirla por otra clase que implemente ese mismo interfaz, pero que incluya las modificaciones del comportamiento que nos interesen.
  • Parametrizar un constructor: si una dependencia se crea dentro de un constructor, una solución sencilla es exponer ese objeto como parámetro. Esta misma técnica puede generalizarse también a métodos comunes.
  • Crear una subclase y sobreescribir un método: es una técnica potente, basada en usar herencia dentro de un test, para anular o modificar con una subclase la porción de comportamiento que nos interese. Personalmente me parece una técnica muy útil y que no conocía.

En resumen, creo que el libro merece la pena por el mensaje que trasmite: Legacy no es «un código que otro ha hecho mal hace mucho tiempo», puede ser un módulo que acabamos de escribir nosotros mismos sin crear unos tests asociados. Y es valioso también por el catálogo de recetas del segundo bloque, algo a lo que personalmente seguro que volveré buscando consejo en el futuro.
Si te enfrentas a actualizar un sistema antiguo, sin duda éste es un libro muy útil para ti.
Saludos

Jornadas SIG Libre Girona 2017

La semana pasada tuve la suerte de poder acudir de nuevo a las Jornadas de SIG Libre de Girona, en su edición nº 11, esta vez presentando un desarrollo técnico. Aquí está el programa completo de las Jornada, como referencia: http://www.sigte.udg.edu/jornadassiglibre/programa/ (colgarán más adelante los vídeos de las ponencias). Estaba revisando mis notas, para hacer balance y compartirlo con mis compañeros, pero he pensado que quizá sería más interesante hacerlo públicamente, así que aquí están.

jsl11-Girona2017

Ponencias plenarias

Tras la apertura oficial por parte de la Universidad, comenzaron las Jornadas con la presencia de Rosa M. Badia (Barcelona Supercomputing Center – BSC). Dejando de lado las cifras brutales de cálculo previstas para el Mare Nostrum 4, lo que me llamó la atención fue la importancia que le prestaba no al hardware, sino a los modelos de programación y cómo indicaba la mezcla progresiva, en enfoques y herramientas, entre Supercomputación y BigData. Aunque no hubo referencia alguna a temas geoespaciales, Rosa citó PyCOMPSs un framework libre en Python para favorecer el desarrollo de modelos en paralelo en estos entornos, el cual parece interesante.

A continuación Lluís Sanz (Instituto Municipal de Informática del Ayuntamiento de Barcelona) hizo un repaso general de la estrategia Barcelona Ciudad Digital. En el ámbito SIG, ya en la parte final, comentó que están en un proceso de migración de bases de datos y herramientas diversas a QGIS, en un proyecto que se llama QVista y que será liberado este año, lo cual es una gran noticia. Si esto se cumple, podríamos disponer de un código aplicable también a otros ayuntamientos.

Terminó el bloque de plenarias David Comas, de Nexus Geographics, todo un referente en los SIG. Con una visión muy clara, lanzó algunas ideas-clave: (1) lo generalista en los SIG ya está solucionado, hay que especializarse y (2) los SIG, con interfaces de alto valor, deben responder preguntas concretas y sencillas y así brindar tiempo al usuario experto para resolver él los temas complejos.

Comunicaciones

Frederic Bartumeus (CREAF) presentó Mosquito Alert, una plataforma de ciencia ciudadana para la lucha contra el mosquito tigre y las enfermedades que transmite. Muy interesante caso de cómo ligar ciudadanos, científicos y gestores públicos gracias a una aplicación de base geoespacial. Creo que en el futuro se desarrollarán muchas más iniciativas de este tipo y ojalá que parte de su código sea reutilizable para ello (github)

Tras él, María Arias de Reyna habló sobre las pocas mujeres, y en general poca diversidad, que existe en el ámbito tecnológico y cómo esto supone una clara pérdida de riqueza y variedad de enfoques. Presentó como luchar contra esta situación gracias a iniciativas como @pingmujeres y llamó la atención sobre los aspectos educativos, señalando la necesidad de despertar más vocaciones STEM en niñas y adolescentes.

Ramiro Aznar (Carto), mostró después 3 casos tipo en los que la representación con mapas es habitualmente difícil y los resultados obtenidos generalmente malos, junto con propuestas para mejorarlas:
* muchos puntos, de distintas categorías, generando «empaste» por estar próximos y/o superpuestos. Cuando esto sucede, aconseja reducir las categorías y jugar con la ordenación visual (categorías menos abundantes arriba) y la transparencia (los registros más escasos, arriba, más transparentes).
* puntos en el mismo lugar. Para hacer visible lo oculto se pueden usar varias alternativas, como mapas de calor, clusters, stacking chips o agregación de puntos.
* muchos campos para un solo registro. Aquí es conveniente pensar no en un mapa estático, sino en visualizaciones interactivas, en las que con controles como los de Builder se pueda aplicar de forma rápida y sencilla filtrado y estilos dinámicos. La verdad es que en esto Carto brilla especialmente.

Santiago Higuera presentó después el estado de OpenStreetMap España y cómo el proyecto sigue con impulso, con unos 100-110 usuarios activos al día y aprox. 30.000 nodos/día modificados en España.

Tras la pausa para la comida, continuaron las sesiones. A partir de aquí había doble ‘track’ así que sólo recogeré el bloque al que acudí (llamado «Investigación»):

Víctor Olaya (Boundless) presentó algunos consejos interesantes para los profesionales del SIG, tanto desarrolladores como usuarios / analistas. Básicamente, se centraban en la construcción por parte de cada uno de un «portfolio» público, perdiendo el miedo a la vergüenza, en el que se demuestren las capacidades e intereses, sea a través de foros, listas de correo, blogs o repositorios github.

Iván Sánchez mostró después las posibilidades que se abren al aplicar WebGL a mapas teselados en Leaflet. Un trabajo innovador y que muestra una gran velocidad de pintado pixel a pixel, abriendo la puerta a visualizaciones y análisis raster en el navegador. Creo que el futuro del pintado de mapas en web pasa claramente por trabajos con WebGL como este.

Eduard Suñé (IDESCAT) explicó con detalle cómo crear grids de población útiles, mediante quadtrees, a la vez que se protege el necesario secreto estadístico. Un ámbito que profesionalmente no conozco, pero que me hizo reflexionar sobre el esfuerzo necesario para encontrar un equilibrio entre dato geográfico de máxima calidad y el derecho a la privacidad de las personas.

Santiago Higuera dió luego un repaso a las opciones de referenciación lineal, ejemplificando en la red de carreteras españolas; se repasaron algunos aspectos de la ISO19148 y las opciones presentes en SIG de escritorio libres y PostGIS.

Jose Gómez Castaño (INSPIDE), autor de la app Comobity, describió la arquitectura de su plataforma Singularity para la DGT, donde tecnologías de Big Data como Spark, Hadoop, Flume o Kafka sirven para explotar datos en tiempo real y contribuir a una mayor seguridad en las vías públicas. Creo que ésta es una línea muy clara de futuro del sector geo: aplicaciones geográficas en un mercado vertical muy claro, con grandes volúmenes de datos y productos geográficos (no solo mapas) en tiempo real.

César Díaz (Tracasa Instrumental) mostró por su parte cómo utilizan unas tecnologías SIG muy contrastadas para crear mapas temáticos, en el Ayuntamiento de Pamplona (OpenLayers + Geoserver + PostGIS, con vistas parametrizadas, WMS & SLD); sin duda un ‘stack clásico’, pero muy efectivo.

Por la tarde, continué en las charlas del track «Desarrollos técnicos»:

Roger Veciana (Meteocat), presentó algo novedoso: cómo aplicar D3js como herramienta de render de datos raster meteorológicos, permitiendo eliminar el proceso de generación automática de tiles en el servidor cada día. Con esto el cliente web gana en flexibilidad y capacidad de cambiar estilos al vuelo. Una desarrollo muy interesante, como lo es blog de su autor geoexamples.

Después de Roger, nosotros presentamos el trabajo que hemos hecho en el IHCantabria: Leaflet.CanvasLayer.Field, un plugin para crear animaciones de viento / corrientes y que también renderiza raster, esta vez sobre Leaflet.

Aquí la presentación completa.

pluginLeaflet

Y tras nosotros, el mismo Roger, esta vez a título personal, presentó una extensión llamada d3-composite-projections, la cual permite visualizar áreas disjuntas en un solo mapa (p.ej. Canarias ‘cerca’ de la Península). Muy práctica, p.ej. para mapas electorales.

Ernesto Martínez (Carto) dió por su parte un repaso a las novedades de esta plataforma en 2017, siendo la principal la migración a Builder para todos los usuarios free. Otro aspecto que personalmente me llamó la atención fue la creciente importancia de los datos pre-cargados en la plataforma para enriquecer los análisis (Data Observatory).

Josep Lluís Sala (Giswater Association) contó el estado de la aplicación y de la red de asociados a este proyecto. Es un mercado en el que parece que la solución, basada en QGIS, PostGIS y modelos hidráulicos libres, parece estar convirtiéndose en estándar, lo cual es una gran noticia.

Ivan Sánchez presentó después una llamativa charla, llamada «Índices Miriahédricos Fractales Cuaternarios Para Fenómenos Geográficos», que escondía un curioso uso de palabras como índices geográficos (básicamente un what3words, pero con tacos).

Y finalmente María Arias de Reyna mostró el estado de GeoNetwork, un CMS ‘geográfico’ con mucha solera para trabajar con metadatados, al que claramente le han dado un buen empujón en lo visual.

Talleres

Además de las comunicaciones, tuve la oportunidad de acudir a dos talleres:

  • El primero sobre Docker, impartido por Joana Simoes y Jorge de Jesús. Docker parece una herramienta muy interesante para facilitar la gestión de servicios en producción, no solo para gente «de sistemas», sino también para desarrolladores. Me gustó la iniciativa que presentaron, geocontainers, con algunos servicios SIG empaquetados y preparados para usar, y una herramienta visual para el control de contenedores llamada portainer.
  • El segundo taller, sobre desarrollo de plugins para QGIS, fue impartido por Luigi Pirelli. Estuvo centrado en las herramientas necesarias para iniciar este camino: la consola básica, IPyConsole, Plugin Builder, Remote Debug y Plugin Reloader. Existen documentos que ayudan en el cambio de la v2 a la v3, para ayudar en el proceso de migración de plugins. Como consejo interesante: está previsto liberar QGIS 3 para finales de 2017 y parece bueno dejar aún madurar un poco las APIs.

Resumen

A modo de resumen, diría que tengo la sensación que el mercado SIG Libre, y con él las Jornadas, ha madurado, con empresas, tecnologías y usuarios consolidados. Quizá eché en falta alguna presentación más sobre JavaScript o nuevas tendencias como BigData, drones… pero creo que los contenidos en general han sido buenos, la organización y el ambiente inmejorables, y espero poder repetir el próximo año.

¡Saludos!

Brackets: un editor ágil para desarrollo web

En los últimos años ha habido una explosión de editores de texto, especialmente en el ámbito del desarrollo con JavaScript: SublimeAtom, Code o el propio Brackets.

Todos excepto Sublime son software libre y gratuito y tienen un enfoque similar: editores rápidos y con menos funciones «de serie» (comparados con grandes IDE tradicionales, como p.ej. Eclipse, Visual Studio…). Estos editores poseen además un ecosistema de plugins y temas muy amplio, para que cada uno personalice a su gusto sus funciones y apariencia.

brackets_ide

Después de usarlo en varios proyectos, Brackets me parece una opción interesante, así que comparto aquí la lista de plugins que utilizo actualmente por si os resulta útil:

  • Brackets-Git: manejo de git
  • Beautify: formateo automático de HTML, JS y CSS
  • Indent Guides: como guía visual para seguir la apertura-cierre de secciones
  • Minimap: guía del documento en pequeño, para desplazarse por él
  • Newline: para controlar el uso de CRLF <-> LF como fin de línea (windows / linux)
  • WordCount: nº de palabras
  • Brackets Css Color Preview: mostrar el color escrito en un CSS
  • EMMET: agilizar la escritura de HTML
  • Markdown Preview: para visualizar ficheros .md
  • Brackets Tree Icons: para otorgar un icono a cada fichero según su tipo
  • Brackets File Tabs: para complementar el árbol lateral con pestañas

 

https://gist.github.com/VictorVelarde/e65790a1166cb014531dded1752eb14c.js

Visor de terremotos del USGS con OpenLayers

En este post se presenta un pequeño ejemplo de visor, en el que se muestran los terremotos más recientes en el mundo, usando la biblioteca OpenLayers 3.

Los terremotos se leen de un origen remoto, en formato Geojson, y se actualizan automáticamente, gracias a un estupendo servicio feed del USGS


Sobre gist & bl.ocks:
* gist. Se trata de un servicio gratuito de github, para alojar pequeños codigos de ejemplo, que se persisten sobre un repositorio git. Gracias a ello son accesibles para su modificación desde cualquier equipo con un cliente git.
* bl.ocks.org. Un servicio, del creador de D3, que siguiendo unos pocos convenios en el gist, permite el acceso a su código en vivo, junto a su fuente, permitiendo mini-proyectos autodocumentados.

Nota:
Este ejemplo se presenta en el último video de la serie de seminarios sobre JavaScript, elaborada para geospatialtraining.com (ver Videos de introducción a JavaScript)

Video explicativo

6 videos de Introducción a JavaScript

Hola a todos,

En esta entrada os presento los 6 vídeos gratuitos de un curso introductorio a JavaScript, realizado en colaboración con http://geospatialtraininges.com/

Los vídeos no asumen conocimientos previos en la materia y están orientados a personas del mundo SIG que quieren iniciarse en la programación web.

Espero que os sean útiles.

Saludos!

Módulo I: Variables y datos (41 min)

Módulo II: Funciones y Bucles (1h)

Módulo III: Arrays y objetos (1h 12min)

Módulo IV: DOM (1h 3min)

Módulo V: Bibliotecas y frameworks (43 min)

Módulo VI: APIs SIG de JavaScript (1h 23min)

Recursos para aprender QGIS

QGIS es uno los software SIG de escritorio más pujantes en la actualidad. Libre, gratuito y extensible mediante plugins, tiene un potencial de evolución grande y una comunidad de usuarios creciente.

QGIS

Por esta razón cada día más gente se acerca a su aprendizaje, bien mediante cursos o de forma autónoma. Y en este proceso inicial toda guía o recopilación de enlaces suele resultar útil, así que voy a listar aquí algunos que he ido recopilando recientemente.

Enlaces básicos:
Página QGIS: El sitio oficial, con multitud de recursos y enlaces derivados.
QGIS Planet: Un agregador de varios blogs que recoge unificadamente artículos técnicos sobre QGIS (como p.ej. los publicados en Free and Open Source GIS Ramblings, de Anita Graser)
QGIS Plugins: Listado oficial de plugins
QGIS Hub: Wiki oficial del proyecto, donde p.ej. se reportan los bugs y recogen peticiones para futuras funcionalidades.
QGIS API: Documentación del API oficial, un recurso básico para programadores.
QGIS en stackexchange: Artículo en stackexchange donde se listan varios recursos.
QGIS en gis.stackexchange: Consultas sobre QGIS en gis.stackexchange

Tutoriales gratuitos:
QGIS Training Manual: Manual de aprendizaje de QGIS, en formato de curso con ejercicios prácticos (incluye p.ej. apartados sobre uso de la base de datos espacial PostgreSQL/PostGIS o GRASS). Como complemento a este material existe un conjunto de videos en español, que aparece listado en la siguiente wiki
A gentle introduction to GIS: Una introducción práctica y breve a los SIG que no asume conocimientos previos. Está basada en el tutorial original Introducing GIS worksheets
QGIS in under 10 minutes: Videotutoriales cortos con operaciones habituales en QGIS (serie de 17 vídeos, en inglés)
Curso de QGIS Valmiera: Videotutoriales QGIS, versión 2.2 (serie de 10 vídeos, en castellano).
GST 101: Introduction to Geospatial Technology. Curso de introducción a SIG, usando QGIS 2.2
GST 102: Introduction to Geospatial Technology. Continuación del curso previo, más centrado en la parte de análisis espacial con QGIS.

Saludos y espero que resulten útiles.

Cómo utilizar datos geográficos públicos de la NASA (SRTM) con un software libre como QGIS

Si en una entrada previa mostrábamos algunos ejemplos de uso de datos vectoriales libres, procedentes de OpenStreetMap, en este caso vamos a revisar una valiosa fuente de datos cuasi-mundial con la altitud del terreno denominada Shuttle Radar Topography Mission (SRTM).

Dentro del mundo SIG, a estas fuentes de datos se las denomina Modelos Digitales del Terreno (MDT) y recogen, generalmente en forma de fichero, una estructura numérica de datos que representa la distribución espacial de una variable, sea en forma vectorial (contornos o TIN) o más frecuentemente raster (matrices regulares o quadtrees). Si esta variable es la altitud, entonces hablamos de Modelos Digitales de Elevaciones (MDE).

Para profundizar en las bases conceptuales de los MDT, recomiendo los estupendos materiales de A.M. Felicísimo en http://www6.uniovi.es/~feli/CursoMDT/

La SRTM que nos ocupa es una misión comandada por la NASA desarrollada en el año 2000, que mediante su transbordador espacial Endeavour y un radar aerotransportado tomó datos en detalle sobre la elevación terrestre, entre los 60º de latitud norte y los 56º de latitud sur (más detalles técnicos de la misión en la página oficial SRTM). Si bien algunos de sus datos son públicos desde hace varios años, desde septiembre de 2014 han comenzado a liberarse por primera vez los lotes más detallados, con la resolución original de aproximadamente 30 metros (1 arco-segundo), antes solo disponibles en USA.

En esta entrada veremos algunas posibilidades del uso combinado de un software SIG libre como QGIS y los datos de esta fuente.

 

¿Cómo empezar a trabajar con QGIS y SRTM?
Asumiendo que ya tenemos QGIS correctamente instalado (instrucciones aquí), procederemos primero a la descarga de datos SRTM Basic.

Para la descarga usaremos una herramienta interactiva proporcionada por el USGS (Servicio Geológico de Estados Unidos) llamada EarthExplorer (http://earthexplorer.usgs.gov/). Desde ella se puede descargar no solo la SRTM, sino una gran variedad de fuentes. Antes deberemos registrarnos como usuarios aquí (un proceso gratuito, aunque nos llevará un par de minutos).

Luego seguiremos los sencillos pasos marcados por el asistente:

  • 1. Enter Search Criteria: en nuestro caso navegaremos en el mapa hasta encuadrar el ámbito de la Bahía de Santander, en Cantabria.
Fig.1: Selección del ámbito de interés en EarthExplorer

Fig.1: Selección del ámbito de interés en EarthExplorer

  • 2. Select Your Data Set(s), donde indicaremos la palabra clave ‘SRTM’ para filtrar los datos y poder llegar al producto ‘SRTM 1 Arc-Second Global’
Fig.2: Filtro de dataset SRTM

Fig.2: Filtro de dataset SRTM

  • Al pulsar en la búsqueda aparecerán las hojas disponibles en el apartado 4. Search Results. En nuestro caso son dos hojas y procederemos a la descarga de la identificada como SRTM1N43W004V3, en formato GeoTIFF.
Fig.3: Descarga de hoja SRTM 1 Arc-Second Global

Fig.3: Descarga de hoja SRTM 1 Arc-Second Global

 

El fichero descargado n43_w004_1arc_v3.tif podremos ya cargarlo en QGIS.

Para ello bastará con utilizar la opción del menú Capa - Añadir capa raster y se visualizará con la escala de colores por defecto, en tonos grises. Podremos también consultar la altitud del terreno registrada en cada punto, haciendo clic con la herramienta Identificar.

Fig.4: MDE de SRTM en QGIS, con paleta gris unibanda

Fig.4: MDE de SRTM en QGIS, con paleta gris unibanda

Una vez cargados los datos, podemos comenzar a explotarlos utilizando distintas herramientas de QGIS. A continuación mostraremos brevemente 3 ejemplos.

 

Ejemplo 1. Usar SRTM como mapa base
El MDE de la SRTM constituye una gran base para la visualización topográfica, y puede servir como mapa de fondo sobre el que representar después nuestra información geográfica particular (p.ej. una ruta tomada con el GPS). Una forma rápida de dar un estilo mejorado a la capa raster, es mediante Raster - Análisis del terreno - Relieve, que genera una capa con visualización de sombreado y tintas hipsométricas simultáneas.

Fig.5: MDE SRTM sombreado en QGIS

Fig.5: MDE SRTM sombreado en QGIS

 

Ejemplo 2. Usar SRTM para una visualización 3D
QGIS dispone de un plugin muy interesante para la visualización en 3D de un MDE en un simple navegador web. El plugin se llama Qgis2threejs, que utiliza internamente la librería de JavaScript threejs. Con multitud de opciones para explorar, es una herramienta de visualización / publicación web de resultados muy interesante.

Fig.6: MDE SRTM en vista 3D con Qgis2threejs

Fig.6: MDE SRTM en vista 3D con Qgis2threejs

 

Ejemplo 3. Usar SRTM para un análisis de ubicación óptima
El hecho de conocer la altitud en cada celda (cada 30 metros), unido a las capacidades analíticas de QGIS para datos raster, permite usar SRTM en potentes análisis geográficos. Por ejemplo, es posible modelizar el flujo del agua y estudiar cómo se configuran las cuencas hidrográficas o calcular las horas potenciales de insolación anuales en un punto…

En el siguiente vídeo mostraremos otro ejemplo aplicado a un problema SIG clásico: la búsqueda de la mejor ubicación, apoyados en la calculadora raster de QGIS:

 


Esta entrada es una colaboración en el blog iNFoRMáTICa++, perteneciente a los Estudios de Informática, Multimedia y Telecomunicación (EIMT) de la Universitat Oberta de Catalunya (UOC). Publicada originalmente en: http://informatica.blogs.uoc.edu/2015/01/15/como-utilizar-datos-geograficos-publicos-de-la-nasa-srtm-con-un-software-libre-como-qgis/

3 lenguajes de programación para SIG

A lo largo de los años dentro del mundo SIG es habitual, para un analista o usuario avanzado, encontrarse en la posición de tener que decidir: ¿en qué tecnología/s formarme? O dicho de otra forma ¿a qué dedico mi valioso (y probablemente escaso) tiempo-presupuesto? ¿aprendo a manejar un nuevo SIG de escritorio, a gestionar un servidor SIG… o a qué?

Esta primera pregunta hoy día tiene una sólida y clara respuesta: primero aprende a programar (y si ya sabes, aprende a programar mejor). Tomando las palabras de James Fee (al que recomiendo seguir en su blog): «GIS analysis has become programming and development», así que la cuestión es más bien… ¿en qué lenguaje/s de programación invierto?

Aunque la lista de lenguajes candidatos es potencialmente extensa, para obtener el máximo retorno del esfuerzo lo más adecuado hoy día es centrare en SQL, Python y JavaScript.

¿Por qué estos lenguajes y no otros?
sql
SQL (1974): lleva cuarenta años con nosotros y sigue vigente. Aunque estrictamente no es un lenguaje de programación, sino un ‘lenguaje de consultas estructurado’, lo importante es que todo SIG lleva un motor de consultas interno que permite, en mayor o menor medida, aplicar SQL. Si sabes bien los fundamentos, te será mucho más fácil aplicar luego los operadores espaciales disponibles para enriquecerlo con la componente «geo». Acabarás teniendo un SHP, una plataforma en la nube como CartoDB, un PostGIS o un miserable Access, pero lo que es seguro es que si trabajas con SIG tendrás que manejar con soltura SQL.

python
Python (1991): el lenguaje para muchos más adecuado para iniciarse en la programación, con librerías que facilitan el trabajo en prácticamente todo tipo de ámbitos (interfaces, multimedia, bioinformática…). En el mundo SIG la decisión ya está tomada hace un tiempo, desde el momento en que potentes librerías como GDAL/OGR crearon sus envoltorios para Python y ESRI & QGIS lo adoptaron como lenguaje de geoprocesamiento. Python es hoy el lenguaje por excelencia para trabajar con SIG, especialmente a nivel de geoprocesamiento y en equipos de escritorio (otro tema es la construcción de soluciones web en servidor, donde el entorno Java con ejemplos como Geoserver-GeoTools aún sigue vigente).

javascript
JavaScript (1995): Tiene la capacidad de dotar de interacción a las páginas web e incorporar mapas y otras funciones SIG en ellas mediante bibliotecas (como OpenLayers, Leaflet, etc.), hasta conseguir aplicaciones SIG completas en el navegador web. Prácticamente toda la revolución de la «neogeografía», que tanto ha beneficiado a los SIG estos últimos años, ha venido de su mano (primero con GoogleMaps, y más recientemente con bibliotecas como las de CartoDB, Mapbox…). De hecho, ahora comienzan a aparecer librerías JavaScript como Turf para algo impensable hace unos años: realizar cálculos SIG en el navegador web (buffer, intersección, isolíneas…), sin tener que recurrir a un servidor dedicado de respaldo como ArcGIS Server o Geoserver.

JavaScript no «viaja solo»: en la práctica hay que considerar un lote de 3 lenguajes, puesto que lleva aparejado lidiar con sus dos lenguajes ‘hermanos’: HTML y CSS, que lo apoyan para construir aplicaciones web.

Si cada uno de estos lenguajes ya es útil por si sólo, lo son más en combinación. Aprovechar las sinergias que surgen entre ellos permite explotar y construir sistemas SIG más potentes (p.ej. usar Python en ArcGIS o QGIS y realizar filtros SQL contra una base de datos PostGIS, usar JavaScript y realizar consultas SQL a través de un API contra una tabla remota en CartoDB, etc.).

Así que mi consejo es:
1. aprende los fundamentos básicos de los 3 lenguajes
2. dedica el tiempo a profundizar en ellos y en nuevas bibliotecas de funciones que los enriquezcan.
3. mejora durante el proceso tus habilidades generales de programación (algoritmos, diseño, herramientas y prácticas ágiles…).

Cómo utilizar datos geográficos públicos de OpenStreetMap con un software libre como QGIS

Analizar datos espaciales y generar con ellos mapas atractivos para el usuario es la gran fortaleza de los Sistemas de Información Geográfica (SIG). Y si hace unos pocos años el software SIG y los datos de calidad estaban sólo al alcance de unos pocos (grandes corporaciones, militares, universidades…), hoy cualquier profesional bien formado tiene en su mano la posibilidad de usarlos de forma rápida y gratuita. En esta entrada veremos algunas posibilidades del uso combinado de un software SIG libre como QGIS y los datos, también libres, de OpenStreetMap.

¿Cómo empezar a trabajar con QGIS y OSM?

Instalando en nuestros equipos la última versión de QGIS Desktop dispondremos de un software SIG de escritorio completo, gratuito y extensible mediante plugins (instrucciones de instalación detalladas de la v2.6, para Linux, Windows y Mac, en http://www.qgis.org/es/site/forusers/download.html).

OpenStreetMap (OSM) no es sólo un mapa: es una base de datos mundial con más de 30 GB de datos geográficos vectoriales de información muy diversa y detallada (carreteras, caminos, edificios, restaurantes, parques naturales…). En las últimas versiones QGIS integra de forma nativa la opción de descarga de datos OSM, desde su menú Vectorial - OpenStreetMap (OSM) - Descargar Datos. Esto simplifica y agiliza la descarga de una porción de datos OSM, en forma de fichero vectorial .osm (XML).

En este ejemplo, utilizaremos datos de la ciudad de Santander, dentro del área geográfica definida manualmente por las siguientes coordenadas: xmin:-3.8313931 ymin: 43.4449263 | xmax:-3.7658341 ymax: 43.4784917

QGIS también permite descargar datos OSM dentro del encuadre de una capa preexistente o a partir del zoom actual por pantalla. En cualquier caso, es importante que el sistema de referencia sea WGS84 Longitud / Latitud (EPSG: 4326) o el proceso no funcionará correctamente. Esto es debido a que internamente el complemento hace uso del API Overpass, que recibe como parámetros las coordenadas del encuadre en este sistema.

Una vez descargados los datos OSM (en un fichero santander.osm, de aprox. 5 MB), se pueden cargar directamente en QGIS, mediante la opción de menú Capa - Añadir capa - Añadir capa vectorial (y luego seleccionando points / lines / multipolygons).

OSM_Base

Fig.1: Datos OSM con los estilos por defecto en QGIS

Una vez obtenidos los datos podemos comenzar el proceso de explotación y análisis, utilizando distintas herramientas de QGIS. A continuación mostraremos brevemente 3 ejemplos ilustrativos:

 

Ejemplo 1. Usar OSM para generar un mapa

Es posible tomar los datos OSM y generar con QGIS un mapa 100% personalizado, seleccionando cada entidad a mostrar, su etiquetado, su estilo… hasta obtener un mapa base o mapa temático a nuestra medida.

QGIS proporciona un mecanismo para persistir reglas de visualización mediante ficheros de estilos reutilizables (.qml). Por ejemplo, existen algunos .qml públicos que permiten dar una apariencia ‘googlemaps’ a un lote de datos .OSM y si los aplicamos a nuestras capas OSM (menú de capa Propiedades - Cargar estilo) el resultado es un mapa base como el siguiente:

Fig.2: Mismos datos OSM, con los estilos osm_spatialite_googlemaps_.qml, tomados de https://github.com/anitagraser/QGIS-resources/tree/master/qgis2/osm_spatialite

Fig.2: Mismos datos OSM, con los estilos osm_spatialite_googlemaps_.qml, tomados de https://github.com/anitagraser/QGIS-resources/tree/master/qgis2/osm_spatialite

Los .qml usados son ficheros para la versión 2.4 de QGIS y no se contemplan todos los tipos de objetos OSM, como p.ej. ‘playas’ (categoría natural:beach), con lo cual para un resultado óptimo deben trabajarse más los estilos.

 

Ejemplo 2. Usar OSM para un análisis de redes

OSM incluye un subconjunto especialmente relevante de datos que es la red viaria. OSM recoge el grafo conectado de autopistas, carreteras, caminos, calles… y permite por tanto aplicar los algoritmos propios del análisis de redes: camino más corto, estimación de tiempos para recorridos, etc.

Aunque existen herramientas más sofisticadas, QGIS proporciona una práctica utilidad para calcular la ruta más corta en una red, mediante su complemento Grafo de rutas.

Antes de usar el complemento hay que cargar la capa de líneas y luego configurar el plugin, mediante Vectorial - Configuración del complemento Grafos de rutas. En ese apartado de configuración se puede fijar p.ej. la velocidad media de los tramos. Para ver los datos de tiempo y velocidad correctamente, será necesario usar una proyección que utilice metros como unidad, así que aplicaremos antes una reproyección al vuelo (en este caso, a la zona le corresponde ETRS89-UTM30N: EPSG:25830).

Si fijamos una velocidad media de 50 km/h a toda la red, podemos calcular por ejemplo la distancia y tiempo estimado del camino más corto entre la estación de tren de RENFE y los Jardines de Piquío en el Sardinero.

Fig.3: Los datos de la red de transporte OSM utilizados para un cálculo de camino más corto

Fig.3: Los datos de la red de transporte OSM utilizados para un cálculo de camino más corto

 

Ejemplo 3. Usar OSM para la búsqueda de vivienda

Los datos OSM pueden usarse también para análisis de otra índole, encadenando sobre ellos operaciones espaciales sucesivas (área de influencia, intersección, etc.). P.ej. para la búsqueda de la mejor ubicación para alquilar una vivienda, en base a una serie de requisitos previos tales como p.ej. la proximidad a una escuela, cercanía a vías de comunicación rápidas, etc.

En el siguiente vídeo puede verse un análisis vectorial sobre datos OSM en esta línea:

 


Esta entrada es una colaboración en el blog iNFoRMáTICa++, perteneciente a los Estudios de Informática, Multimedia y Telecomunicación (EIMT) de la Universitat Oberta de Catalunya (UOC). Publicada originalmente en: http://informatica.blogs.uoc.edu/2014/12/15/como-utilizar-datos-geograficos-publicos-de-openstreetmap-con-un-software-libre-como-qgis/

Instalación de librerías NetCDF + Python en un sistema Windows

La instalación adecuada de Python + NetCDF es algo muy extendido y documentado en sistemas Linux, pero no tanto en sistemas Windows. En esta entrada el objetivo es recoger los pasos necesarios para conseguirlo, a modo de referencia rápida con las instrucciones y enlaces oportunos.
Python + netCDF
NetCDF [1] es un formato binario de fichero (.nc) orientado a arrays, que facilita el manejo de varias dimensiones (x, y, z, tiempo…) de forma eficiente y flexible. Por esta razón está muy extendido en la comunidad científica, por ejemplo para guardar datos del medio como temperaturas, corrientes, viento, salinidad, etc. obtenidos mediante sensores o modelado. De forma indisoluble con el formato, existe un conjunto de librerías para NetCDF que facilitan el acceso a sus datos desde varios lenguajes (C, Fortran, Java, etc.) y que son la pasarela con la que trabaja el programador. Python es por su parte el lenguaje de scripting más potente y posee multitud de librerías para ampliar su campo de acción (para el manejo de datos SIG, cálculo intensivo, gráficos, etc.), por lo que juntos forman una buena combinación en el ámbito científico.
Los pasos para configurarlos de forma integrada en una plataforma Windows de 32 bits son:
  • (A) Python 2.7. Si aún no lo tenemos, la última versión disponible para la rama 2.x (la más extendida) es actualmente la 2.7.5, descargable aquí
  • (B) NetCDF4. Las librerías base están escritas en C y para usarlas es necesario descargarlas y compilarlas o, algo más práctico, obtener directamente los binarios. Siguiendo la segunda vía, aquí está el instalador con la última versión para netCDF4. Para una descripción más detallada de estos binarios, ver el enlace [2]
  • (C) Acceso a las librerías NetCDF. Para un enlace posterior a las librerías, es necesario agregar al PATH los siguientes directorios, generados por el instalador: C:\Program Files\netCDF 4.3.0\bin y c:\Program Files\netCDF 4.3.0\deps\shared\bin
  • (D) Numpy. El acceso a los datos de los ficheros NetCDF se realizará de forma efectiva con esta librería para Python, especializada en el manejo de arrays.  La última versión disponible hoy, la 1.7.1, para Python 2.7 está disponible aquí 
  • (E) Interfaz de Python para netcdf4. Ésta es la librería Python que permite leer y escribir en los netcdf desde scripts .py, actuando de pasarela hacia las librerías base previamente configuradas (C). El instalador para la 2.X está en este enlace
  • (F) Validación. Finalmente, para probar que todo está correcto, ejecutaremos un pequeño script de Python, leyendo un netcdf cualquiera (fichero testNC.py). P.ej. estos datos de la NASA muestran las anomalías térmicas sobre la superficie terrestre y es posible descargarlos en formato netCDF desde aquí en un fichero «nmaps.nc». Como nota útil, señalar que para visualizar de forma rápida el netcdf se puede usar un visor como Panoply [3] o un software SIG como gvSIG, que en su versión más reciente incluye soporte a este formato [4]

testNC.py

# -*- coding: utf-8 -*-
import netCDF4 as nc
import numpy as np

'''
     Prueba de acceso a netCDF en Python Win32.
     Abre un fichero .nc y obtiene el valor mínimo de una variable conocida ('TEMPANOMALY')

'''
print 'TEST netCDF en Python'
rutaFichero = "c:/users/admin/nmaps.nc"
fichero = nc.Dataset(rutaFichero)

print "* Variables disponibles en el fichero:"
for v in fichero.variables:
    print v

datos = fichero.variables["TEMPANOMALY"][0]
print "* Mayor anomalia de temperatura negativa : {0} K".format(min(datos))
Nota: como los datos de la variable vienen en un array con «máscara» (para indicar dónde hay ‘huecos’ sin datos), es posible utilizar las clases de numpy específicas y hacer algo como:
minimo = np.ma.MaskedArray.min(fichero.variables["TEMPANOMALY"][:])
maximo = np.ma.MaskedArray.max(fichero.variables["TEMPANOMALY"][:])
Enlaces de interés: