Blog

Descargando capas ráster con GEE en QGIS

Tabla de contenidos

Introducción

En estos tiempos, donde la cantidad de información disponible se ha multiplicado exponencialmente, se hace necesario contar con herramientas eficientes para obtener y procesar grandes volúmenes de datos. En este sentido, Google Earth Engine (GEE) se posiciona como una excelente solución para obtener datos espaciales en tiempos relativamente cortos y al aprovechar los beneficios de la tecnología en la nube (Cloud Computing), estamos optimizando recursos, por el simple hecho de contar con la potencia y escalabilidad de los servidores remotos que nos facilitan el acceso, manejo y análisis de los datos geoespaciales disponibles.

Para empezar a usar la plataforma del GEE, existen varias opciones que nos permiten interactuar con lenguajes de programación, dentro del editor de código del mismo GEE empleamos el lenguaje JavaScript, de la misma manera, podemos aprovechar sus ventajas a través del lenguaje Python gracias a la API del GEE (earthengine-api) y de una manera más interactiva a través del paquete de Python geemap. Si bien hablamos de algunas de las opciones, para quienes requieren de los datos de una manera rápida y tienen poco conocimiento de programación, en esta oportunidad hablare de la posibilidad de acceder a las capas de tipo ráster disponibles en GEE pero desde el entorno de QGIS, todo ello gracias al complemento «Download raster GEE«.

Plugin Dowload raster GEE

De acuerdo a lo mencionado en su repositorio, el complemento nos permite descargar capas ráster de GEE, apoyándonos con archivos de tipo vectorial (Shapefiles) para determinar una región de interés para luego de ser seleccionada, podamos acceder fácilmente a los datos de imágenes rasterizadas. El complemento puede ser instalada directamente desde el administrador de complementos en QGIS.

Para utilizar adecuadamente el complemento se debe seguir los siguientes pasos:

  • Cargar un archivo en formato Shapefile que define la región de interés.
  • Activar el complemento y seleccione el archivo Shapefile como región de interés.
  • Seleccione la fuente datos requerido y seleccionar los parámetros necesarios como la fecha y el tipo de imagen.
  • Hacer Click en ‘Download‘ para obtener los datos ráster de GEE.

Dependencias del complemento

Para lograr ejecutar el complemento sin problemas debemos cumplir algunos requisitos, entre ellos:

¿Cómo funciona el complemento?

Una vez que el complemento está instalado en QGIS, uno podrá realizar diversas solicitudes para recuperar información del catálogo de datos disponible en GEE y mostrarla, así como para generar información válida para descargar según los requerimientos de zona de interés, fechas y tipo de imagen.

Probando el complemento

Para probar el complemento vamos a descargar una imagen que tiene como área de interés al Perú, seleccionamos desde los datos provenientes de MODIS, los que corresponden a la Producción Primaria Neta (Npp), el detalle lo podemos revisar del catálogo de GEE (MOD17A3HGF.061: Terra Net Primary Production Gap-Filled Yearly Global 500m). Como se aprecia en la figura de abajo, primero ubicamos la imagen ráster de MODIS e indicamos la resolución (tamaño del píxel), luego seleccionamos la banda correspondiente, en nuestro caso será Npp. Se mantuvo el rango de fechas por defecto, luego seleccionamos la capa vectorial como nuestra área de interés y también definimos la ruta y el nombre de la capa a descargar en formato tif. Finalmente solo debemos hacer click en el botón Download y esperar que se complete la descarga.

Empleando el mismo procedimiento decidimos descargar desde otra fuente de datos, en este caso de la NASA, lo que corresponde al porcentaje del área de píxeles cubierta por árboles (tree_canopy_cover). El detalle lo podemos revisar en Global Forest Cover Change (GFCC) Tree Cover Multi-Year Global 30m. Como se aprecia solicitaremos la descarga de una capa con mayor resolución, por lo tanto, se modificó el área de interés al Departamento de Huánuco en Perú.

Resultados obtenidos

Dependiendo de la extensión de tu área de interés y la resolución establecida, la descarga puede tomar su tiempo, por otro lado, en algunos casos debemos hacer un paso previo para tener nuestra capa en las unidades correctas. Para la Npp, debemos ajustarlo de acuerdo al valor de escala que ha sido establecido en la tabla de la siguiente figura.

Por lo mencionado dentro de QGIS usando la calculadora ráster solo debemos multiplicar la capa por 0.0001, luego tendremos nuestra capa con las unidades correspondientes a kg*C/m2 .

Para el segundo resultado las unidades están en porcentajes.

Reflexión final

Si bien trabajar dentro del editor de código del GEE te permite una mayor flexibilidad y mayores opciones para aprovechar las ventajas de trabajar desde la nube, todo ello se traduce en obtener mejores resultados, a veces solo necesitamos descargar una capa ráster y para quienes no se encuentran muy familiarizados con los lenguajes de programación, el uso de este complemento quizás le pueda resultar útil. Debo reconocer que mientras lo estaba probando con distintas fuentes de datos, no funcionó de manera muy óptima en algunos casos, tomando quizás más tiempo si lo comparamos cuando uno lo trabaja desde el editor de código. En fin, espero que lo puedan probar y puedan sacar sus propias conclusiones.

Se elaboró el siguiente video para mostrar el procedimiento seguido.

Exploración de datos con DataVoyager

Tabla de contenidos

Introducción

En busca de herramientas que nos permiten visualizar nuestros datos y a modo de complementar lo que vimos con VegaLite en una entrada anterior, en esta oportunidad probaremos el uso de un paquete de Julia denominado DataVoyager.jl. Nuestro objetivo será mostrar de manera práctica las ventajas de trabajar con una herramienta interactiva de visualización que nos puede ayudar como parte del proceso de exploración inicial de nuestros datos.

Detalles sobre DataVoyager.jl

En principio, debemos entender que este paquete de Julia viene integrado dentro del metapaquete Queryverse, logrando proporcionar herramientas interactivas de exploración de datos. Se basa en el proyecto Voyager y está estrechamente integrado con VegaLite.jl. Como vemos, el paquete usa como fuente Vega, que trabaja a través de una gramática de visualización, un lenguaje declarativo para crear, guardar y compartir diseños de visualización interactivos, el mismo que a través de su aplicativo Voyager presenta una interfaz de visualización para la exploración de datos. Proporciona una interfaz para especificar la especificación Vega-Lite, con recomendaciones de gráficos impulsadas por el motor de recomendación de visualización Compass (como lenguaje de consulta). Como dato adicional, Voyager además de ser utilizado por Julia a través de DataVoyager, para quienes tienen la costumbre de usar JupyterLab, existe una extensión para que lo puedan probar.

Uso de DataVoyager

Para nuestra demostración vamos a emplear unos datos en formato CSV y de libre acceso: Crop Yield and Production. Como primera acción debemos instalar los paquetes requeridos. Podemos desde una IDE como Visual Studio Code, activar el REPL con las teclas Alt j + Alt o, y luego de usar ], adicionamos los paquetes VegaDatasets, DataVoyager, CSVFiles, DataFrames y VegaLite.

(@v1.7) pkg>add <package>

Vamos a generar un archivo que en mi caso lo denominé eda.jl, para iniciar nuestro código activando los paquetes instalados.

using VegaDatasets  
using DataVoyager   
using CSVFiles
using DataFrames
using VegaLite  

Ahora como primer ejemplo emplearemos una de los datos disponibles que tenemos al usar VegaDatasets, nos referimos a «iris«.

