domingo, 24 de septiembre de 2017

Propuesta de Curso sobre QGIS para principiantes












Plataforma Virtual EDUCAGIS


En esta oportunidad voy a mostrarles un proyecto que desde hace un tiempo lo vengo trabajando, me refiero a contar con un Entorno Virtual de Aprendizaje (EVA), es decir tener un espacio que me permita ofrecer cursos bajo la modalidad Online. Esperando que sea un inicio de algo que cada vez se vaya fortaleciendo, mi idea es seguir elaborando material de enseñanza sobre las herramientas de software libre para SIG (en especial del QGIS); teniendo en cuenta que a través de mi blog he logrado compartir en los últimos años, metodologías para emplear sus herramientas. Si bien los que revisaron mi blog, en un 90% hablo sobre QGIS, en el presente proyecto de contar con esta plataforma denominada EDUCAGIS, lo quiero orientar a todos aquellos que se complementan muy bien, es decir me refiero al SAGA, GRASS y OTB principalmente.

Bueno, vamos a iniciar con un curso a nivel básico (fecha de inicio sería el 20 de octubre del 2017), lineas abajo se describe parte de la información del curso que estoy proponiendo, los que están interesados, pueden descargar el brochure del curso desde aquí, y la ficha de inscripción desde aquí.


Presentación del Curso


Ante el incremento de la tendencia al uso de herramientas de software libre para los Sistemas de Información Geográfica (SIG), en esta oportunidad se brinda la propuesta de un curso bajo la modalidad Online denominado funcionalidades de los SIG con QGIS (nivel básico), en donde a través de la presentación de diversos temas seleccionados, pretendemos que el participante que se viene iniciando en el mundo de los SIG, pueda tener una inmersión progresiva de los principales conocimientos relacionado a las funcionalidades que involucran esta tecnología, los que serán demostradas a través del software QGIS, teniendo en cuenta su gran potencial en el desarrollo de las mismas, por los cuales en la actualidad al QGIS se le reconoce cada vez más.



Objetivos del Curso


General


Proporcionar al participante los conocimientos básicos sobre el uso del Software QGIS, orientado el mismo a las funcionalidades de los Sistemas de Información Geográfica, buscando que de manera progresiva y didáctica aprenda a desenvolverse en un ambiente ligado al uso de información geoespacial apoyado con el uso de tecnologías libres.

Específicos

  • Conocer el entorno de usuario, herramientas y las principales funcionalidades del software QGIS.
  • Realizar la búsqueda, selección y descarga de datos geográficos de fuentes externas.
  • Identificar, explorar y visualizar los datos espaciales apoyados por el QGIS Browser.
  • Gestionar una base de datos espacial para la creación, edición y consulta de los mismos apoyados con el DBManager.
  • Generar estilos personalizados a las capas vectoriales de puntos, líneas y polígonos.
  • Manipular y editar capas vectoriales y de raster empleando herramientas de edición del QGIS.
  • Diseñar mapas individuales y en conjunto como un atlas para su publicación e impresión.
  • Combinar capas de tipo vectorial apoyados por las herramientas más comunes de geoprocesamiento en el QGIS.
  • Combinar capas de tipo raster apoyados por las herramientas más comunes de geoprocesamiento e integrar algunos procesos empleando el modelador gráfico del QGIS.
  • Usar herramientas de teledetección para ejecutar procesos que tiene como fuente de datos las imágenes de satélite.


Bueno, espero que los que se están iniciando en QGIS les pueda interesar; de manera adicional se ha creado un repositorio en GitHub del proyecto de este primer curso, en donde iré actualizando con información, los que desean revisarlo pueden ingresar a https://github.com/ccarbajal16/qgis_basico.




martes, 12 de septiembre de 2017

R + SAGA Geoprocesamiento con RSAGA Package





En la presente entrada trataré un tema un poco diferente a lo acostumbrado, sobre todo porque será la primera vez que me refiero al Software R, al que de un tiempo muy reciente lo estoy practicando; por otro lado, aunque tampoco me acuerdo haber discutido sobre SAGA GIS específicamente, es un software del cual ya tengo muchos años trabajándolo, y en donde me siento más cómodo, sobre todo porque se complementa muy bien con el QGIS.

Bueno, en esta aventura voy a mostrar mi experiencia probando el package "RSAGA", por el que me animé luego de leer este enlace, a partir de ello, estuve revisando otras fuentes y decidí intentarlo empleando solamente una capa raster de elevación, el cual será nuestro punto de partida.

Fuente de Datos:


