lunes, 21 de agosto de 2017

Generando Gráficos con Data Plotly en QGIS 3











Con la finalidad de dar un poco de continuidad a la temática del post anterior, ahora voy a mostrar las experiencia de probar el plugin "DataPlotly", el cual me pareció interesante, sobre todo por su versatilidad para la generación de gráficos.

Fuente de Datos


Para demostrar las ventajas del plugin vamos a emplear los mismos datos del post anterior, pero con la diferencia que ahora se está incluyendo un campo adicional que representa los valores de altitud de los centros poblados considerados; dichos datos han sido obtenidos empleando la herramienta de análisis "Point samplig Tool", partiendo de una capa raster de altitud, el procedimiento puede ser repasado aquí.


Figura 1: Se añadió una columna con datos de altitud de centros poblados

Características del DataPlotly


Es importante mencionar que el plugin "DataPlotly" permite la creación de gráficos al estilo D3 (Data-Driven Documents) y gracias a la librería de gráficos basados en JavaScript disponible de Plotly junto con el API de Python, podemos elaborar un grupo variado de ellos.
Dichos gráficos tienen la característica que son dinámicos e interactivos, es decir se tiene la facilidad de poder hacer por ejemplo acercamientos, asimismo poder brindarnos mayor información al pasar sobre ellos con el mouse, en fin debemos resaltar la facilidad que se tiene para su edición antes de obtener nuestro producto final.

Instalación


El DataPlotly solamente está disponible en la actualidad para la versión de desarrollo del QGIS, por lo tanto, podemos probarlo antes que salga la nueva versión 3.0 del QGIS. La instalación del mismo es sencilla desde nuestro administrador de complementos. Una vez instalado en plugin, lo veremos ubicado en la barra de herramientas listo para trabajar con nuestros datos.

Figura 2: Vista del plugin Data Plotly para su instalación



Conociendo a Data Plotly


Cuando activamos el plugin, nos aparece una ventana, la cual tiene dos elementos permanentes, el primero en la parte superior, relacionada a la selección del tipo de gráfico a elaborar (Plot Type) y el segundo en la parte inferior, que nos brinda la opción de generar más de un gráfico en una vista (SubPlots), el cual pueden representarse en filas o columnas (Figura 3). 
Luego podemos apreciar que la ventana se subdivide en 5 pestañas; el primero denominado "Plot Properties", en donde se define la capa de datos a emplear e indicar las variables a usar, es decir los campos de datos que se van a representar (varía dependiendo del tipo de gráfico), del mismo modo, nos permite definir el tipo de marcadores a usar (puntos, líneas o puntos y líneas), luego las características de dichos marcadores, la coloración y la posibilidad de considerar el uso de transparencias.


 
Figura 3: Ventana de Data Plotly con opciones para configurar nuestro gráfico


En la segunda pestaña denominada "Plot Customizations", podemos terminar de configurar nuestro gráfico, agregando la leyenda, ingresando títulos al gráfico, etiquetar los ejes del gráfico, asimismo, podemos indicarle la información adicional que deseamos visualizar, el cual será mostrado al pasar el mouse por los marcadores de nuestro gráfico (Figura 4).
Luego de realizar la configuración de nuestro gráfico, ya se estaría listo para adicionar el mismo a un repositorio o contenedor de gráficos, haciendo clic al botón "Add Plot to Basket".

Figura 4: Vista de la pestaña para editar nuestro gráfico


Precisamente, nuestra siguiente pestaña denominada "Plot Basket" nos permite administrar nuestros gráficos, sobre todo si deseamos mostrar más de uno a la vez. Hay que tener en cuenta que al hacer cualquier modificación en las dos primeras pestañas, para que podamos verlos deberán ser adicionadas a este contenedor de gráficos, desde ahí ya podemos ir eliminando gráficos pasados, para ello solo seleccionamos de la tabla y luego hacemos clic en el botón "Remove Single Plot From List".

Figura 5: Vista del contenedor de gráficos generados



Finalmente ya teniendo claro lo que queremos mostrar en nuestra gráfica, podemos dar clic en el botón "Draw Plot", tal como se aprecia en la Figura 5. 
Luego podemos ver que la siguiente pestañas denominada "Help", nos muestra la ayuda necesaria en función al tipo de gráfico elegido, el cual nos permite guiarnos para saber todas las opciones disponibles. Por última la pestaña "Raw Plot", muestra lo que sería el código fuente generado de nuestro gráfico, el mismo está en formato de texto HTML, el cual lo podemos copiar y guardarlo con dicha extensión y luego verlo en nuestro navegador web.  