dat_iris = dataset("iris") |> Voyager()
Vista de DataVoyager con datos de Iris

Opciones dentro de DataVoyager

Como se aprecia en la imagen previa, en digamos el campo de datos, ha reconocido las columnas de los datos, colocando el símbolo «#» al inicio para aquellos que presentan datos de tipo numérico o cuantitativo y «A«, para aquellos de tipo nominal. A partir de ahora queda a nuestro criterio ir agrupando los datos en los ejes X e Y respectivos (solo se arrastran), teniendo como una de las opciones cuando se visualizan nuestros datos el poder diferenciarlos por colores arrastrando dentro de «Mark» en donde indica «color» por ejemplo la columna de datos «species» y también lo podemos dividirlos en files o columnas si arrastramos los mismos datos dentro de donde indica «Facet«.

Vista de gráficos empleando opciones de marcas y facetas.

Otra opción que podemos apreciar es la posibilidad de incorporar algunos filtros, como ejemplo arrastramos una columna de datos numéricos con la finalidad de reducir los valores a un rango específico de valores, con la finalidad de ajustar nuestro gráfico. Como se aprecia en la figura siguiente, se elimina valores de una especie que esta fuera del rango establecido por el filtro.

Uso de nuestro datos

Ahora nos toca usar los datos que fueron descargados de la fuente ya mencionada. Seguiremos el mismo procedimiento seguido con la diferencia que debemos agregar el paso previo de leer datos en formato CSV, empleando el paquete CSVFiles.jl, luego con el paquete DataFrames.jl generar nuestra estructura de datos bajo el esquema de los Dataframes.

crop_data = load("voyager/data/crop_production.csv") |>DataFrame

v = crop_data |> Voyager()
Vista de nuestros datos dentro de DataVoyager

Luego de ajustar nuestras columnas de datos empleando las opciones que tenemos dentro de esta herramienta, vamos a generar un gráfico que será mostrado en nuestra vista específica. Finalmente si estamos conforme con el resultado, es obvio que necesitamos exportarlo a un formato de imagen por lo general para que puede ser incluido en quizás alguna presentación que necesitamos realizar. Para ello podemos seguir las indicaciones del siguiente código en Julia.

plot1 = v[]

plot1 |> save("voyager/output/prod_media.svg")

Si bien podemos exportarlo a otros formatos como *.png, se recomienda emplear el formato *.svg, con la finalidad de tener una mejor presentación sin alteración en la calidad de la imagen.

Reflexión Final

Siempre considero importante tener la posibilidad de explorar nuestros datos de manera rápida, ahora conocemos una herramienta que nos permite realizarlo de manera interactiva y de manera muy «visual», generando gráficos de manera rápida y de manera intuitiva, aunque es verdad que estamos limitados en el conocimiento más profundo de los datos, sobre todo desde el lado de la calidad de los mismos, es decir, a primera vista no podríamos darnos cuenta si existen datos faltantes por ejemplo. En general considero que esta herramienta podría ser muy útil para datos que de antemano conocemos que son confiables y necesitamos mostrar gráficos para una presentación rápida. Mientras exploraba la herramienta, me pude dar cuenta que la aplicación propia del mismo Voyager, presenta mayores opciones, les recomiendo probarla y si quieren profundizar también pueden revisar su documentación que es muy completa sobre todo lo que podríamos realizar con esta herramienta. También logre encontrar un paper sobre el mismo.

Bueno, espero que la herramienta presentada sea de mucha utilidad al momento de hacer una exploración inicial de sus datos. De la misma manera se ha elaborado un video sobre el uso de esta herramienta para que puedan ver con mayor detalle las opciones que fueron empleadas.

Control de versiones en QGIS con Kart

Tabla de contenidos

Introducción

Al revisar los plugins más recientes disponibles dentro del repositorio de QGIS nos entramos con Kart, el mismo que fue desarrollado principalmente por Víctor Oyala. Este complemento en resumen nos permite trabajar nuestras capas vectoriales bajo un sistema de control de versiones (VCS), por lo tanto, para los que están familiarizados con el uso de Git por ejemplo, seguro será muy familiar lo que vamos a presentar, la diferencia radica en la posibilidad de gestionar el control de versiones de nuestros datos geoespaciales dentro del QGIS dentro de un entorno de usuario más amigable. Es muy recomendable que tengamos claro los conceptos que involucran un VCS como Git, para ello se recomienda revisar algunos tutoriales que te ayudan a conocer sus fundamentos y las ventajas de usarlo.

Primeros pasos con Kart

Lo primero que debemos hacer previo a la instalación del complemento de Kart es contar con el software Kart, según el sistema operativo que estemos usando. Podemos revisar su repositorio en caso necesitemos alguna orientación para su instalación. También será necesario configurarlo para identificar nuestra identidad cuando realizamos los «commits» con Kart. Solo será necesario ingresar lo siguiente dentro del terminal.

$ kart config --global user.email "you@example.com"
$ kart config --global user.name "Your Name"

Ahora si estamos listos para ir al administrador de complementos de nuestro QGIS para buscarlo e instalarlo.

Complemento Kart en QGIS

Una vez instalado lo primero que debemos hacer es configurarlo para poder usarlo adecuadamente, para ello será necesario ir a «Settings» para indicar la ruta de nuestra instalación del software Kart. En la figura siguiente se muestra en caso lo tenemos en una distribución de Linux, para otros casos se recomienda revisar la documentación oficinal.

Configuración del plugin Kart

Uso del plugin Kart

A continuación mencionaremos el flujo básico para poder usar el plugin Kart dentro de QGIS, aunque también es recomendable que apredemos a combinarlo con nuestro terminal para sacar el máximo provecho, sobre todo al inicio, de acuerdo a mi experiencia considero que funciona mejor.

1. Creación de un repositorio

Como primera acción debemos crear un repositorio, en mi caso lo voy a realizar desde la terminal, el cual será abierto dentro de una carpeta que ha sido seleccionada para ser un repositorio. Luego solo utilizo el siguiente comando.

$ kart init

Luego abrimos en QGIS nuestro panel de repositorios y podemos elegir la opción de «Add existing repository…», ubicando la carpeta destinada para tal fin.

Incorporando un repositorio existente

2. Incorporación de datos a nuestro repositorio

Una vez que tenemos algún repositorio disponible en nuestro panel de repositorios, vamos a seleccionar la opción denominada «Import layer into repo…«.

Importando capas dentro del repositorio

Para nuestro ejemplo disponemos de algunas capas vectoriales en formato Geopackage, los cuales serán incorporados a nuestro repositorio y luego lo podemos incluir a nuestro proyecto de QGIS para visualizarlo.

Capas incorporadas al repositorio

3. Acceder al historial de nuestro repositorio

Los cambios realizados en un comienzo dentro del repositorio consistió en la incorporación de nuevas capas, eso lo podemos apreciar si dentro del panel ingresamos a la opción «Show log…«.

Vista del historial de cambios

4. Vista de los cambios realizados

Si bien podemos apreciar la lista de los cambios, si necesitamos que nos muestren de manera visual y con mayor detalle algún cambio realizado a nuestras capas, desde la vista del historial podemos seleccionar uno de ellos y luego haciendo un clic derecho ingresamos a la opción «Show changes introduced by this commit…«. A manera de ejemplo a una capa que representa centros poblados, se editó incorporando un valor de población en el campo respectivo, esa modificación se puede apreciar en la siguiente figura.

Vista del cambio en la tabla de atributos