Para esta oportunidad como lo indicaba se empleará una capa raster tipo DEM, el cual está disponible a través del Modelo Digital de Superficie ALOS World 3D -30m (AW3D30), solamente se tienen que registrar y podrán descargar los datos, para el presente ejemplo se seleccionó la zona que comprende el Departamento de Lima-Perú.

Figura 1: DEM (30 m) de la cuenca del río Rimac 


Pasos Previos


Debemos tener en cuenta que el package "RSAGA", al parecer por temas de actualización no funciona con las últimas versiones de SAGA, por lo tanto, es recomendable instalar las versiones 2.14 o  2.2. En relación a R, se recomienda que instalen el RStudio, sobre todo para tener un entorno que nos facilite nuestro trabajo, como por ejemplo la instalación de otros paquetes adicionales requeridos.



Manos a la Obra


Paso 1: Como primer paso, una vez dentro de RStudio, debemos definir el directorio de trabajo, para ello, lo podemos hacer desde la consola con  setwd("Ruta del Directorio"), o también te puedes activar el menú de "Session", y luego dirigirte a "Choose Directory", tal como se aprecia en la figura 2.

Figura 2: Definiendo nuestro directorio de trabajo


Paso 2: Instalar y Activar el Package RSAGA

install.packages("RSAGA")
library ("RSAGA")

Paso 3: Quizás el más importante, porque ahora debemos establecer un ambiente en R. La finalidad es poder usar el objeto, en este caso "env_test" para dirigir las funciones RSAGA. En algunos casos podemos indicar en donde tenemos ubicado nuestro software SAGA.







Paso 4: Vamos a importar nuestro archivo raster que está en formato tif (dem_rimac.tif), para convertirlo en el formato de SAGA (dem_test.sgrd)

rsaga.import.gdal("F:/WORKS/SAMPLES/rtest/dem_rimac.tif", "dem_test.sgrd", env = env_test)


Paso 5: Verificamos la lista de la librería de módulos disponibles con las que podemos trabajar, es decir, todas las herramientas que a través de SAGA podemos ejecutar dentro del ambiente de R. Para nuestro caso vamos a incidir en aquellos relacionados al análisis del territorio. Es importante revisar los nombres, porque deberán ser considerados en nuestra línea de código para cuando sea requerido un módulo en específico.

rsaga.get.libraries(path=env_test$modules)

Figura 3: Lista de la librería de módulos


Paso 6: Vamos a lista la lista de funciones de geoprocesamiento que trabajaremos, teniendo en cuenta lo remarcado en la Figura 3. Por ahora nos dedicaremos a lo relacionado a "ta_morphometry".

rsaga.get.modules(lib = "ta_morphometry", env=env_test)


Figura 4: Funciones relacionados a morfometría

Paso 7: Configurar las herramientas de geoprocesamiento llamando a los módulos dentro de la biblioteca "ta_morphometry". Se pueden emplear cualquiera de los módulos que fueron listados previamente, solo se debe cambiar en "module = _ _ ". Tener en cuenta que también se puede colocar el número de código asignado, por ejemplo para "TPI Based Landform Classification", podemos ingresar "19".

rsaga.get.usage(lib= "ta_morphometry", module = "Slope, Aspect, Curvature", env = env_test)

rsaga.get.usage(lib= "ta_morphometry", module = 19, env = env_test)


Al ejecutar tendremos una vista de la lista de los parámetros (entrada y salida) a considerar, sobre todo, es importante verificar aquí las opciones que tenemos para personalizar nuestros resultados. También nos ayuda a revisar los formatos de ingreso (si es un texto o número), las unidades con los que se trabaja y cuales son las opciones por defecto, esto en caso que no ingresemos un parámetro. Para el primero se tendrá un resultado similar al siguiente.

> rsaga.get.usage(lib= "ta_morphometry", module = "Slope, Aspect, Curvature", env = env_test)
library path: C:\PROGRA~1\SAGA-GIS\modules\
library name: ta_morphometry
library     : Morphometry
Usage: saga_cmd ta_morphometry 0 -ELEVATION [-SLOPE ] [-ASPECT ] [-C_GENE ] [-C_PROF ] [-C_PLAN ] [-C_TANG ] [-C_LONG ] [-C_CROS ] [-C_MINI ] [-C_MAXI ] [-C_TOTA ] [-C_ROTO ] [-METHOD ] [-UNIT_SLOPE ] [-UNIT_ASPECT ]
  -ELEVATION:   Elevation
Grid (input)
  -SLOPE:       Slope
Grid (output)
  -ASPECT:     Aspect
Grid (output)
  -C_GENE:     General Curvature
Grid (optional output)
  -C_PROF:     Profile Curvature