Figura 6: Vista de la ayuda del plugin y el código html generado



Gráficos Dinámicos


En esta parte vamos a mostrar algunos ejemplos de los gráficos que se pueden elaborar con este plugin, para ello empezaremos por el tipo "Scatter Plot". En sí, tomaremos este tipo de gráfico como modelo, con la finalidad de mostrar el dinamismo y lo interactivo que se puede lograr con el gráfico elaborado.

Figura 7: Editando nuestro gráfico incluyendo títulos y etiquetado a los ejes


Figura 8: Opción de editar los textos a mostrarse al pasar el mouse y un "RangeSlider"
el cual nos permite seleccionar un rango de datos que se puede mostrar.




Figura 9: Opciones para mostrar los valores al seleccionarlo apoyados con líneas de puntos


Figura 10: Se puede aplicar selección en caja o tipo lazo, resaltando un grupo de datos


Figura 11: Se puede mover y aplicar un acercamiento (zoom) a una zona de interés


Otros Tipos de Gráficos Posibles


Si bien no voy a entrar a interpretar los gráficos, si quisiera mostrarles que en función a nuestros datos, ha sido posible elaborar otro grupo de gráficos, los que se presentan en las siguientes figuras.

Figura 12: Gráfico o Diagrama de Caja (Basado en cuartiles y mostrando la media)

Figura 13: Vista de un histograma simple

Figura 14: Gráfico de pastel, agrupando los datos de población por categorías

Figura 15: Vista de un Gráfico Histograma 2D

Figura 16: Vista de un Gráfico Polar

Figura 17: Vista de un Gráfico o Diagrama Ternario (empleo de tres variables)

Figura 18: Vista de un Gráfico en Contornos


Combinando Gráficos


Tal como lo indicamos previamente, podemos componer mas de un tipo de gráfico a la vez, para ello debemos ir generando y editando nuestros tipos de gráficos, luego adicionarlos a nuestra bandeja (basket), no olvidar seleccionar la opción de generar "SubPlots". Es importante tener en cuenta que no todos los tipos de gráficos soportan esta opción.

Figura 19: Combinando tres tipos de gráficos


Insertando Gráficos a Nuestro Mapa


Como paso final vamos a insertarlo en nuestro mapa con el que venimos trabajando, para ello previamente, tal como se muestra en la Figura 19, en la parte inferior de los gráficos existe la opción de exportarlo tanto como imagen como en formato html. Dentro de nuestro diseñador de impresión de los mapas, simplemente para nuestro caso, adicionamos como una imagen para el gráfico de pastel  y como marco HTML a la imagen con los tres gráficos combinados.

Figura 20: Gráficos añadidos a nuestro mapa


Muy bien, ahora nuestro mapa podrá mostrar mayor información con los gráficos añadidos.

lunes, 7 de agosto de 2017

Nuevas Opciones para generar leyendas con QGIS 3.0

En una entrada anterior, se mostró una de las novedades sobre estilos que se viene con el QGIS 3.0, en específico la demostración fue sobre una capa de puntos, mostrando la opción "Point cluster". En esta oportunidad, empleando la misma fuente de datos, me permitiré hablar sobre una opción que tenemos para mostrar en nuestro panel de capas, un nuevo estilo de simbología, el mismo que luego podrá ser representado dentro de un mapa como leyenda.

Generando una leyenda colapsada (Collapsed legend)


En realidad es muy sencillo el procedimiento, pero vamos a tener que considerar unos detalles, como por ejemplo, primero debemos revisar nuestra tabla de atributos, sobre todo porque en algunos casos será necesario hacer algunos ajustes. Para esta demostración estoy empleando un capa vectorial de puntos, representando un grupo de centros poblados del Departamento de Apurímac, el mismo contiene un campo denominado "TOT_POB99", con valores de población. 
Si desean los datos para practicar lo pueden descargar desde aquí.

