Estas últimas semanas he estado “exprimiendo” un poco más una de mis herramientas favoritas para análisis de datos: Matplotlib. Esta potente librería open source del ecosistema pythoniano, junto a otras como Numpy, Scipy, IPython, Pandas, Sympy, etc., es actualmente core package de las Scientific Computing Tools for Python, más conocidas como The Scipy Stack (http://www.scipy.org/).
A pesar de que llevo años trabajando con Matplotlib, indagar poco a poco en sus entrañas me va permitiendo conocer cada vez más su verdadero potencial.
Como geógrafo, no podía ser de otra manera que el toolkit de Matplotlib que más he usado es Basemap, con el que he pasado muchas horas ploteando resultados antes de integrarlos en un Sistema de Información Geográfica. Cabe destacar que la elevada robustez de Basemap se debe a que se sustenta sobre dos pesos pesados: PROJ4 y GEOS.
Basemap, aunque se encaja directamente encima de Matplotlib como un toolkit, es realmente una librería independiente desarrollada por Jeffrey S. Whitaker, un meteorólogo del Earth System Research Laboratory de la National Oceanic and Atmospheric Administration (NOAA).
Me gustaría recordar la importancia crucial que tiene Jeffrey S. Whitaker en el mundo del software geocientífico, ya que ha regalado a la comunidad otras valiosas “perlas” como el binding Python a la Librería C de NetCDF4 de UNIDATA o los bindings Python a las librerías más importantes de decodificación de ficheros GRIB (NOAA y ECMWF).
Un ejemplo de mis últimos escarceos con Basemap han quedado materializados en una pequeña librería que he construido sobre ella, y que he llamado daynight2geojson. El objetivo de esta pequeña aplicación es obtener la distribución espacial mundial de la noche para una fecha exacta que especifiquemos (que se asume que es UTC). Si no se especifica ninguna fecha, el programa calcula la cobertura nocturna para la fecha actual (UTC, claro está).
Una vez extraídos los datos, se procesan y almacenan en un fichero GeoJSON, que puede por supuesto ser cargado en cualquier cliente capaz de leer este formato (su simpleza hace que hoy día casi cualquier cliente geo lo consuma sin ningún problema).
Todo el procesado de las geometrías se realiza con ayuda de la librería Python para tratar con el formato GeoJSON y la librería para manipulación y análisis de objetos geométricos Shapely (que funciona sobre GEOS). El sistema de referencia de coordenadas (CRS) de la cobertura de salida es EPSG:4326.
Para el que quiera profundizar, todo el fundamento matemático sobre el que descansa el cálculo de la geometría mundial de la noche se encuentra en el módulo solar de Basemap: el cálculo de la GHA (Greenwich hour angle), la declinación solar, etc.
A continuación se muestran algunos ejemplos de cálculos realizados con la librería daynight2geojson para diferentes fechas:
- Cálculos para el día 15 de enero de 2015 a las 12:00 horas UTC.
- Cálculos para el día 15 de enero de 2015 a las 18:00 horas UTC (el mismo día a distinta hora).
Todo el código fuente está accesible en Github: https://github.com/GeographicaGS/daynight2geojson
El que tenga algo que aportar, corregir o discutir, lo puede hacer a través de la apertura de un nuevo issue o forkeándolo y lanzando un pull request.
¡Hasta la próxima!