Grid (optional output)
  -C_PLAN:     Plan Curvature
Grid (optional output)
  -METHOD:     Method
Choice
Available Choices:
[0] maximum slope (Travis et al. 1975)
[1] maximum triangle slope (Tarboton 1997)
[2] least squares fitted plane (Horn 1981, Costa-Cabral & Burgess 1996)
[3] 6 parameter 2nd order polynom (Evans 1979)
[4] 6 parameter 2nd order polynom (Heerdegen & Beran 1982)
[5] 6 parameter 2nd order polynom (Bauer, Rohdenburg, Bork 1985)
[6] 9 parameter 2nd order polynom (Zevenbergen & Thorne 1987)
[7] 10 parameter 3rd order polynom (Haralick 1983)
Default: 6
  -UNIT_SLOPE: Slope Units
Choice
Available Choices:
[0] radians
[1] degree
[2] percent
Default: 0
  -UNIT_ASPECT: Aspect Units
Choice
Available Choices:
[0] radians
[1] degree 


Paso 8: Ejecutar el Geoprocesamiento, para lo cual existen dos maneras fundamentalmente, el primero, cuando existe una función específica del RSAGA, tenemos la opción de obtener nuestro resultado. Para nuestro ejemplo, puede darse el caso que deseamos obtener la pendiente, el aspecto y la curvatura en un mismo procedimiento, para ello podemos escribir:

rsaga.slope.asp.curv("dem_test.sgrd", out.slope = "slope_dem1", out.cprof = "cprof_dem1", out.cplan = "cplan_dem1", method = "poly2zevenbergen", env=env_test)

También se pude realizar de manera individual, es decir cuando existe la función para calcula la pendiente:

rsaga.slope("dem_test.sgrd", "slope_dem2", method = "maxslope", env=env_test)

Por último existe la opción, el cual me parece más interesante, porque tenemos la posibilidad de obtener el mismo resultado si ejecutamos la función del Geoprocesador, para lo cual debemos guiarnos de lo mostrado como producto del Paso 7.

rsaga.geoprocessor(lib = "ta_morphometry", module = 0, param = list(ELEVATION = "dem_test.sgrd",SLOPE = "slope_dem3.sgrd", ASPECT = "aspect_dem2.sgrd", C_GENE= "curv_gener1.sgrd", METHOD= "0", UNIT_SLOPE="percent", UNIT_ASPECT="degree"), env = env_test)

Figura 5: Salida del Geoprocesamiento realizado


Paso 9: Ahora vamos a realizar un paso previo para lograr visualizar nuestros resultado. Como vieron en la Figura 5. los archivos se guardaron en formato de SAGA (*.sgrd), el cual lo podemos abrir no solo en ese Software, sino también en QGIS por ejemplo, pero para hacerlo más interesante lo vamos a convertir a un formato tipo ASCII (*.asc). Para ello, volvamos a revisar la Figura 3 e identifiquemos el módulo que requerimos, en este caso hablamos de "io_grid"

rsaga.get.modules(lib="io_grid", env=env_test)

Figura 6: Módulos para gestión de archivos raster


rsaga.get.usage(lib = "io_grid", module =0, env=env_test)

rsaga.geoprocessor(lib="io_grid",module=0,param=list(GRID="dem_fill1.sgrd",FILE="dem_esri.asc"),  env=env_test)


rsaga.geoprocessor(lib="io_grid",module=0,param=list(GRID="slope_dem4.sgrd",FILE="dem_slope.asc"), env=env_test)

rsaga.geoprocessor(lib="io_grid",module=0,param=list(GRID="aspect_dem4.sgrd",FILE="dem_aspect.asc"), env=env_test)


En caso se tengan muchos archivos, existe también una manera más rápida que nos permite realizar este proceso de conversión, a continuación muestro un ejemplo que logré ejecutar, considerando que estuve probando otros módulos.

rsaga.sgrd.to.esri(in.sgrds = c("cprof_dem4", "cplan_dem4", "carea1", "wetindex1", "hillshade1", "direction_dem3","connet_dem3", "order_dem3", "basin_dem3"), out.grids = c("esri_cprof", "esri_cplan", "esri_carea", "esri_wetindex", "esri_hillshade", "esri_direction", "esri_connect", "esri_order", "esri_basin"), out.path = getwd(), format = "ascii", env = env_test)

Paso 10: Vamos a definir los archivos raster para que podamos plotearlos


Es importante tener instalado y activado el Package "raster" y "sp"












plot(elevation)






plot(slope)







plot (aspect)







Visualización en Google Earth