Cuando el cambio es realizado sobre la geometría de la capa, podemos también visualizar la diferencia entre la versión anterior y la nueva empleando transparencias. En la siguiente figura se muestra la modificación de los vértices de un polígono para aumentar el área de una parcela de cultivo.

Vista de los cambios a la geometría de una capa

5. Creación de ramas

Una de las principales ventajas que nos presenta el uso de un VCS es la posibilidad de crear ramas «Branchs«, con la finalidad de realizar algunos cambios sin alterar la rama principal. Una nueva rama puede ser creado a partir de un commit realizado.

Creación de una rama

Una vez que hemos creado nuestra rama, podemos elegir hacer cambios solo en dicha rama, para ello empleamos la opción de «Switch branch..,» y luego /seleccionamos la rama sobre el que vamos a trabajar, en nuestro panel de repositorios se mostrará la rama activa, en este caso hemos creado la rama «update_parcelas«.

Activación de nuestra rama creada

Luego de hacer todos los cambios que deseamos dentro de la rama, tenemos la opción de unirlo a nuestra rama principal «main«, para ello primero debemos cambiarnos a dicha rama para que la unión «merge» se realice con éxito.

Unión a nuestra rama principal los cambios realizados en la rama creada

6. Retornando a una versión anterior

Desde nuestro historial podemos deshacer los cambios realizados a partir de un commit específico, para retarnar a una versión anterior, siendo esto otra de las principales ventajas de usar un sismtea de control de versiones.

Seleccionando al commit que deseamos retornar

Luego de ejecutarlo vamos a ver que volvemos a un estado anterior a los últimos cambios realizados a la capa, en este caso justo cuando se realizó la unión de nuestra rama creada a la rama principal, para incorporar la creación de dos nuevos polígonos.

Comprobando el retorno a una versión anterior.

Reflexión Final

No cabe duda que el uso del complemento de QGIS Kart, nos facilita mucho la interacción con el repositorio y los datos con que deseamos trabajar, pero si es muy importante que para quienes no han tenido experiencia alguna en el uso de un sistema de control de versiones, entiendan sus fundamentos, para que puedan sacar el mayor provecho a esta herramienta. En lo particular considero que cuenta con las principales opciones para llevar un control de los cambios que podamos realizar a nuestras capas, pero quizás en algunas ocasiones será necesario combinarlo con el tipeo de los comandos desde una terminal. En mi experiencia personal puedo mencionar dos cosas que no me funcionaron como hubiera querido, una de ellas fue la creación del repositorio y la segunda cuando intenté importar una capa geopackage que contenía más de una tabla, siendo en ambos casos solucionados al emplear comandos en la terminal. En resumen, siendo un complemento reciente estoy seguro que vendrán pronto algunas novedades, por lo pronto, los invito a probarlo.

Se elaboró un video sobre mi experiencia usando este complemento.

Uso de VegaLite para visualizar mapas

Tabla de contenidos

Introducción

Como lo prometimos en la entrada previa, vamos a profundizar una de las herramientas de Julia para generar gráficos, el mismo que esta presente como parte del paquete Queryverse, nos referimos a VegaLite.jl. Con el objetivo de mostrar todo el camino seguido para lograr nuestros resultados, voy a iniciar planteando el reto de generar mapas empleando VegaLite y algunos paquetes ya vistos previamente, de la misma manera, asumo que mi fuente de datos lo conforman dos capas de datos vectoriales, una de los límites distritales del Departamento de Huánuco en Perú (polígono) y otra de centros poblados (puntos) presentes en el mismo ámbito. Por otro lado, a diferencia de la última entrega, ahora vamos a elaborar un notebook con Pluto, con la finalidad de hacerlo digamos más interactivo.

Características Principales del VegaLite.jl

El paquete se basa en Vega-Lite, que extiende una gramática tradicional de API de gráficos a una gramática de gráficos interactivos (preimpresión). Junto con Vega-Lite, hay soporte básico para gráficos Vega. Como lo menciona su documentación, VegaLite.jl le permite crear una amplia gama de gráficos estadísticos. Expone la funcionalidad completa del Vega-Lite subyacente y, al mismo tiempo, está estrechamente integrado en el ecosistema de Julia.

Una de las principales diferencias al usar Vega-Lite es contar con una sintaxis JSON declarativa y concisa para crear una gama expresiva de visualizaciones para el análisis y la presentación de datos. Las especificaciones de Vega-Lite describen visualizaciones como asignaciones de codificación de datos a propiedades de marcas gráficas – Mark (por ejemplo, puntos o barras). Vega-Lite esta diseñado para admitir el análisis de datos, por lo tanto, admite tanto transformaciones de datos (por ejemplo, agregación, agrupamiento, filtrado, clasificación) como transformaciones visuales (por ejemplo, apilamiento y facetado). Además, las especificaciones de Vega-Lite se pueden componer en pantallas en capas y multivista, e interactuar con las selecciones [1].

Procedimiento:

Fuente de Datos

Como lo mencionamos, partiremos de dos capas de tipo vectorial, una de polígonos (dist_huanucof.geojson)y otra de puntos (ccpp_huanuco.gpkg). Nos apoyaremos del software QGIS para preparar nuestros datos y pueden ser empleados con el paquete VegaLite.jl.

Fig. 1: Fuente de datos

El paso siguiente fue convertir nuestra capa de polígonos en un formato de tipo topojson, siendo uno de los formatos que nos permite trabajar como fuente de datos en Vega-Lite [2]. Para lograrlo vamos a usar un Plugin de QGIS denominado TopoJSON Writer, con la finalidad de tener nuestro archivo con el formato requerido.

Fig.2: Uso del plugin TopoJSON Writer

Luego, nuestra capa de centros poblados que está en formato Geopackage, debemos exportarlo a un formato CSV, para lograrlo simplemente lo hacemos en QGIS seleccionándolo desde el panel de capas y activamos la herramienta de Exportar–> Guardar objetos como…, en la próxima vista en la opción de Formato, seleccionamos CSV.

Uso de Pluto

En mi canal se elaboró un video sobre lo básico de Pluto, por lo tanto, voy asumir que conocen algo sobre como trabajar Notebooks con Pluto, entonces comencemos con el código en Julia, primero activamos Pluto con using Pluto y luego Pluto.run().

fig.3: Vista de Pluto con las primeras celdas

Como se aprecia lo que quiero resaltar en esta primera vista, es que luego de tener nuestra capa que fue convertida a un formato topojson, se debe editar la extensión a json. Es importante mencionar que en los ejemplos de la documentación oficial, la fuente de datos que emplean son extraídos desde una lista que están disponibles de forma directa usando el paquete VegaDatasets. Pero nuestro objetivo fue que VegaLite pueda leer nuestro capa en formato topojson, para ello, revisando posibles ayudas en la red, encontré una solución desde un foro de Julia y la puse en práctica. Como podemos ver, tuve que emplear el paquete JSON, luego como se puede ver, nuestro archivo ya fue reconocido como un VegaJSONDataset.

Generando los primeros gráficos con VegaLite

Ahora que contamos con nuestra fuente de datos en el formato que lo puede reconocer VegaLite, iniciamos una sintaxis relativamente sencilla para generar nuestro primer gráfico. El reto era mostrar el mapa de los Distritos del Departamento de Huánuco.

fig. 4: Primer mapa generado con VegaLite