Paso 1: Debemos generar un campo que represente valores enteros que guarden relación o proporción sobre los valores de población, para nuestro caso, el grupo de centros poblados presenta valores desde 500 hasta 7731, por lo tanto, se ha creado el campo "CATEG_POB", con valores de 5, 10, 15 y 20, los cuales considerándose rangos específicos deberán cubrir todos de valores de población.

Figura 1: Ajustando nuestra tabla de atributos

Paso 2: Generar una simbología simple de puntos, pero que el tamaño del marcador esté activado para que esté definido por datos de un campo específico, en este caso de nuestro campo "CATEG_POB".


Figura 2: Configurando para que el tamaño del marcador sea definido por datos

Paso 3: Ahora podemos ir a las opciones avanzadas para generar simbología, seleccionando la opción denominada "Data-defined size legend". Es importante primero realizar el paso anterior, porque de lo contrario no se activará esa opción.

Figura 3: Activando la opción Data-defined size legend


Paso 4: Debemos generar nuestra leyenda colapsada, para ello debemos ir a dicha opción y luego añadir manualmente los tamaños de las clases, tal como lo hemos configurado previamente, es decir desde valores de 5 a 20, para que a su costado podamos incluir el valor real de la población que queremos representar.


Figura 4: Generando una "leyenda colapsada"


Paso 5: Finalmente, veremos que aparecerá dicha simbología en nuestro panel de capas, por lo tanto, ahora podemos representarlo en un mapa, para que lo podamos imprimir.

Figura 5: Vista del resultado de nuestra leyenda generada

Editando la simbología


Al ver el primer resultado, me pregunté si podría hacer que los símbolos tengan colores diferentes por cada tamaño generado, por lo tanto, lo que hice fue generar una simbología de tipo "Graduated", para lograr generar con ello una rampa de coloración, claro está en función a los datos de población.
Con la finalidad de que se mantenga los rangos similares, se optó que la opción del modo de separación de las 4 clases sea por "rupturas naturales".

Figura 6: Generando una simbología graduada

Con este cambio, vamos a visualizar nuestros valores en una leyenda compuesta por dos simbologías, la que ya habíamos generado anteriormente y la otra que representa una coloración establecida por nosotros.

Figura 7: Vista del resultado incorporando coloración graduada


En general me parece interesante esta nueva opción que vendría en la nueva versión del QGIS 3.0, les invito a probarlo en la versión de desarrollo del QGIS.


martes, 1 de agosto de 2017

Complementos QGIS para Clasificación Supervisada con Imágenes Sentinel-2, Parte 2









Con la finalidad de completar lo ofrecido, ahora trataremos sobre el plugin kNN classifier, el cual emplea el método K -vecinos más cercanos, en inglés K-Nearest Neighbors Algorithm (KNN), logrando crear una nueva capa con los píxeles clasificados, además de realizar la evaluación de la precisión del proceso de clasificación. Se debe mencionar que los principios de las funciones y del trabajo del plugin están basados en el paper de la referencia 1.

Preparando los datos:


Seguiremos empleando la misma fuente de datos con la que venimos trabajando en la entrada anterior,  es decir nuestra imagen compuesta del satélite Sentinel-2, del mismo modo se trabajará con nuestra capa vectorial de las áreas de entrenamiento, la cual deberá ser modificada, teniendo en cuenta los requisitos del plugin.

En resumen el plugin KNN classifer requiere lo siguiente:

  • Un archivo raster multibanda con la extensión TIF, en nuestro caso tenemos una imagen del Sentinel-2 compuesta por cuatro bandas (comb2348_test.tif).
  • Un archivo Shapefile que contenga un campo con la clasificación (roi_set16_test1.shp), pero además los descriptores requeridos, en este caso serán los valores de las bandas contenidos en cada uno de los polígonos (45), para lo cual vamos a emplear una herramienta ubicada en la menú raster, denominada "Estadísticas de zona".

Lo primero que haremos será aplicar "Estadísticas de zona", considerando nuestra imagen multibanda y la capa vectorial, para ello se considerará el valor de la media de cada una de las bandas. 

Figura 1: Aplicando Estadísticas de zona para recopilar datos de nuestra imagen por cada banda


El proceso se repite para las demás bandas, obteniendo al final cuatro campos con los valores medios de las bandas, los que ahora serán considerados como nuestros descriptores.


Figura 2: Adición de los descriptores con valores de las bandas de la imagen raster