Si bien no lo considero un paso adicional, me encontré con el siguiente enlace, a partir del cual traté de realizar el procedimiento, aunque no me siento muy satisfecho con los resultados, si alguien que lo intente a ver si le sale mejor, lo pueda compartir. En sí, primero debemos remontarnos a nuestra Figura 6, para definir nuestro módulo, en este caso será el "10", porque nuestro objetivo es convertirlo a un archivo PNG (que nos permitirá hacer transparencias).


Es importante tener instalado y activado el Package "rgdal", "maptools"

rsaga.get.modules(lib="io_grid", env=env_test)

rsaga.get.usage(lib= "io_grid", module = "10", env=env_test)


# Generando nuestro archivo tipo PNG

rsaga.geoprocessor(lib="io_grid", module=10, param=list(IMAGE="aspect_dem4.sgrd", FILE="aspect1.png"))

# Definiendo nuestro raster









# Creando nuestro objeto KML








# Creando nuestro archivo KML, con la función kmlOverlay, para mayor detalle revisar aquí.



kmlOverlay(aspect.kml, kmlfile="aspect1.kml", imagefile="aspect1.png", name="Aspecto_rimac")


Figura 7: Salida en Google Earth 


Muy bien, por mi parte seguiré investigando sobre las ventajas que se tiene el poder trabajar dentro de R, sobre todo a partir de nuestros productos obtenidos, aprovechando las ventajas de funciones estadísticas que podemos explotar. Espero que se animen a probarlo.




domingo, 3 de septiembre de 2017

Visualización y Analisis de datos de Criminalidad con QGIS






Vamos a continuar explorando herramientas que nos permiten generar gráficos que nos ayudan a un análisis de nuestros datos. En esta oportunidad emplearemos un plugin de QGIS, el cual aprovecha las ventajas de generar gráficos al estilo D3 (Data-Driven Documents), nos referimos al D3 Data Visualization - QGIS D3 Date and Time Heatmap. 


¿Qué realiza el D3 Data Visualization?


El plugin usando fecha, hora y categorías personalizadas en los datos, crea un histograma de calor circular D3, obteniéndose como salida una página web interactiva, el mismo que puede incluir una leyenda de manera opcional.

El plugin funciona contando el número de eventos por fecha / hora / categoría, usando dos ejes y muestra los resultados como un mapa de calor circular. Con el resultado obtenido nos permite analizar la distribución temporal de los datos y cuántos eventos existen a través del tiempo, basado en dos frecuencias.

Fuente de Datos


Primero vamos a preparar nuestros datos para mostrar su funcionamiento, para ello nos guiaremos principalmente de lo mostrado en su repositorio del código, desde donde podemos verificar que, para su demostración emplea una base de datos de eventos de crimen del 2006 ocurridos en la ciudad de Chicago, disponibles desde aquí; en principio lo consideraremos como nuestra capa principal, pero además, para hacerlo más interesante usaremos dos capas adicionales, el primero referido a los límites de vecindarios disponibles desde la misma fuente, el mismo se obtiene haciendo la búsqueda como "Boundaries-Neighborhoods", y finalmente una capa sobre los llamados distritos policiales (Police districts), disponibles desde aquí. Es importante mencionar que según la Figura 1, también adicioné al QGIS una capa sobre Estaciones Policiales, para quizás tener un criterio más de análisis luego de obtener mis resultados.

Figura 1: Vista del ámbito de estudio



Figura 2: Vista de los datos de crimen reportados el 2006 en Chicago



Ahora para tener nuestra capa final lista, vamos a tener que realizar el proceso de unión espacial de las capas mencionadas, el QGIS se logra con Vectorial-->Herramientas de gestión de datos-->Unir atributos por localización. Para ello tener presente que nuestra "Capa vectorial objetivo" es la de puntos que representa los eventos de crimen.


Figura 3: Tabla de atributos integrando información adicional


Conociendo el Entorno


Luego de instalar el plugin, al activarlo nos aparecerá una ventana con un grupo de pestañas, el primero de ellos "QGIS layer", la misma sirve para elegir la capa vectorial que se utilizará para generar el gráfico del mapa de calor (Chicago-2006-crime). Además, se deben seleccionar los campos de fecha y hora (Date). Se puede especificar también los valores para nuestro eje radial y la banda concéntrica, en ambos casos se debe establecer el tipo de información en base al rango de tiempo a ser establecido. Como veremos más adelante la banda concéntrica puede ser ajustado para incluir información adicional.


Figura 4: Seleccionando nuestros datos de entrada



La segunda pestaña "Titles", nos permite personalizar nuestro gráfico colocando títulos al mismo y a la leyenda si decidimos incluirla. Además se tiene la opción de incluir la posibilidad de visualizar los valores (el número de incidentes) al pasar el mouse.