De lo que podemos apreciar en el código, resalto el hecho que como lo mencionamos en las características del Vega-Lite, podemos definir una «marca gráfica» a representar (Mark), para nuestro caso es Geoshape, la cual representa formas arbitrarias cuya geometría está determinada por datos de formas GeoJSON especificados que se proyectan desde coordenadas geográficas a píxeles. Luego existen indicaciones para incluir título y también para definir las dimensiones de nuestro «lienzo» con width y height. Ahora un punto sensible es cuando debemos indicar la data que debe considerar, en este caso como se aprecia en la fig. 3, el objeto «d» corresponde a nuestra capa de polígonos y que corresponde a un formato topojson. En el caso de feature, si abrimos nuestro archivo convertido, podemos apreciarlo, siendo representado por el objeto que presenta un tipo de geometría (multipolígono).

fig.5: Identificación de la propiedad feature.

Como se trata de datos geoespaciales, debemos definir el sistema de referencia o proyección. Una lista de valores en relación al tipo que debemos emplear lo pueden revisar aquí. En nuestro caso empleamos el denominado «Mercator«.

Para hacerlo más interesante, vamos a incluir los datos de centros poblamos a nuestro mapa, por lo tanto, necesitamos preparar los datos para ser empleados con VegaLite. En este caso estamos empleando las funciones que viene incluida en el paquete CSVFiles.

fig.6: Uso del paquete CSVFiles para abrir un archivo delimitado por comas.

Ahora vamos a generar un mapa con los distritos juntos a los centros poblados.

fig.7: Mapa integrando dos capas de datos vectoriales, límite distrital y centros poblados

Como se aprecia en el código, vemos que podemos dividirlo para contar con una sintaxis más fluida, luego lo podemos unir con «+«, pero lo importante aquí es que además de la marca Geoshape, ahora hemos agregado la marca Circle, indicando que la fuente se refiere a la capa de centros poblados (puntos) que fue definida según lo visto en la fig.6. Por lo tanto, es importante indicarle los campos en donde se encuentras las coordenadas que representan dichos puntos, la indicación «:q«, se refiere a valores cuantitativos (quantitative). Luego se aprecia algunas propiedades relacionadas a temas de estilos.

Aplicando filtros para ser integrado a nuestro mapa

Ahora necesitamos integrar otros datos que sean extraídos de nuestras propias fuentes, para ello vamos a usar filtros gracias a las funciones disponibles en el paquete Query.jl.

fig.8: Uso de filtros empleando el paquete Query.

Ahora podemos definir nuestro objeto que será empleado en nuestro próximo mapa.

fig.9: Vista de los campos de datos como resultado de aplicar filtros.

Finalmente vamos a generar un mapa con todo lo que tenemos hasta ahora.

fig.10: Definición de propiedades más avanzadas a nuestro mapa.

Se presenta la parte del código que fue modificada para obtener nuestro resultado final. Como podemos ver, en esta oportunidad primero estamos coloreando los centros poblados en función a la provincia que pertenecen (ver la propiedad de color), luego vamos a incluir una leyenda en función para ver los nombres y los colores que fueron empleados. Seguidamente apreciamos que para nuestros datos filtrados (cp_cap), vamos a representarlos en función a sus valores cuantitativos de población y relacionados a la propiedad de tamaño (Size), es decir a mayor población el punto tendrá un mayor «tamaño» y todos ellos de color rojo. Al final también decidimos incluir etiquetas, para ello usamos la marca Text, y como se puede apreciar se incluye diversas propiedades para contar con una mejor visualización. El resultado se aprecia en la siguiente figura:

fig.11: Vista del mapa final elaborado con VegaLite

Para poder incluir nuestro mapa en algún informe o presentación podemos guardarlo en un formato de imagen. Empleando la función save se guardó en formato SVG para tener una mejor calidad de visualización de nuestro mapa.

fig.12: Guardando nuestro mapa en formato SVG.

Reflexión Final

En Julia tenemos muchas opciones para generar gráficos, VegaLite nos muestra quizás una de las maneras más distintas pero potente para ser trabajado. Reconozco que al comienzo fue complicado entender la sintaxis, pero nada como la práctica para irse familiarizando, en especial porque podemos tener una gráfico de manera simple en pocas líneas y si seguimos una estructura de manera ordenada podemos ir subiendo en complejidad pero a su vez un gráfico mucho mejor elaborado. No quiero dejar de mencionar que todo el código lo pudimos ejecutar instalando solamente los paquetes de Queryverse y JSON, pero quise mostrarles los paquetes de manera individual para que lo vayan conociendo a mayor profundidad, sobre todo sus utilidades específicas.