Empleo del KNN Classifer


Ahora podemos activar el plugin desde nuestra barra de herramientas, luego del cual nos aparecerá una ventana (Ver Figura 3), en donde dentro de la pestaña "Basic", se especifica nuestra capa raster y luego nuestra capa vectorial actualizada. Posteriormente hay que indicarle lo siguiente:
  • Una carpeta de salida de nuestros resultados.
  • El número de vecinos más cercanos (k), es decir el número de vectores de muestra (polígonos) más cercanos de acuerdo con la distancia.
  • La selección de las bandas disponibles para ser considerados.
  • Lista de los descriptores provenientes de la tabla de atributos de la capa vectorial, solo deben ser considerados los campos relevantes para la clasificación.
  • El parámetro a ser clasificado, existiendo la opción de realizar una clasificación con múltiples parámetros.
  • Finalmente se indica el modo de clasificación, el cual está en relación al parámetro a ser clasificado, "c" para el parámetro categórico y "n" para el parámetro continuo.

Es importante mencionar que debemos emplear la tecla "Ctrl" para realizar múltiples selecciones, como las bandas y los descriptores.

Figura 3: Configuración requerida para ejecutar el plugin kNN


Primeros Resultados Obtenidos


Luego de ejecutar el plugin en nuestro panel de capas aparecerá la nueva capa raster con el resultado de la clasificación, el cual presenta la siguiente estructura: SC_ + nombre de la imagen + nombre del parámetro + _valor de k + modo de clasificación (SC_comb2348_test2Clase_ID_3c). Luego para visualizar mejor podemos emplear el estilo que venimos trabajando.

Figura 4: Vista del resultado de clasificación con la configuración básica


También se genera un archivo de texto (.txt), con la evaluación de la precisión del algoritmo empleado con los valores ingresados, el cual se almacena en la carpeta de salida elegida. La interpretación del mismo sería:

  • OA: Precisión general - todos los píxeles clasificados correctamente (todos los tipos) / todos los píxeles clasificables (todos los tipos)
  • PA: Precisión de los "productores" - Muestra el porcentaje de cuántos píxeles de cada tipo se clasifican correctamente. Correctamente clasificado (de un solo tipo) dividido por el número total de píxeles de prueba del mismo tipo de acuerdo con los datos de referencia. Para nuestro ejemplo se muestran seis (6) valores que corresponden a las clases consideradas.
  • UA: Precisión de los usuarios - Muestra la probabilidad de que el tipo específico realmente represente ese tipo. Correctamente clasificados (de un solo tipo) / clasificados (de un solo tipo).
  • KHAT: Este valor describe qué tan bien el algoritmo kNN clasifica los píxeles si se compara con el clasificador aleatorio. Por lo tanto, valores cercanos a 1 indicarán un buen desempeño del algoritmo.
En nuestro caso obtuvimos un KHAT igual a 0.859, lo que significa que la clasificación es un 86% mejor que un clasificador aleatorio proporcionado.


Figura 5: Vista del resultado de la evaluación del algoritmo en un archivo de texto


Es recomendable ir probando valores de k distintos para ver el valor que mejor se ajusta, en este caso luego de realizar pruebas con otros valores, se comprobó que el valor de 3 es el más adecuado. Para tener otros criterios al momento de elegir este parámetro, recomiendo revisar la referencia 2.


Editando nuestra configuración para clasificar


Ahora vamos a probar algunas otras opciones que tenemos, todo ello con la finalidad de personalizar nuestra configuración inicial. Para ello, en primer lugar nos debemos ir a la pestaña "Advance", desde aquí veremos que podemos realizar algunos ajustes:

  • Distance calculation: La modificación de esta opción que por defecto está marcado en "Euclidean", puede alterar la velocidad en el procesado para obtener los resultados; esto se debe a que ambos métodos de cálculo emplean distintas fórmulas, siendo la de Manhattan, la que consume menor tiempo de procesado. El principio de ambos se puede resumir si apreciamos la Figura 6, en donde podemos apreciar las fórmulas que consideran ambos métodos:

Figura 6: Representación gráfica de los métodos de cálculo de distancias (Fuente: Ref. 2)


  • Mask layer: Te permite incorporar una capa raster que indique solo aquellos píxeles que deben ser clasificados, dicha capa debe contener valores de 0 (píxeles que no son considerados) y 1 (píxeles a ser considerados).
  • GeoDistance: Proporciona al usuario una opción para seleccionar datos de muestra a la distancia deseada desde un píxel clasificable. Esta opción limita nuestros datos de muestra y reduce la influencia de las muestras ubicadas más lejos. La distancia se mide en kilómetros [km]. Al habilitar esta opción, el usuario debe verificar que los datos de entrenamiento tienen columnas denominadas "x" e "y" que contienen coordenadas de los puntos de datos de entrenamiento.
  • Feature weights: Te permite realizar un tipo de ponderación a nuestros descriptores, por lo tanto valores mayores a 1 incrementa la significancia del descriptor; los valores deben estar separados por comas.

Figura 7: Configuración de opciones avanzadas del plugin


En resumen, tal como se aprecia en la Figura 7, se seleccionó a "Manhattan" como método de cálculo de la distancia, no se activo ninguna capa máscara, se indicó a 1 km como GeoDistance, pero al momento de ejecutar el algoritmo, se mostró la advertencia que no se cuenta con suficientes puntos de muestreo, lo cual es comprensible, teniendo en cuenta la reducida extensión con la que estamos trabajando, también se habilitó la opción de estandarización y finalmente la generación de ponderación, se le asignó mayor peso a las bandas 3 y 4, las que corresponden a las bandas roja e infrarroja del Sentinel-2 respectivamente.

Figura 8: Resultado obtenido al modificar algunos parámetros.

Si apreciamos la Figura 8, veremos que el resultado no fue satisfactorio si lo comparamos con nuestro primer resultado, esto nos permite descartar la opción de emplear "Manhattan" como método de cálculo de la distancia. Por lo tanto, si mantenemos los cambios y volvemos a emplear "Euclidean" obtendremos un resultado similar al primero, pero visualmente se comprueba que existe algunas mejoras.

Figura 9: Resultado de la clasificación empleando ponderaciones


Bueno, con esta parte cumplo con lo ofrecido, teniendo la intensión de poder mostrar otras opciones que tenemos para realizar una clasificación supervisada. Para que puedan profundizar sobre esta metodología, recomiendo revisar la referencia 3, en donde el autor del plugin explica detalladamente las características del mismo y que por mi parte traté de resumirlas en esta entrada.

Referencias:

  1. http://www.sciencedirect.com/science/article/pii/S0034425701002097
  2. http://www.oldemarrodriguez.com/yahoo_site_admin/assets/docs/Presentación_-_KNN.20085205.pdf
  3. https://github.com/m6ev/kNN/blob/master/kNN_Documentation.pdf

miércoles, 26 de julio de 2017

Complementos QGIS para Clasificación Supervisada con Imágenes Sentinel-2, Parte1









Si bien es cierto que el QGIS tiene un excelente complemento como el Semi-AutomaticClassification Plugin, el cual permite realizar clasificación supervisada a partir de imágenes de satélite y que en una entrada anterior se mostró el procedimiento para ello. En esta oportunidad voy a describir un par de complementos que también nos permiten realizar dicha clasificación, en sí me estoy refiriendo al plugin dzetsaka: classification tool y al kNN classifier; mi objetivo es mostrar el primero en esta entrega.

Fuente de Datos


Para el ejemplo usaremos una imagen proveniente del Sentinel2, de una zona comprendida en el Departamento de Madre de Dios en Perú. específicamente la imagen cubre la localidad de Mazuko. Para obtener la imagen ahora existen varias opciones, por mi parte lo hice a través de los datos disponibles a través del Amazon Web Services (AWS) y las imágenes pueden ser descargadas con el buscador Sentinel Image browser. Les recomiendo el vídeo  Tutorial - [Como descargar Sentinel 2 por grillas], como una buena guía de descarga.

Figura 1: Imagen del Sentinel-2 seleccionada para su descarga

De todas las bandas disponibles del Sentinel-2, se descargó las que tienen 10 metros de resolución espacial y luego abiertas en nuestro QGIS.


Figura 2: Vista de las bandas del Sentinel-2 dentro del QGIS.

Preparando nuestros datos