Figura 5: Configurando los títulos y etiquetas del gráfico


La tercera pestaña "Settings", en donde se realiza algunas configuraciones como especificar el "Inner radius", lo que sería el radio en píxeles donde la primera banda del mapa de calor comienza, luego la altura en píxeles de cada banda (Band height), en generar nos permite definir las mejores dimensiones de nuestro gráfico para una correcta visualización; del mismo modo podemos indicarle que se muestren las etiquetas tanto de las líneas radiales como de las bandas concéntricas. Finalmente también podemos indicar las dimensiones de nuestra leyenda.

Figura 6: Ajustes de dimensiones de nuestro gráfico


La última pestaña corresponde a "Colors", en donde se realizan los ajustes para un control preciso sobre la rampa de color de nuestro mapa de calor y definimos también el color de "Sin Datos".


Figura 7: Ajustes de colores


  

Aplicación del Plugin


Vamos a realizar un ejemplo considerando contar con un gráfico que me permita ver el número de incidentes distribuido por meses y por la hora del día, para visualizar en que horarios durante todos los meses del año se producen mayor cantidad de incidentes. Para eso ingresamos en la primera pestaña la siguiente información.

Figura 8: Definición de datos a emplear en nuestro primer ejemplo


Al final tendremos el resultado mostrado en la Figura 9, determina que en el mes de enero se producen la menor cantidad de incidentes, del mismo gráfico vemos que es a la media noche en donde aumenta los incidentes. Tal como lo indicamos anteriormente, al pasar con el mouse sobre el gráfico, en la parte inferior se irá indicando la cantidad de incidentes de manera interactiva.

Figura 9: Vista del resultado de nuestro primer gráfico

Hay que tener en cuenta que el plugin te solicita una carpeta donde se almacenará el resultado, el cual como verán consta de tres archivos, desde donde también se podría hacer algunas modificaciones para mejorar nuestra salida.

Opciones  Adicionales


Vamos a manejar nuestros datos para crear gráficos más personalizados, sobre todo para emplear las capas adicionales que se integraron a nuestra data original, para ello, vamos primero a generar un filtro a nuestra capa de puntos.

Figura 10: Aplicación de filtros


Con el filtro realizado vamos a poder visualizar otro tipo de información, teniendo solo una variable de tiempo, en esta oportunidad nos interesa conocer la cantidad de incidentes clasificados por su naturaleza ocurridos durante los meses del año, para ello ajustamos las opciones como se muestra a continuación.


Figura 11: Ajustando para emplear datos adicionales



Figura 12: Resultado de nuestro ejemplo con datos filtrados

Nuestro resultado muestra que son los narcóticos el principal incidente registrando, con valores de hasta 2,452 casos, el mismo se repite con valores altos durante todos los meses, del mismo modo, vemos que lo sigue en cantidad los robos, y finalmente se puede ver que no se reportan homicidios a excepción de uno ocurrido en el mes de setiembre.

Otro ejemplo que podemos mostrar es considerando los datos de ubicación del vecindario, para ello vamos seguir el mismo procedimiento hecho recién, es decir aplicando filtros. En esta oportunidad, vamos a seleccionar al azar un grupo de vecindarios, sobre el cual pretendemos analizar. 

Lo que vamos hacer es generar primero un gráfico que me permita ver si existen vecindarios que en algunos meses del año presentan mayor cantidad de incidencias, después haremos otro gráfico que me determine en qué horarios se presentan las incidencias con mayor frecuencia por cada vecindario seleccionados.


Figura 13: Resultado final de ejemplos incorporando datos de vecindarios


Finalmente podemos apreciar de acuerdo al gráfico de la izquierda, que el vecindario "Harrinson", presenta la mayor cantidad de incidencias durante todos los meses del año, por otro lado el vecindario "Foster" se reporta la menor cantidad de incidencias, lo que se podría deducir que es uno de los más seguros. En relación al gráfico de la derecha, apreciamos que a partir de las 7:00 p.m. hasta la media noche se producen la mayor cantidad de incidentes.

Bueno, como pueden ver, se pueden realizar muchos gráficos, en este caso se consideró un ejemplo para analizar datos de criminalidad, pero el mismo puede servir para datos como por ejemplo número de accidentes, emergencias o cualquiera que contenga columna con fechas y horarios. Si bien son gráficos, considero que es un buen complemento a la realización de otros procesos de análisis de datos, el cual nos permitiría por ejemplo definir quizás personal requerido para la atención de emergencias, o la posibilidad de implementar servicios o equipos. En fin, espero que lo puedan probar.