Bueno, espero que haya contribuido en el conocimiento de éstas herramientas, aunque no tengo pensado cual sería mi próxima entrada, estoy seguro que buscaré que sea alguna herramienta que sea de mucha utilidad. Todo los datos para que puedan reproducirlo esta en un repositorio que fue creado para este ejemplo (https://github.com/ccarbajal16/vegalite_pluto ). Hasta la próxima.


[1] https://vega.github.io/vega-lite/
[2] https://vega.github.io/vega-lite/docs/data.html

Introducción a la ciencia de datos con Julia- Parte 2

Introducción

En esta oportunidad vamos a continuar presentando las opciones que tenemos empleando paquetes de Julia orientados a la ciencia de datos. Se tiene como principal objetivo lograr obtener resultados similares a los vistos en el post anterior, pero en esta oportunidad realizarlo en menos pasos aprovechando las ventajas de algunos paquetes que nos permiten desarrollar código digamos «encadenado» para una ejecución simultánea de operaciones, con la finalidad de preparar tablas de resultados según algunos criterios establecidos. Por otro lado, nos plantemos el reto de incluir la siguiente etapa del llamado «Proceso de análisis de datos«, es decir, la visualización a través de la generación de gráficos, los mismos que vamos a incluir como parte del código elaborado.

Encadenamiento de código en Julia

En Julia como ya lo venimos adelantando existe la opción de «encadenar» código empleando los llamados operadores Pipe (|>). Para lograr nuestro objetivo vamos a emplear otros paquetes de Julia, nos referimos a Queryverse, siendo uno de los más completos para ciencia de datos. De la misma manera exploraremos al paquete Chain.jl como otra alternativa en manipulación de datos encadenando código. En resumen vamos a demostrar las ventajas que tenemos al usar dos alternativas, primero la combinación DataFrames+DataFramesMeta y luego el uso del paquete Queryverse, que incluye varios paquetes para el manejo de datos tabulares, incluyendo la posibilidad de generar gráficos.

Uso de DataFramesMeta.jl

Si revisamos la documentación del paquete DataFramesMeta, apreciamos que @chain desde Chain.jl, forma parte de la lista de macros disponibles, es decir que podemos emplearlo para unir más de un macro a la vez. A continuación compartimos el código elaborado en Julia, con la diferencia que emplearemos otra fuente de datos, el mismo presenta mayores detalles como por ejemplo la altitud de los centros poblados.

Si revisamos el código, vemos que iniciamos con el uso de los paquetes DataFrames y CSV para incorporar nuestros datos (table_ccpp_inei.csv), luego empleamos el macro @chain con la finalidad de ir encadenando macros como funciones. Un paso importante es el uso del macro @combine, que a diferencia de lo que vimos anteriormente, nos facilita crear y nombrar nuevas columnas definiendo simplemente funciones sobre nuestras columnas de origen. Para el caso del ordenamiento, se menciona la existencia del macro @orderby, pero al no funcionar sobre datos agrupados, empleamos el ya conocido sort. De la misma manera apreciamos el uso del macro @subset, que nos permite realizar filtros, seleccionando un subconjunto de filas sobre las columnas con valores numéricos. También empleamos el macro @transform para incorporar nuevas columnas de datos realizando algunas operaciones, teniendo la ventaja de poder asignar directamente los nombres a las nuevas columnas.

El resultado de este código se aprecia en la siguiente figura:

Uso del Queryverse.jl

Como lo menciona su documentación oficial, Queryverse.jl es un metapaquete que reúne varios paquetes para manejar datos en Julia, teniendo como su principal objetivo facilitar la instalación de todo el Queryverse de una vez. En el presente post exploraremos algunos de las ventajas de éstos paquetes, en especial para la manipulación de datos y la visualización. Para mostrar todo el ecosistema de Queryverse con los paquetes que lo integran se elaboró el siguiente diagrama.

Según información de: https://www.queryverse.org/packages/

Vamos a compartir el código en donde empleamos Queryverse, el mismo asume que fue instalado, siguiendo los pasos ya vistos anteriormente.

En este código hay muchas cosas por analizar, empezaremos con el hecho que solo hemos activado un solo paquete, pero como ya vimos integra varios otros que nos permiten trabajar. Como se aprecia el código se inicia con abrir nuestra tabla de datos, ahora simplemente usamos load(), esto gracias al paquete CSVFiles.jl, desde aquí empezamos a encadenar procesos, siendo uno de los primeros la realización de un filtro doble con @filter, que forma parte del paquete Query.jl, como la mayoría que estaremos usando. Algo nuevo que vemos sucede luego de hacer el agrupamiento con @groupby, porque debemos generar una named tuple, para establecer nuestras columnas de datos agrupados, emplearemos para eso el macro @map y dentro de { } definimos los valores.

Para el caso del ordenamiento de datos, vamos a emplear @orderby_descending sobre el campo donde se almacena la suma de la población por distrito, logrando tener los valores mayores en las primeras filas. Ahora viene algo interesante, el uso del macro @tee, que en realidad si apreciamos el código fue empleado durante la generación de salidas, pero que nos permite que el código no se cierre y pueda realizar otras acciones, en nuestro caso, queríamos generar un gráfico, pero antes, guardar en formatos tanto de CSV como XLSX nuestro resultado.

En relación a la generación de gráficos, ahora simplemente generaremos un simple gráfico de barras a través de VegaLite.jl usando @vlplot, pero que en una próxima entrega será dedicado a mayor profundidad este como otros paquetes similares. Finalmente, tenemos la oportunidad también de salvar nuestro gráfico en formato PNG.

Reflexión Final

En esta oportunidad se pudo ver la gran flexibilidad que tenemos al emplear sobre todo Queryverse, aunque el uso de macros con DataFramesMeta nos permite realizar operaciones rápidas aprovechando sobre todo si trabajamos con DataFrames. Algo que no debo dejar de pasar, es el hecho que es muy recomendable no mezclar ambos procedimientos o conjunto de paquetes, sobre todo porque existen algunos macros que pueden originar conflictos por tener la misma denominación. En resumen, a pesar que solo es una introducción, hemos vistos varias cosas interesantes, aunque es verdad, podemos seguir explorando y profundizando mucho más, además está todavía pendiente el dedicarle toda una entrada al proceso de visualización de datos, por ahora solo se incluyo un simple gráfico de barras, pero Julia tiene todo un ecosistema muy variado para realizar todo lo que nos podemos imaginar.

Para quienes deseen reproducir todos los códigos, se actualizó el repositorio https://github.com/ccarbajal16/IntroDataScience. Muy pronto también se elaborará un video al respecto.

Introducción a la ciencia de datos con Julia-Parte 1

Tabla de contenidos

Introducción

En esta oportunidad iniciare una serie de entradas ligadas a la ciencia de datos empleando el lenguaje Julia, siendo una importante motivación la posibilidad de explorar una alternativa que me permite analizar distintos tipos de datos, siendo mi especial interés aquellos que tienen el componente espacial. En los últimos meses le estuve dedicando tiempo a conocer mejor a Julia y como producto de ello quiero compartir parte de lo aprendido, siendo mi deseo el seguir escribiendo sobre las ventajas que tenemos con Julia. Como primeras acciones se han elaborado un par de vídeos sobre su instalación y los primeros pasos que debemos considerar para iniciarnos en esta aventura.

Proceso de análisis de datos

En esta primera parte me pienso enfocar en tres fases dentro del conocido como proceso de análisis de datos: Importar, Ordenar y Transformar.

Si lo vemos dentro de un flujo, el mismo que corresponde a las etapas definidas por Hadley Wickham, resaltamos en la siguiente gráfica lo considerado por ahora.

Fuente: Ciencia de Datos para Gente Sociable – Antonio Vasquez Brust

Procedimiento

Si bien nos enfocaremos en el uso de Julia, por la naturaleza de los datos iniciaremos apoyándonos en otras herramientas. Los datos a emplear tienen un componente geográfico, por lo tanto, empleará el software QGIS, con la final de realizar un preprocesamiento necesario.

Fuente de Datos – Uso de QGIS

Como fuente de datos vamos a considerar los siguientes:

Como parte de la preparación de nuestros datos para un posterior análisis se ha creado un Proyecto en QGIS con la incorporación de un grupo de capas, tal como se aprecia en la siguiente figura.

El procedimiento seguido para obtener dichas capas a partir de los datos descargados se puede resumir en las siguientes figuras.

Las capas que corresponden a dist_huanuco, prov_huanuco y dep_huanuco, fueron obtenidos desde los datos libres del OpenStreetMap. En QGIS empleamos el plugin QuickOSM para realizar la extracción de elementos que corresponden a los mismos.

Vista del uso del plugin QuickOSM

Al final, todas las capas que fueron preprocesadas en QGIS fueron exportados al formato GeoJSON y de manera adicional las capas que presentan geometría de puntos fueron exportados en un formato tipo CSV.

Exportando a formato CSV

Julia con Visual Studio Code

Ahora que tenemos los datos que vamos a emplear en nuestra carpeta de trabajo, vamos abrir el mismo empleando Visual Studio Code. En la actualidad considero que es una de las mejores opciones para trabajar Julia, en especial por la facilidad que tenemos para incorporar extensiones que permiten tener un mejor entorno de trabajo. Para nuestro objetivo voy a dividirlos en extensiones que son necesarios y aquellos recomendados, los últimos buscan principalmente mejorar la visualización de nuestro código.

  • Necesarios: Julia, Jupyter, Geo Data Viewer, HTML Preview, Office Viewer, Tabnine.
  • Recomendados: Julia Color Themes, Better TOML, Rainbow End, Prettify JSON, Rainbow CSV, Better Comments, vscode-icons

Luego de instalar las extensiones necesarias en VSCode, debemos realizar los siguientes pasos:

  1. Abrir la vista del terminal (habilitarlo desde el menú view)
  2. Iniciamos el REPL (por defecto se usa Alt + j Alt + o)
  3. Activamos nuestro entorno en nuestra carpeta (usamos la tecla ] y luego activate .)
  4. Dentro de nuestro entorno iniciamos la instalación de los paquetes de Julia requeridos, solo ingresamos el comando add seguido del nombre del paquete. Para esta primera parte usaremos los siguientes: IJulia, CSV, ArchGDAL, DataFrames, DataFramesMeta, PrettyTables)
  5. Luego ejecutamos el comando status, para verificar que todos los paquetes fueron instalados.
  6. Finalmente verificamos que se han generado dos archivos, el Project.toml y el Manifest.toml (incluyen información de los paquetes instalados como las dependencias, versiones, compatibilidad, nombres, etc.).