Ahora vamos a recortar nuestra zona de estudio, en mi caso por lo general uso la herramienta del QGIS alinear raster, primero haciendo un acercamiento a la zona de interés para luego considerarlo como zona de recorte a la extensión de la vista de mapa; en sí la herramienta es simple y muy práctica para recortar un raster con las mismas dimensiones y resolución.

Figura 3: Recortando nuestra zona de interés 


Con nuestras bandas al tamaño deseado cubriendo nuestra zona de interés, vamos a generar una composición de todas las bandas, para ello tenemos varias opciones, en mi caso por lo general uso "Images Concatenation" presente dentro de la Caja de herramientas del Orfeo.

Figura 4: Concatenando nuestras bandas para formar una composición.

Con nuestra imagen compuesta por las cuatro bandas (b2, b3, b4 y b8), podemos generar una combinación RGB de color verdadero con la finalidad de visualizar nuestra zona de estudio e iniciar la generación de una capa vector con las áreas de entrenamiento.


Figura 5: Composición RGB color verdadero

Clasificación Supervisada con dzetsaka: classification tool


Como siguiente paso debemos generar una capa vectorial con nuestras áreas o campos de entrenamiento, las cuales son definidas en campo en función al tipo de cobertura presente. Para fines didácticos se han asumido que se realizaron 45 muestras, por eso veremos esa cantidad de polígonos sobre nuestra imagen, asimismo se asumió que se dividen en 5 clases (1: Bosque, 2: Pastos, 3: Suelo desnudo, 4: Edificación, 5: Río y 6: Lecho de río.)

Figura 6: Vista de las áreas de entrenamiento

Para el plugin dzetsaka, tal como lo menciona en la descripción dentro de su repositorio, solo se necesita una capa raster y un archivo tipo Shapefile que contenga el ROI (Región de Interés), pero este último debe presentar una columna que contenga en números las clases designadas.

Figura 7: Tabla de atributos de la Región de Interés con la codificación de las clases
 

Este plugin rápido y fácil de usar, ha sido desarrollado por Nicolas Karasiak; inicialmente basado para el modelo "Gaussian Mixture" desarrollado por Mathieu Fauvel, actualmente soporta Random Forest, KNN y SVM; además se tiene la opción de trabajarlo desde la caja de procesado.

Ahora ya estamos listos para realizar una clasificación supervisada, pero antes no debemos olvidar que es un requisito tener instalado la librería de Python scikit-learn. Tal como se aprecia en la Figura 8, seleccionamos nuestra capa compuesta de las cuatro bandas, nuestro vector y el campo numérico que corresponde a las clases identificadas, luego verificamos que modelo vamos a emplear, le indicamos el archivo resultando y finalmente hacemos clic en "Perform the classification".

Figura 8: Ejecución del Complemento para Clasificación Supervisada
 

En primer lugar como ven usaremos el Gaussian Mixture Model, y una vez obtenido el resultado le daremos un estilo que nos permita identificar mejor las clases obtenidas.

Figura 9: Resultado de la Clasificación supervisada con Gaussian Mixture Model

Repitiendo el procedimiento para los otros algoritmos obtendremos resultados muy similares.


Figura 10: Resultado final empleando los otros modelas para Clasificación Supervisada

Finalmente con el complemento también podemos visualizar una matriz de confusión, como una manera de poder evaluar el desempeño del algoritmo, calculando los valores porcentuales del coeficiente de Kappa y la precisión global (Overall Accuracy) entre el mapa clasificado y los datos de referencia.

Figura 11: Vista la matriz de confusión que se genera por cada algoritmo


Como un tema adicional, si verificamos en nuestra caja de herramientas de procesado, veremos que el complemento está presente, teniendo la ventaja de poder realizar otras aplicaciones, como por ejemplo el "Split train and validation", el cual nos permite dividir nuestro datos de entrenamiento total en dos partes, las de entrenamiento en sí y las de validación, es decir que considera un porcentaje del total que serían necesarios para una validación posterior. En nuestro caso, tenemos 45 áreas de entrenamiento, y luego de ejecutar la aplicación vemos que ha dividido 23 zonas para entrenamiento y reserva 22 zonas para una validación, el cual permitirá evaluar nuestro estimador.

Figura 12: Generando una división de nuestras áreas de entrenamiento totales.

Por ahora es lo que tenía pensado mostrar, en la siguiente entrega se presentará al complemento kNN Classifier y sus particularidades.