Es importante resaltar que al contar con Project.toml + Manifest.toml, es posible crear una instancia del mismo entorno de paquetes, lo cual es muy útil para la reproducibilidad.

Importación de datos

En Julia tenemos a las extensiones de CSV, DataFrames y ArchGDAL para apoyarnos en la importación de datos que tenemos en nuestra carpeta de trabajo. Para el caso de archivos en formato CSV podemos emplear el siguiente código.

En el caso que necesitemos trabajar con formatos de tipo GeoJSON, emplearemos el paquete ArchGDAL, que usa la librería GDAL para trabajar con diversos formatos de datos geoespaciales vectoriales y ráster.

Considerar que el resultado a diferencia del anterior, se incluye una columna con la geometría de los datos (wkbPoint). Se recomienda ejecutar typeof(dat_geo) y typeof(layer_geo), para conocer los tipos de datos generados.

Para realizar una exploración a nuestros datos en nuestro Dataframe emplearemos la función describe, obteniendo una tabla en donde se presenta algunos datos estadísticos, pero lo que quiero resaltar es la identificación de datos faltantes en algunas columnas.

Generando Tablas en formato HTML

Con la finalidad de ir visualizando nuestros resultados tabulares, vamos a generarlos en un formato más amigable como el html, para ello empleamos el paquete PrettyTables. Para automatizar la generación y posterior guardado de nuestras tablas usaremos una función específica, aunque en su documentación mencionan el procedimiento para guardar las tablas, para la función debo reconocer que seguí las indicaciones mostradas por el canal julia for talented amateurs.

Ordenar los datos

En Julia podemos ordenar rápidamente nuestros datos empleando la función sort, el uso de «!» seguido de la función indica una solicitud para cambiar los datos originales de manera permanente, en otras palabras, es considerado como la versión «in-place«. De la misma manera vamos a emplear la función dropmissing para eliminar los datos faltantes a nuestro Dataframe. Ambos resultados serán guardados en html.

Transformar los datos

En Julia para realizar una operación de agrupamiento, primero se debe crear un objeto GroupedDataFrame a partir del DataFrame empleando la función groupby. La función toma dos argumentos, el mismo DataFrame y un conjunto de columnas para agrupar. Luego se puede aplicar a cada grupo las funciones Combine, Select y Transform. En nuestro caso vamos a usar el primero, siendo muy útil para calcular estadísticas resumidas por grupo. Mayor detalle sobre la opciones de dichas funciones lo pueden encontrar aquí.

Como podemos apreciar en nuestro último resultado, no existe una columna que enumere las filas, por lo tanto, vamos a crear una columna índice, de la misma manera, al crear la columna en donde se sumaron los valores de población por distrito (name) y se identificaron los valores únicos (pe_ubigeo), por defecto se nombraron dichas columnas, en nuestro caso vamos a modificar los encabezados empleando la función rename. También vamos a convertir la última columna para que represente un valor de tipo String y finalmente el resultado lo guardaremos en un archivo con formato CSV.

Uso de Macros

Sobre herramientas de metaprogramación para DataFrames, Julia a través de los denominados macros presentes gracias al paquete DataFramesMeta, nos brinda la oportunidad de contar con una sintaxis más conveniente. En esta oportunidad exploraremos una de sus bondades como por ejemplo el uso de filtros y también opciones que tenemos para encadenar procesos (uso de operadores «Pipe«). En posteriores entradas profundizaré estos temas con otros paquetes, por ahora solo es un ejemplo básico pero muy útil.

Incorporando tablas a nuestro mapa

Como punto adicional, quisiera mostrarles la ventaja que tenemos ante la posibilidad de incorporar tablas en formato html a nuestro compositor de mapas en el QGIS. A continuación se muestra una imagen como ejemplo.

Reflexión Final

Considero que lo presentado hasta el momento nos puede dar una idea del gran potencial que tenemos al manejar nuestros datos empleando algunos paquetes de Julia. Para quienes ya tienen conocimiento de Python y R, se habrán fijado cierta similitud, incluso al leer la documentación de los paquetes de Julia, algunos de ellos fueron inspirados en dichos lenguajes. Si llegaron hasta aquí espero que haya despertado el interés en el uso de Julia, porque como dije, esto solo es el inicio de un grupo de entradas en donde me dedicaré a explorar otros paquetes que nos permitan realizar otro de los procesos importantes como la visualización.

Para quienes deseen probar todo lo visto hasta el momento, se ha generado un repositorio en donde se comparte todo el código y el proyecto de QGIS para visualizar el mapa. https://github.com/ccarbajal16/IntroDataScience.

También comparto un video elaborado sobre el procedimiento seguido.

Algoritmos de selección de puntos en QGIS

Introducción

Una de las principales funciones de los Sistemas de Información Geográfica (SIG) es la posibilidad de realizar análisis espacial. En esta oportunidad, con el ánimo de introducirnos al campo del análisis de datos empleando capas de tipo vectorial, vamos a mostrar el uso del plugin de QGIS denominado Point selection algorithms. En resumen, vemos que es posible realizar diversos procesos de selección sobre una capa de puntos, empleando para ello un grupo de algoritmos que iremos explorando. Tal como lo mencionan en [3], dentro del contexto de la elaboración de mapas web, un desafío es la implementación de una regla que seleccione geometrías de puntos, por ejemplo, ciudades y picos con un atributo numérico claramente definido, por ejemplo, población y elevación, para ser empleados en dicha selección.

Detalles del Plugin

El plugin contiene herramientas para el cálculo de medidas para seleccionar puntos en el proceso de generalización cartográfica. Generalmente, ayuda a encontrar el máximo o mínimo local. Esta función también se puede utilizar con fines analíticos [1]. Cuando instalamos el plugin apreciamos en la caja de herramientas de procesos cuatro opciones, pero que en esencia digamos que son tres algoritmos que nos permite realizar distintos tipos de selección de puntos.

Figura 1: Plugin dentro de la caja de herramientas de procesos de QGIS.

Discrete Isolation:

Calcula la distancia de aislamiento discreta (discrete isolation distance) para puntos con atributos numéricos. El concepto es similar al aislamiento topográfico (topographic isolation), el cual, para el caso de cumbres, corresponde a la distancia desde un pico hasta el punto más cercano con mayor elevación. Se puede tener una mejor comprensión si vemos la siguiente figura.

Figura 2: Aislamiento topográfico y prominencia de una cumbre
Fuente: Wikipedia

En general, cuando ejecutamos la opción en QGIS, debemos tener claro que el aislamiento es la distancia desde un punto al punto más cercano con un valor de atributo más alto (opción Máx.) O más bajo (opción Mínimo). Como valor de atributo se puede utilizar cada atributo numérico, por ejemplo, la elevación (para picos) o la población (para lugares poblados). La distancia de aislamiento se puede calcular en metros según el elipsoide por defecto o cartesiano en las unidades CRS. En la siguiente imagen por ejemplo, podemos ver que se ha seleccionado en base a datos de picos de montañas como puntos, los valores de elevación como atributo numérico y el valor de «máximo aislamiento» el valor de 50 km, es decir que nos calculará las distancias entre puntos que tengan este valor como el máximo encontrado.

Figura 3: Opciones para calcular el aislamiento discreto

Functional Importance:

Calcula la importancia funcional según Hormann, almacenando la mayor diferencia de valores de la función. Si revisamos la referencia [3] se puede apreciar la función mencionada.

    \[f(x) = p * e^\frac {-x^2}{\beta}\]

x = distancia existente entre nuestra geometría de puntos

p = valor del atributo numérico (por ejemplo, la población)

β = variable para ajustar la rapidez para reducir el valor de la distancia y mantener la distancia entre los puntos cercanos.

En la misma referencia, se muestra de manera visual el método de distancia funcional, empleando como ejemplo valores numéricos de población (parámetro p) y al realizar ajustes a la variable β, logra ajustar la carga de información y la distancia mínima entre puntos que se mostrarán en el mapa. La población da como resultado la selección o no del punto, siempre que exista la condición que la diferencia entre los valores de la función debe ser mayor que cero.

Para emplear el plugin, el campo con valores numéricos debe ser en caso de un lugar poblado el número de habitantes (population). El valor de Beta (β) es el diámetro del círculo alrededor del punto en metros; considerar que tiende el valor de la función hacia cero. Utilice este parámetro para asegurar una distancia mínima entre lugares, que debe seleccionarse.

Figura 4: Opciones para calcular la importancia funcional.

Label Grid:

Crea una cuadrícula y comprueba cual de los puntos está contenida en alguna celda de la misma (un valor de -1 representa que el punto no se encuentra en la celda). Según la opción que elegimos, es decir, si optamos por el valor máximo, se establece un orden o ranking empezando con el número 1 correspondiente al valor más alto y se irá incrementando por cada punto que esté presente en la celda. En QGIS debemos considerar generar dos columnas para almacenar los resultados, en una se establece una clasificación realizada, con la finalidad de establecer un agrupamiento de valores, mientras que en la otra columna se incorpora el orden mencionado para cada celda. En la siguiente figura podemos apreciar la definición de los requisitos, entre ellos se seleccionó los valores máximos, el tamaño y forma de la celda. También debemos indicar las columnas para almacenar los resultados y finalmente indicar los nombres de los archivos, uno con una capa vectorial (polígono) que corresponde a la cuadrícula y el otro de puntos con los valores resultantes.

Figura 5: Opciones para la creación de la cuadrícula etiquetada.

Point in Polygon:

Tiene el mismo concepto del algoritmo previo, con la diferencia que ahora tenemos la oportunidad de emplear un polígono o una cuadrícula predefinida, siendo muy útil si queremos analizar por ejemplo ámbitos conocidos. En nuestro caso lo hicimos empleando polígonos que representan los limites de distrito de una Región en Perú, tal como se aprecia en la siguiente figura.

Figura 6: Vista de las opciones y resultados empleando un polígono predefinido

Metodología

Como escenario o ámbito que usamos para explorar el plugin se ha elegido zonas de Perú, para los datos de población nos enfocados sobre la Región de Huánuco, mientras que los datos extraídos de picos (peaks), están en su mayoría sobre la Región de Ancash, este último muy conocida por sus nevados.

Colección de Datos

Para esta demostración en relación a los datos de población se emplearon los que están disponibles en https://data.humdata.org/, al filtrar para este tipo de datos seleccionamos la mencionada en la referencia [5]. Estos datos a nivel mundial nos permite tener un geopackage con celdas de hexágonos que contienen valores de población. De toda esa información, se trabajó solo las que se encontraban solo la zona de trabajo, según se puede apreciar en la siguiente figura.

Figura 7: Datos de población en celdas de hexágonos sobre la Región de Huánuco

Como se estuvo mencionando, requerimos datos de puntos, por lo tanto, se hizo la transformación a puntos empleando herramientas como el Centroide o Punto en superficie. Ahora solo nos queda ajustar mejor nuestros datos a una superficie más definida, es decir, consideramos solo los puntos que estén dentro de la Región Huánuco. Al realizar las primeras pruebas, se comprobó que debido al volumen de datos los algoritmos demoraban en terminar de procesar, ante ello, se trabajó también con otros datos de población en función a centros poblados.

Para los datos de picos nos apoyamos con la extracción de datos del OpenStreetMap, pero desde QGIS se usó el plugin QuickOSM para contar con una capa en formato GeoJSON, luego se hizo un preprocesamiento para ajustar mejor el ámbito seleccionado y también algunos ajustes a la tabla de atributos.

En caso quieran probar el plugin, pueden descargar los datos empleados desde aquí.

Resultados Obtenidos

Como producto final de ejecutar los algoritmos descritos, mostramos a continuación una galería de imágenes, pero en resumen, se aprecia que el plugin nos permitió mostrar resultados esperados y un análisis profundo de todos ellos es necesario, también es importante mencionar que se emplearon una simbología de tipo graduado para mostrar mejor los resultados.

Reflexión Final

Por lo mostrado podemos darnos cuenta de que el plugin presenta más aplicaciones que lo visto hasta ahora, si nos ponemos a pensar en otros tipos de valores numéricos que podemos tener registrado como producto de nuestras actividades, esto sumado al hecho que no estamos limitados que deban ser por naturaleza puntos, ya vimos que podemos generarlos fácilmente, porque lo importante es evaluar una variable. En resumen, si logramos entender su uso nos abre un gran abanico de posibilidades para analizar datos y la relación existente con su espacio. Espero que puedan encontrar otras aplicaciones prácticas y lo comenten al respecto.

Se comparte un video en donde se pueda apreciar el procedimiento seguido para obtener los resultados presentados.

Referencias:

  1. Plugin QGIS: https://plugins.qgis.org/plugins/point_selection/
  2. Repositorio del Plugin: https://github.com/MathiasGroebe/point_selection
  3. Paper ICA: https://varioscale.bk.tudelft.nl/events/icagen2020/ICAgen2020/ICAgen2020_paper_12.pdf
  4. Wikipedia: https://es.wikipedia.org/wiki/Aislamiento_topogr%C3%A1fico
  5. Datos de población global:https://data.humdata.org/dataset/kontur-population-dataset

Visualizando datos en formato GTFS con QGIS

En esta oportunidad abordamos la temática sobre el transporte público y una alternativa para su representación espacial, en este caso nos referimos a una especificación de datos conocida por sus siglas en inglés como GTFS (General Transit Feed Specification), el cual define un formato común para los horarios de transporte público y la información geográfica relacionada. Según (1), permite a las agencias de transporte público publicar sus datos de tránsito en un formato que puede ser consumido por una gran variedad de aplicaciones de software. Hoy en día, el formato de datos GTFS es utilizado por miles de proveedores de transporte público.

Según (3), un feed es un formato de datos utilizado para proporcionar a los usuarios contenidos actualizado con cierta frecuencia. Dentro del ámbito del estándar GTFS existen dos tipos:

  • Feeds GTFS estáticos, que son es una serie de archivos CSV, comprimidos en formato ZIP, con diferentes niveles de detalle según la precisión facilitada por las empresas o agencias que lo provean.
  • Feeds GTFS-realtime, que proporcionan tres tipos de información actualizada en tiempo real sobre los servicios, como predicciones de llegada (actualización del viaje), posiciones de vehículos y avisos de servicio (alertas).

Principales Aplicaciones (Fuente: Wikipedia)

  • Planificación de viajes, GTFS se utiliza normalmente para proporcionar datos sobre el transporte público para su uso en aplicaciones de planificación de viajes multimodales.
  • Investigación de accesibilidad del tránsito, GTFS es usado para estimar los tiempos de viaje en tránsito desde un punto a muchos otros puntos en diferentes momentos del día.
  • Comparación de niveles de servicio, un análisis de los cambios en el servicio a lo largo del tiempo se puede lograr simplemente comparando los datos GTFS publicados para la misma agencia en diferentes períodos de tiempo.

Estructura de los GTFS

Un feed GTFS es una colección de al menos seis y hasta 13 archivos CSV (con extensión .txt) contenidos en un archivo .zip. La codificación de caracteres preferida es UTF-8. En conjunto, las tablas CSV relacionadas describen las operaciones programadas de un sistema de tránsito como visibles para los pasajeros.

DIAGRAMA DE CLASES DE GTFS
Fuente: Wikipedia

Uso de Plugins con QGIS

Dentro de QGIS existen un grupo de plugins que nos permiten capturar, generar, visualizar y hasta modelar este tipo de datos GTFS. En esta oportunidad se describirá con cierto detalle a dos plugins. Hablamos del denominado GTFS Loader y del GTFS-GO.

1. GTFS Loader

El plugin nos permite abrir un archivo con la extensión .zip, el mismo que contiene la estructura de datos GTFS indicada previamente. Según la documentación del Plugin, una de las fuente de datos a emplearse sería la página del PID.

Otras fuentes de datos que podemos emplear son:

Dentro del QGIS luego de ser instalado nos aparece un pequeño panel que nos permite ingresar la ruta de acceso al archivo en formato GTFS. En la siguiente imagen se presenta un ejemplo de la ciudad de Sao Paulo en Brasil que fue descargada previamente desde aquí. Tener en cuenta que el plugin solo acepta archivos con la extensión .zip.

El resultado que vemos en nuestro panel de capas, se trata de un grupo de datos de tipo vectorial (rutas y paradas) y de tablas relacionadas, todos ellos almacenados en formato GeoPackage.

Vista de datos GTFS sobre el tránsito en Sao Paulo

La ventaja de contar con un archivo en formato GeoPackage, es la posibilidad de incorporarlo a nuestro administrador de base de datos y realizar las consultas necesarias.

Integración del archivo GeoPackage generado dentro del administrados de bases de datos del QGIS.

2. GTFS-GO

El plugin nos permite extraer datos GTFS como GeoJSON y logra representar rutas y paradas en el mapa. Cuando activamos el plugin nos aparece un pequeño panel en donde tenemos la opción de cargar un archivo .zip, del mismo modo vemos que existen algunos ejemplos disponibles. En este caso cargamos el de la ciudad de México.

Luego podemos ajustar nuestra salida para mostrar solo rutas (routes) y paradas (stops).

Como resultado obtenido podemos apreciar que se muestra una simbología propia elaborada para una mejor visualización. Se considera esta opción como una simplificación a todas las tablas que existen en los datos, buscando tener una presentación rápida de la información.

Otra opción con que contamos es incorporar la frecuencia de tráfico, si tenemos en cuenta que como parte de los datos se tiene registrado el horario del servicio, esto se podría calcular. Para lograr esto debemos seleccionar «aggregate route frecuency«. Se probó que funciona para el caso de los datos del Bronx, por lo tanto, tendremos como resultado una capa de frecuencia como línea, en donde si hacemos un acercamiento veremos que existen unos números, los cuales representan la frecuencia de cada línea, a mayor frecuencia de la ruta las líneas son más gruesas. También se crea una capa de puntos denominada «frequency_stops», que contiene los nombres de las paradas similares, que nos pueden permitir unificar valores.

Se comparte un vídeo demostrativo con el uso de ambos plugins.

Referencias:

  1. General Transit Feed Specification Site.
  2. Descripción general de la especificación GTFS estática.
  3. GTFS: Un estandar para horarios de transporte público e información geográfica asociada.
  4. Wikipedia: General Transit Feed Specification

Uso del Append Features to Layer en QGIS

En esta oportunidad vamos a mostrar de manera práctica el uso del plugin de QGIS denominado Append Features to Layer, el cual fue recientemente actualizado. Me pareció interesante lo que nos permite hacer cuando manejamos capas de tipo vectorial, por ejemplo, para aquellos que están actualizando los campos de manera permanente.

Funcionamiento del Plugin

Vamos a entender el funcionamiento del plugin en algunos casos que se puedan presentar, con la finalidad de ilustrar el uso que podemos darle y que nos permitirá facilitar nuestro trabajo.

Caso 1: Cuando necesitamos integrar elementos geográficos (features) a nuestra capa vectorial, los cuales contienen los mismos campos en la tabla de atributos. Por ejemplo, en la imagen podemos ver un grupo de polígonos (límites políticos), los cuales están incompletos, con el plugin podemos unirlos para integrarlos en un un sola capa vectorial.

Caso 2: En el caso que al tener una capa vectorial con todos sus elementos completos, pero que existen la necesidad algunos elementos geográficos en donde se necesita actualizar los datos en sus campos. Siguiendo con el ejemplo, es posible que en algunos límites de distritos, los valores de población se hayan actualizado, en este caso también podemos emplear el plugin, con la finalidad de actualizar solo las geometrías en donde sea necesario, sin alternar nada más.

Podemos resumir que el plugin nos permite integrar o unir capas vectoriales con la posibilidad de mantener la estructura de los campos ya establecido, del mismo modo, podemos actualizar valores en aquellos campos que han sufrido alguna variación, pero siempre en base a la existencia de otra capa vectorial con los nuevos datos. Lo interesante es la facilidad que nos brinda el plugin para evitar duplicar geometrías, para ello es necesario seleccionar bien las opciones.

Mayor detalle sobre el funcionamiento del plugin lo pueden encontrar en su repositorio de código, además se debe mencionar que el plugin incorpora en la «Caja de herramientas de Procesado», dos modelos que nos permiten automatizar algún proceso más complejo y con mayor cantidad de capas.

Como recurso adicional y para un mejor entendimiento se elaboró un vídeo en donde se muestra algunas aplicaciones del plugin presentado. En caso deseen probarlo, pueden descargar los datos de los ejemplos desde aquí.

Demostración del uso del Plugin Append Features to Layer

Plataforma de Enseñanza EducaGIS

Para el presente año 2021, vamos a retomar la elaboración de cursos a través de la plataforma de enseñanza EducaGIS. Dentro de este ambiente se buscará una mayor interacción con los alumnos, combinando el acceso del material de enseñanza y diversas actividades que buscan un mejor aprendizaje, entre ellos el desarrollo de ejercicios y evaluaciones por tema a desarrollar. El primero de los cursos a ofrecer se denomina QGIS 3.16 – Nivel Básico (QGIS-1) y según la programación deberá estar disponible durante las primeras semanas de Julio.

De manera adicional desde el presente Blog, se brindará algunos cursos libres con la finalidad de brindar acceso sin restricciones, al material de enseñanza y los interesados puedan consultarlos cuando lo deseen, los mismos tendrán una secuencia lógica de temas para cumplir los objetivos de aprendizaje que se proponen. En la actualidad ya se encuentra disponible el curso denominado «SIG – Nivel Básico«, al cual pueden acceder desde el menú de Cursos.

Los cursos libres estarán principalmente dirigidos para personas con poco o ningún conocimiento sobre los Sistemas de Información Geográfica (SIG) y las tecnologías relacionadas. Dentro de lo posible, se pretende seguir un flujo o secuencia de aprendizaje, en donde los cursos libres formen parte de los requisitos previos para llevar los cursos brindados a través de la plataforma EducaGIS.

Si bien existe un manual de usuario de la Plataforma EducaGIS, en los próximos días estará disponible una actualización necesaria. Por el momento, aquellos que expresen su interés en llevar cursos, pueden ir al menú de Contacto, con el objetivo de recopilar los datos necesarios para la generación de usuarios de la Plataforma.