jueves, 12 de julio de 2018

Cómo usar GDAL para leer archivos GRIB en Python y determinar la estadística de las bandas

GRIB (GRIdded Binary o General Regularly-distributed Information in Binary form) es un formato ráster soportado por GDAL el cual es comunmente usado en metereología para almacenar datos históricos o de pronóstico del clima. Este tipo de formato es visualizado por QGIS; tal como se observa en la imagen siguiente:

sábado, 24 de marzo de 2018

Obtener coordenadas del movimiento del ratón mediante una clase personalizada en PyQGIS en un plugin de QGIS 3

En un post anterior se consideró la forma de obtener las coordenadas del Map Canvas mediante un click del ratón utilizando una clase personalizada en PyQGIS. Este procedimiento fue conducido a través de la Python Console. Sin embargo, en un plugin hay que saber ubicar la clase dentro del plugin y modificar los parámetros de entrada para que en lugar de imprimir a la Python Console lo haga, por ejemplo, en un elemento Qt como una QTextBrowser.

viernes, 23 de marzo de 2018

Manejando píxeles con solapamiento parcial para realizar estadística zonal con PyQGIS en QGIS 3

El manejo de píxeles con solapamiento parcial para realizar estadística zonal robusta con PyQGIS ya había sido tratado en esta pregunta de https://gis.stackexchange.com. No obstante, el planteamiento en ésta otra es algo diferente pero el código puede adaptarse para satisfacer el requerimiento. Se presenta a continuación:

lunes, 19 de marzo de 2018

Utilizando gdal:translate (PyQGIS Processing) para convertir values a nodata en QGIS 3

En un post anterior se usó el comando de PyQGIS Processing gdalogr:translate para convertir values a nodata en la versión previa de QGIS. No obstante, el nombre del comando cambió en QGIS 3 (ahora se denomina gdal:translate) y el número de parámetros también se redujo considerablemente. Estos pueden averiguarse con processing.algorithmHelp('gdal:translate') y la salida del comando se presenta a continuación:

sábado, 17 de marzo de 2018

Utilizando grass7:v.voronoi en PyQGIS 3 Processing

En un post anterior se consideró un tema similar para la versión previa de QGIS 3 y GRASS 6. La forma elegida de pasarle los parámetros es mediante un diccionario que premite, como ya se ha señalado con anterioridad, prescindir del orden y de los que no son mandatorios.

jueves, 15 de marzo de 2018

Usando Processing qgis:creategrid en QGIS 3 (Linux)

En un post anterior ya se probó este método con la versión previa de QGIS y en QGIS 2.99 uno similar (qgis:creategridpolygon) que no sobrevivió a la versión actual 3.0.0. Los parámetros a ser introducidos en este caso, averiguados con processing.algorithmHelp('qgis:creategrid'), son los siguientes:

lunes, 12 de marzo de 2018

Dividir vectoriales tipo línea en partes de igual longitud mediante algoritmo basado en azimuths con PyQGIS 3

En un post anterior se consideró la división de vectoriales tipo línea en partes iguales mediante un algoritmo basado en azimuths. Sin embargo, se usaron módulos third party como fiona que son difíciles de instalar en Windows y ahora, para que funcione sin problemas en QGIS 3 para este sistema operativo, he de adaptarlo completamente a PyQGIS.

domingo, 11 de marzo de 2018

Dividir vectoriales tipo línea con puntos mediante algoritmo basado en azimuths con PyQGIS 3

En un post anterior se implementó un código para dividir vectoriales tipo línea con puntos mediante un algoritmo basado en azimuths. El referido código fue creado en Linux con fiona. Este módulo es difícil de instalar en Windows 7, al igual que GeoPandas, debido a la necesidad de compiladores C++ específicos para la configuración de nuestro sistema (ahora difíciles de encontrar porque ya prácticamente no tienen soporte sino se usa Windows 10). Como estoy probando QGIS 3 en este Windows voy a utilizar mucho más código PyQGIS prescindiendo, en lo posible, de los módulos third party.

jueves, 8 de marzo de 2018

Cómo conectar una QComboBox para actualizar adecuadamente las capas en un plugin con QGIS 3

En un post anterior se trataba el mismo tema para la versión anterior de QGIS. Empleaba la clase QgsLegendInterface que actualmente fue removida en QGIS 3. Este documento señala que la remoción fue realizada en favor de la clase QgsLayerTreeNode y otras no especifícadas.

miércoles, 7 de marzo de 2018

Método 'writeAsVectorFormat' de QgsVectorFileWriter en QGIS 3

En este post me toca referir el método 'writeAsVectorFormat' de QgsVectorFileWriter debido a que en la adaptación de un plugin se produjo un error en este método debido a que se estaban pasando los parámetros en el orden equivocado. La sintaxis considerada era prácticamente idéntica a la que se encontraba ejemplificada en el PyQGIS Cookbook de la versión 2.x porque, como verifiqué que la clase existía en QGIS 3, asumí erróneamente que los parámetros podrían ser los mismos.

lunes, 5 de marzo de 2018

Memory layers de polígonos en PyQGIS3

La inclusión de la clase QgsPointXY ha impuesto nuevos métodos en QgsGeometry y a la que más ha afectado a la hora de hacer funcionar el código es a las geometrías tipo polígono. Esto es así, en mi caso, porque he implementado mis propios procedimientos para rotar y mover geometrías (para comprender mejor las operaciones) en lugar de usar las propias clases de PyQGIS para estos procedimientos; donde los formatos WKT son los que traerían los menores problemas en lugar de las listas de puntos.

domingo, 4 de marzo de 2018

Rasgos (features) en el orden en el cual son seleccionados mediante PyQGIS3

En esta pregunta de gis.stackexchange.com se plantea cómo almacenar en una variable externa a la función los valores de id correspondientes a los rasgos (features) que han sido seleccionados y en el orden estricto de su selección. Este requerimiento se basa en el hecho de que si se seleccionan todos los rasgos en un orden determinado y se imprimen sus ids la lista de valores corresponde, contrariamente a lo esperado, al orden en que fueron digitalizados.

sábado, 3 de marzo de 2018

Memory layers de líneas en PyQGIS3

A diferencia de las memory layers de puntos que se consideraron en el post anterior, el código que había sido probado en la version 2 de QGIS para las memory layers de líneas corrió, sorprendentemente sin cambios, en la versión 3. Se presenta a continuación:

viernes, 2 de marzo de 2018

Memory layers de puntos en PyQGIS 3

Después de estar luchando con la adaptación de un plugin, desde QGIS2 a QGIS3, para rotar rasgos de diferente geometría y no tener éxito me dije: "vamos a simplificarlo al máximo y a ejecutar como paso previo en la Python Console la creación de una simple capa de puntos como memory layer". Del análisis de los errores me di cuenta que ahora existe una nueva clase, QgsPointXY, que aunque admite operaciones de geometría sus objetos no son geometrías como los QgsPoint. Asumo que esta decisión tiene como finalidad fomentar el uso de los formatos WKT; más manejables a la hora de considerar geometrías.

jueves, 1 de marzo de 2018

Plugin para extraer tiles georreferenciados de alta resolución con Google Satellite y PyQGIS3

En un post anterior se introdujo un procedimiento para conectarse al servicio de Google Satellite (que incluía la nueva versión de QGIS3), grabar una imagen de alta resolución del Map Canvas y, posteriormente, georreferenciarla de forma adecuada mediante gdal_translate.

miércoles, 28 de febrero de 2018

Plugin para producir rásteres con valores enteros aleatorios en QGIS 3

En la versión anterior de QGIS se produjo un complemento (plugin) que permitía producir rásteres con valores enteros aleatorios y cuyo algoritmo se basaba en este post. Ésto es muy útil porque permite obtener pequeños rásteres, alineados con un ráster base, donde los cambios de sus valores enteros, producto de diferentes operaciones, pueden ser fácilmente corroborados.

QgsMapLayerComboBox con filtros en QGIS 3

En el post anterior se consideró la inclusión de objetos Qt del tipo QFileDialog porque hasta ese momento había comprobado que era uno de los que tenía los mayores cambios para la migración a la nueva versión de QGIS 3. En el post actual voy a considerar las QgsMapLayerComboBox con filtros.

QFileDialog del tipo 'getSaveFileName' en un plugin con PyQGIS3

En estos primeros días de trabajo con PyQGIS3 se ha podido comprobar que si no se asume una estrategia de "divide y vencerás" tendremos problemas en la migración de nuestros viejos plugins a la nueva versión de QGIS. La adaptación del código Python puro y de las clases de QGIS no reviste tanta dificultad como la relacionada a los elementos PyQt; los cuales abordaremos a continuación.

martes, 27 de febrero de 2018

Compilando recursos para PyQGIS3 mediante pyrcc4

En un post precedente referí la imposibilidad de compilar los recursos para PyQGIS3 en Windows porque la utilidad pyrcc5 no estaba disponible. Esto me llevó a hacerlo desde Linux.

Creando buffers cuadrados alrededor de puntos con PyQGIS3

Este es un tópico que ya sido considerado aquí pero con la versión anterior de QGIS. Lo rescato en este momento para que se observe que no toda la transición a la nueva versión es difícil. El único cambio en el código señala que la clase QgsMapLayerRegistry ha sido eliminada y sus prestaciones incluidas en QgsProject.

lunes, 26 de febrero de 2018

Primer plugin funcional en QGIS3

Como es bien sabido por los usuarios de QGIS, el viernes 23/02/2018 fue liberada la versión 3 (Girona). No obstante, sólo ayer 25/02/2018 estuvo disponible para ser bajada de los servidores para el sistema operativo Windows.

domingo, 18 de febrero de 2018

Moviendo bounding box de imagen, basada en el centroide, hasta la posición contigua con PyQGIS

En post anteriores (1, 2) se consideró la conexión al servicio de Google Satellite y la automatización en un plugin con el fin de obtener tiles de alta resolución georreferenciados. En este post se tratará uno de los algoritmos para que ello fuese posible.

sábado, 17 de febrero de 2018

Plugin de QGIS para extraer tiles georreferenciados de alta resolución con Google Satellite

En el post anterior se introdujo un procedimiento para conectarse al servicio de Google Satellite, grabar una imagen de alta resolución del Map Canvas y, posteriormente, georreferenciarla de forma adecuada mediante gdal_translate.

lunes, 12 de febrero de 2018

Añadiendo Google Maps Satellite Service con PyQGIS

Añadir el servicio de Google Maps Satellite a través de código PyQGIS es muy sencillo; tal como se evidencia a continuación. Los detalles de la conexión pueden visualizarlos en este link.

jueves, 8 de febrero de 2018

Espesor mínimo de un polígono no convexo con agujeros mediante PyQGIS

En este hilo de gis.stackexchange.com se consideran, aparentemente sin éxito o con un tiempo de cómputo excesivamente largo, diferentes procedimientos para determinar el espesor mínimo de un polígono no convexo con agujeros.

Introducción de objetos tipo polígono (círculos, cuadrados, rectángulos) y texto en imágenes con OpenCV

En este artículo se adaptó un código para incrementar el contraste de una imagen RGB y mejorar su nitidez. Se tiene en mente como objetivo la posibilidad de identificar objetos de una misma clase y contarlos (tales como plantas de cultivo).

lunes, 29 de enero de 2018

Cómo manipular objetos QgsScaleComboBox con PyQGIS

En esta pregunta de gis.stackexchange.com se refiere un comportamiento extraño de los objetos del tipo QgsScaleComboBox en el sentido de que las escalas supuestamente añadidas no podían ser seleccionadas.

miércoles, 24 de enero de 2018

Reordenar rasgos en un vectorial de línea mediante PyQGIS

El vectorial de línea de la imagen siguiente es de partes sencillas (singleparts) con la particularidad de que sus rasgos, de izquierda a derecha y en orden ascendente, no están ordenados secuencialmente como se espera. Esta falta de secuencia puede producir errores a la hora de ejecutar ciertas consultas o algoritmos.

sábado, 20 de enero de 2018

Tratamiento de imágenes con openCV en Python

El post anterior incluye una referencia de la cual adapté el procedimiento para obtener los subarrays a los cuales allí se hacía mención y cuya temática principal era el tratamiento de imágenes.

El artículo referencia tenía como objetivo entender el significado y la aplicación de la convolución de imágenes para difuminarlas, incrementar su contraste o delimitar bordes a través de la aplicación de diferentes filtros que allí se denominaban kernels empleando OpenCV con Python.

miércoles, 17 de enero de 2018

Cómo acceder a los subarrays de píxeles vecinos, en bloques 5x5, mediante el módulo cv2 de OpenCV

OpenCV es una biblioteca libre de visión artificial originalmente desarrollada por Intel. Se ha utilizado en infinidad de aplicaciones que abarcan desde sistemas de seguridad con detección de movimiento, aplicaciones de control de procesos donde se requiere reconocimiento de objetos y, por qué no, análisis de imágenes en el campo SIG.

En un post anterior se usó ndimage, del módulo python scipy, para acceder a subarrays de bloques 3x3. Sin embargo, con el módulo cv2 de OpenCV y numpy el procedimiento es más directo.

jueves, 4 de enero de 2018

Determinando área superficial a partir de un DEM con Python mediante el gradiente de la pendiente (Slope Gradient)

En esta referencia también existe una descripción para aproximar el área superficial, por píxel, de un ráster DEM mediante el gradiente de la pendiente (Slope Gradient). También está basada en la extracción de todos los valores de elevación para una ventana 3x3 para cada píxel para así determinar las áreas 3D de los 8 rectángulos resultantes.

Esto puede observarse con algo más de detalle (vista cenital) en la imagen siguiente:

miércoles, 3 de enero de 2018

Determinando área superficial a partir de un DEM con Python mediante el procedimiento SHR (surface to horizontal area ratio)

En esta referencia existe una descripción más o menos pormenorizada de cómo aproximar el área superficial, por píxel, de un ráster DEM mediante el procedimiento SHR (surface to horizontal area ratio). Esta basado en la extracción de todos los valores de elevación para una ventana 3x3 para cada píxel y así determinar las áreas 3D de los 8 triángulos resultantes.

Esto puede observarse con más detalle (vista cenital) en la imagen siguiente:

viernes, 8 de diciembre de 2017

Reproyectando y guardando un shapefile tipo polígono con GDAL/OGR

El codigo siguiente corrige los problemas de ejecución que presenta este otro para reproyectar un shapefile con base en el sistema de referencia espacial que es tomado de un ráster.

jueves, 7 de diciembre de 2017

Cómo dividir una línea mediante método 'splitFeatures' de QgsVectorlayer con PyQGIS

El método 'splitFeatures' de QgsVectorLayer usa una lista de QgsPoint de una línea de corte para dividir, por ejemplo, otra línea. La división se hará en el punto de intersección de ambas. Para probarlo se utilizarán las capas que se visualizan en la imagen siguiente:

domingo, 3 de diciembre de 2017

Usando getFeatureForm de QgisInterface (iface) en PyQGIS

En QGIS existen varias formas prediseñadas que pueden ser invocadas con código PyQGIS. Una de ellas es la que se utiliza para obtener rasgos (features) y se se llama mediante el método 'getFeatureForm' de QgisInterface (iface). Corresponde a un objeto del tipo QgsAttributeDialog al cual se le pasan como parámetros la capa vectorial y el rasgo que se desee explorar.

sábado, 2 de diciembre de 2017

Empleando Processing gdal:cliprasterbymasklayer en QGIS 2.99

Para finalizar esta visión exploratoria de Processing en QGIS 2.99 voy a seleccionar gdal:cliprasterbymasklayer porque no aparece en la oferta de algoritmos de Processing invocadas con:

jueves, 30 de noviembre de 2017

Usando Processing qgis:intersection en QGIS 2.99 (Windows)

Siguiendo con las pruebas en QGIS 2.99 con Windows hoy le toca el turno a Processing qgis:intersection. Escogí esta herramienta porque tenía unos parámetros (INPUT_FIELDS y OVERLAY_FIELDS) novedosos para mi que imaginé se pasaban como lista y así fue.

El conjunto completo de parámetros a usar es el siguiente:

miércoles, 29 de noviembre de 2017

Usando Processing qgis:creategridpolygon en QGIS 2.99 (Windows)

En post anteriores he estado haciendo pruebas con la versión preliminar 2.99 de QGIS en Windows antes de que salga la versión definitiva (supuestamente casi exenta de errores) 3.0.0. He podido comprobar, por ahora, que no está suficientemente madura como para la producción de plugins. Sin embargo, se pueden probar por separado los algoritmos que estarán dentro de los futuros plugins una vez se resuelvan los problemas de estabilidad.

martes, 28 de noviembre de 2017

Creando plugin para capturar coordenadas del Map Canvas con un click del ratón en QGIS 2.99

En un post anterior se publicó el procedimiento completo para crear un plugin que permitía capturar, en unidades de mapa, las coordenadas del Map Canvas con un click del ratón en QGIS 2.x. En este se va a explorar la factibilidad de hacer lo mismo en QGIS 2.99 (para Windows); a pocas semanas de la liberación definitiva de QGIS 3.0.0.

domingo, 26 de noviembre de 2017

Usando algunas funcionalidades de PyQGIS en QGIS 3 (2.99) para Windows

Como es del conocimiento general y si se cumple la hoja de ruta, el próximo 18 de diciembre será el lanzamiento de QGIS 3.0.0. Para adelantarme a este acontecimiento y saber a que atenerme en el futuro con relación a PyQGIS, bajé e instalé la versión actual de QGIS 2.99 para Windows.

Ya había leido al respecto de que los cambios son numerosos y el reto es ahora afrontarlos. Con relación a la transición de Python 2.7.x a Python 3.0.x algunas cosas he hecho en este Blog y probablemente allí no radicará la dificultad.

viernes, 24 de noviembre de 2017

Moviendo geometría con Python shapely

El código siguiente usa el método 'translate', de shapely.affinity, para mover una geometría que está solapando dos linestrings (ver imagen siguiente) desde init_point hasta final_point; ambos especificados en el código.

jueves, 23 de noviembre de 2017

Crear ruta de mínimo costo con GDAL/Python

En la documentación de Python GDAL/OGR Cookbook 1.0 existe un procedimiento para crear una ruta de mínimo costo empleando un ráster DEM. Para reutilizar el código me propuse probarlo con mi propio DEM y dos puntos arbitrarios; tal como se presentan en la imagen siguiente:

martes, 21 de noviembre de 2017

Estadística zonal robusta con PyQGIS

Uno de los problemas con las herramientas de estadística zonal que vienen generalmente incorporadas con los SIGs es que producen resultados aproximados cuando los rasgos (features) son mucho menores que las celdas del ráster. Esto se debe a que se pueden solapar hasta 4 de ellas, con diferente grado, y no lo ponderan sino que tienden a considerar el de mayor proporción ignorando los otros.

Esto hace que la estadística no sea robusta y se procuren métodos con ejecución de código personalizado para solventar este problema.

lunes, 20 de noviembre de 2017

Cómo reclasificar un ráster basado en cuantiles y descartando los no data values con Python

En el código siguiente los nodata values del array de un ráster se convierten en valores NaN (Not a Number) para aprovechar el método 'nanpercentile' de numpy que permite determinar estos estadísticos fácilmente excluyendo estos valores (algo que no se produce con 'percentile' y los nodata values).

domingo, 19 de noviembre de 2017

Comparando datos en una matriz con Python

En esta pregunta de stackoverflow.com se requiere asistencia para comparar datos en una matriz con Python con el fin de seleccionar los rasgos comunes a las letras del abecedario. Para ello se puede hacer uso de un diccionario para asignar el código correspondiente al rasgo común.

sábado, 18 de noviembre de 2017

Rasterizando con el modulo GDAL/OGR de Python modificando el valor por defecto para los nodata values

En el post anterior se consideró la rasterización de capas vectoriales, con uno o varios rasgos, donde el valor por defecto más allá de éstos era cero. Para modificarlo hay que emplear el método 'Fill' del módulo gdal y posteriormente el método 'SetNoDataValue' para fijar los nodata values.

El código a continuación emplea estos aspectos.

viernes, 17 de noviembre de 2017

Rasterizando con el modulo GDAL/OGR de Python

Con el módulo GDAL/OGR es posible acceder a una herramienta para rasterizar capas vectoriales y usarlas como máscaras ráster. El código que se facilita a continuación permite realizar este proceso dándole al rasgo rasterizado el valor constante de uno.

jueves, 16 de noviembre de 2017

Generando elipse con sus ecuaciones paramétricas y PyQGIS

En un post anterior se generaron buffers empleando las ecuaciones parámetricas de la circunferencia. Las de la elipse son muy similares y basta una pequeña modificación en el código, tal como se muestra a continuación, para producir estas curvas cerradas y sus respectivos polígonos.

miércoles, 15 de noviembre de 2017

Cómo configurar un QFileDialog en un plugin de QGIS para que sólo solicite el directorio

En un post anterior se implementó un QFileDialog con QtDesigner para QGIS. Éste permitía solicitar el nombre del archivo con el cual se deseaba grabar nuestro resultado. Sin embargo, cuando se tiene un lote de archivos o un directorio lo adecuado es que solicite un directorio completo.

martes, 14 de noviembre de 2017

Cómo poblar una QTableWidget con items en PyQGIS

Las QTableWidget son objetos Qt que pueden ser incorporados fácilmente en los Dialog a través del QtDesigner. Una vez añadidas restaría añadirles funcionalidad permitiendo que las filas y columnas de éstas sean llenadas con información útil.

En el caso que se tratará aquí se tiene pensado añadir una QTableWidget empotrada dentro de una QTabWidget para desplegar el nombre y el tipo de capas que se encuentran en la interface de legendas de QGIS.

lunes, 13 de noviembre de 2017

Generando buffer con ecuaciones paramétricas de la circunferencia y PyQGIS

En el artículo anterior se consideró como un ejercicio de programación la generación de un buffer empleando las ecuaciones cartesianas de la circunferencia. En este se van a emplear las ecuaciones paramétricas más que todo para ver que nos estamos "perdiendo" a la hora de usar las aplicaciones ya disponibles en los SIGs.

El código completo se encuentra a continuación:

domingo, 12 de noviembre de 2017

Generando buffer "cartesiano" con PyQGIS

La circunferencia es el lugar geométrico de los puntos de un plano que equidistan de otro punto fijo llamado centro. Su ecuación general, en coordenadas cartesianas, puede ser encontrada aquí.

A partir de la referida ecuación puede despejarse "y" como función de "x" para luego generar diferentes valores de "x", igualmente espaciados, y determinar cuales serían sus correspondientes valores de "y".

sábado, 11 de noviembre de 2017

Cómo recuperar puntos rasterizados con el orden como value y construir una bounding box orientada

En la imagen a continuación se tienen unos puntos rasterizados con una resolución 10x10 donde como value se ha incorporado el orden de los puntos. El objetivo es vectorizar nuevamente esos puntos, en el orden correcto, para contruir con ellos una bounding box orientada.

Para ello se va a emplear una mezcla de procedimientos de GDAL/OGR y PyQGIS.

viernes, 10 de noviembre de 2017

Reproyectando un ráster con processing gdalogr:warpreproject

Una forma expedita de reproyectar un ráster con PyQGIS es mediante la herramienta gdalogr:warpreproject de Processing.

La información sobre los parámetros a ser empleados se encuentran en la imagen siguiente:

sábado, 4 de noviembre de 2017

Suma de rásteres con pygeoprocessing evitando la generación de nodata values

Generalmente, cuando se utiliza cualquier versión de Raster Calculator (processing, pygeoprocessing, etc) proveniente del software libre uno de los requerimientos es que los rásteres tengan la misma resolución y estén perfectamente alineados.

Cuando se piensa en comenzar una rutina de trabajo con la rasterización de un vectorial como máscara, la limitación que se tiene es que, a pesar de tener control sobre la resolución, los rásteres resultantes no estarán alineados entre si para diferentes features y se producen nodata values que dificultan el álgebra de mapas en aquellas regiones donde aparecen.

viernes, 3 de noviembre de 2017

Extrayendo valores ráster dentro de shapefile con pygeoprocessing, gdal, shapely y fiona

El módulo "third party" pygeoprocessing de python facilita algunas funciones que pueden realizarse con GDAL e internamente emplea fiona y shapely por lo que si logran instalarlo sin problemas mediante pip tendrán acceso también a estos módulos.

Lo que si he podido detectar es que no tengo acceso a muchos de los métodos descritos en el manual por lo que sospecho que ha sido pensado más bien para Python 3 o debo forzar la instalación de la última versión con pip en Python 2.7.

miércoles, 1 de noviembre de 2017

Cómo desactivar el Dialog de introducción de valores de atributos mediante PyQGIS

Cuando estamos digitando una capa y necesitamos apremio en la introducción de los puntos, nodos o vértices, se nos presenta un Dialog de introducción de valores de atributos en el que necesariamente debemos hacer click en OK para que estos se añadan a la capa; lo cual enlentece el proceso. Si no se rellena la forma y se hace click en OK los valores serán NULL y pueden ser editados posteriormente.

Para desactivar este comportamiento mediante PyQGIS es necesario recurrir al siguiente par de intrucciones en la Python Console de QGIS:

lunes, 30 de octubre de 2017

Usando pygeoprocessing.geoprocessing.raster_calculator

El módulo pygeoprocessing de python tiene la opción de códificar una herramienta de cálculo ráster (raster_calculator) de una manera mucho más amigable que la de PyQGIS y equiparable a las de Processing. Como es "third part" puede instalarse con pip o easy_install.

Si importan el módulo en la Python Console (ver código siguiente), un help(geop.raster_calculator) les dará información detallada acerca de los parámetros a usar.

jueves, 26 de octubre de 2017

Cómo conectar una QComboBox para actualizar adecuadamente las capas mediante PyQGIS en un plugin

La actualización automática de las capas (vectoriales o ráster) en objetos del tipo Combo Box ("persiana desplegable") puede realizarse con objetos del tipo QgsMapLayerComboBox en PyQGIS. Sin embargo, siempre existe aquel que quiere hacerlo todo desde cero empleando los precursores Qt denominados QComboBox.

En este caso, cada vez que se detecta una situación o un cambio en el número de capas en el Map Canvas, el registro o en la interface de leyendas debería conectarse al slot (función) para que la QComboBox se actualice debidamente.

lunes, 9 de octubre de 2017

Cómo detectar solapamiento en conjunto de glóbulos de apariencia circular

La necesidad de esta tarea surge de una pregunta realizada en el site de gis.stackexchange.com referida a una imagen. La imagen es binaria y, por tanto, fácilmente vectorizable.

Los vectores obtenidos serían cuerpos globulares, de apariencia cuasi circular, aislados o agrupados; en estos últimos con evidencia de solapamiento. Por tanto, la pregunta que surge es cómo detectar solapamiento en los grupos de glóbulos.

domingo, 8 de octubre de 2017

Cómo calcular la diferencia máxima en elevación entre un punto y las direcciones cardinales a su alrededor

El código que se presenta a continuación permite determinar la diferencia en elevación entre un punto y las direcciones cardinales a su alrededor. Inicialmente, emplea un método de numpy para generar puntos correspondientes a un polígono de ocho lados alrededor de cada punto original y luego agruparlos por pares para producir cada dirección cardinal como memory layer.

Posteriomente, cada dirección cardinal es interpolada por el tamaño de la resolución del ráster y cada punto es usado para obtener los raster values a lo largo de las referidas direcciones para finalmente seleccionar la del valor máximo con su índice respectivo.

lunes, 2 de octubre de 2017

Cómo acceder a los subarrays de píxeles vecinos, en bloques 3x3, mediante ndimage del módulo scipy

En un artículo anterior se hizo mención a una manera expedita para determinar la estadística de píxeles vecinos, en bloques 3x3, mediante ndimage del módulo scipy. En este post se va a considerar dos maneras de acceder a los subarrays que permitieron determinar tales estadísticas.

Como puede observarse en la documentación de ndimage.generic_filter, el segundo parámetro es una función que puede ser invocada externamente. Desde allí se se puede acceder a los valores individuales de cada subarray e imprimirlos a un archivo de texto en disco para ser usados más adelante en el código principal. Sería la primera manera.

viernes, 29 de septiembre de 2017

Campos múltiples con qgis:fieldcalculator de PyQGIS Proccessing

La generación múltiple de campos es posible a través de qgis:fieldcalculator de PyQGIS Processing; donde las opciones de los parámetros pueden incluirse como una plantilla en un diccionario. A continuación, se presentan cuáles son las referidas opciones en la imagen siguiente:

martes, 26 de septiembre de 2017

Determinación de la sinuosidad de una línea con PyQGIS Processing

La sinuosidad de una línea se define como el cociente de su distancia total y la distancia euclidiana entre su punto de comienzo y su punto final; tal como se ejemplifica aquí. En el link anterior también se señala como soslayar el inconveniente de acceder al resultado de un commando de GRASS (v.to.db; option=sinuous), imposible directamente a través de Processing, pero si a través del 'fieldcalculator' de QGIS (y por ende de PyQGIS Processing).

El código que se presenta a continuación fue ligeramente modificado para permitir la carga directa de la capa resultante en un sólo paso mediante el método 'runandload'.

sábado, 9 de septiembre de 2017

Estadística de píxeles vecinos, en bloques 3x3, mediante ndimage del módulo scipy

Cuando se requiere determinar las estadísticas de píxeles vecinos en un ráster, el efecto a considerar cuando se recorre cada uno de los píxeles es el de borde. En los bordes, por ejemplo, un bloque de 3x3 estará truncado y hay que tomarlo en consideración al determinar las estadísticas.

Con Python y numpy una forma de soslayar esto es añadiendo un "anillo" de valores que se considerán como NoData; tal como se presenta en el código siguiente:

viernes, 1 de septiembre de 2017

Generando y rotando rectángulos a partir de puntos con atributos largo, ancho y ángulo de rotación mediante PyQGIS

Cuando se quiere generar y rotar rectángulos con base a parámetros que se encuentran en la tabla de atributos de un vectorial de puntos una buena opción es mediante un script de PyQGIS. El ancho y el largo serán usados para producir un objecto de la clase QgsRectangle que será convertido en geometría y rotado con respecto al punto (que también actúa como centroide del rectángulo).

Para ejecutar el procedimiento se consideró el shapefile de la imagen siguiente donde también se puede observar la tabla de atributos con los campos largo, ancho y ángulo de rotación ya referidos.

jueves, 31 de agosto de 2017

Generando memory layer de bordes, para capa tipo polígono, e información de interacciones en tabla de atributos

El código que se presenta a continuación produce como salida una memory layer tipo MultiLineString para cada uno de los features que representen bordes entre los rasgos adyacentes de una capa tipo polígono single parts.

En la tabla de atributos de la MultiLineString se crean dos campos que albergan información de la interaccion entre los features, es decir, se imprimen los nombres de los rasgos adyacentes en la capa tipo polígono que dieron lugar al borde.

domingo, 27 de agosto de 2017

Plugin para dividir líneas por puntos o por partes iguales

En diferentes posts anteriores (1, 2, 3) se exploró la posibilidad de dividir líneas por puntos o en partes iguales. En este se va a condensar la información que permite la creación de un plugin que divide líneas por puntos o en partes iguales.

Como en el último caso se imprime la magnitud del intervalo se puede obtener un espaciamiento aproximado a alguno deseado mediante la técnica de ensayo y error.

martes, 15 de agosto de 2017

Creación de buffer en coordenadas geográficas con shapely y pyproj

Por alguna razón, varios usuarios de SIGs se rehusan a reprojectar su data en coordenadas geográficas a proyecciones en metros (o pies) y luego, cuando se ven en la necesidad de determinar algunas propiedades geométricas (áreas, longitudes) o producir cierto tipo de capas como los buffer, se les presentan dificultades.

En el caso de los buffer, si se trabaja con coordenadas geográficas, es necesario pasar previamente las geometrías a coordenadas proyectadas y luego, una vez obtenida, reproyectar al sistema de origen.

domingo, 13 de agosto de 2017

Porcentaje de intersección de areas de polígonos mediante fiona y shapely con Python3 en Debian

Continuando con la ejecución de código compatible con Python3 en SIGs se va a considerar el porcentaje de intersección de áreas de polígonos empleando los módulos python fiona y shapely instalados mediante pip3. En este caso, la lógica del algoritmo sigue una sintaxis muy similar a la ejecutada en un sistema con PyQGIS.

La compatibilidad con Python 2.7.x se logra encerrando entre paréntesis el argumento de los 'print' correspondientes. No obstante, la primera ejecución arrojó el error siguiente:

Dividir vectoriales tipo línea en partes iguales mediante algoritmo basado en azimuths con Python3 en Debian

Con el advenimiento de QGIS 3 el próximo 29 de septiembre de 2017, si se cumple exactamente el cronograma de liberación, habrán varios cambios que afectarán la compatibilidad de todas las aplicaciones que hasta ahora se han realizado en QGIS 2.x. La razón principal es que QGIS dejará de usar Python 2.7.x en favor de Python 3.x y el framework Qt4/PyQt4 para dar paso a Qt5/PyQt5. Por tanto, conviene estar preparado.

Como en el post anterior se empleó un algoritmo basado en azimuths para dividir vectoriales tipo línea en partes iguales, el cual utilizaba una mezcla de librerías third party de python (fiona y shapely) conjuntamente con PyQGIS, se pensó adaptar dicho script para ser funcional con Python 3.

sábado, 12 de agosto de 2017

Dividir vectoriales tipo línea en partes iguales mediante algoritmo basado en azimuths

En el post anterior se consideró la división de vectoriales tipo línea con puntos mediante un algoritmo basado en azimuths. En éste se va tratar la misma división del vectorial pero en partes iguales. Por tanto, los puntos deberían estar igualmente espaciados.

Como se puede preveer, en este caso no se requiere una capa explícita de puntos sino que se pueden generar mediante el método 'interpolate' de shapely.geometry. El código completo, para una división en 15 partes iguales, es el siguiente:

miércoles, 9 de agosto de 2017

Dividir vectoriales tipo línea con puntos mediante algoritmo basado en azimuths

En el post anterior se consideró un algoritmo para agrupar puntos por segmentos de recta mediante listas Python. En éste lo vamos a complementar con otro basado en azimuths para dividir rectas mediante puntos.

La lectura del archivo vectorial se va a realizar con fiona y las coordenadas y la geometría se conforman con shapely. El código completo se presenta a continuación e incluye los puntos de corte:

martes, 8 de agosto de 2017

Algoritmo para agrupar puntos por segmentos de recta mediante listas Python

Si Uds buscan en Processing de QGIS se darán cuenta que no encontrarán una aplicación para dividir rectas mediante puntos. La aplicación que aparece es la de dividir rectas con rectas, que funciona como se desea, pero hay que generar manualmente las rectas que cortan (o dividen) a la recta en los puntos deseados.

Tratando de indagar el porqué de esta carencia me di cuenta que el algoritmo para dividir mediante puntos no era tan sencillo como esperaba. En principio, se trata de posicionar estos puntos sobre la recta en las zonas de corte y mientras mayor sea el número de partes en las cuales se desee dividir mayor será la cantidad de éstos a posicionar.

sábado, 22 de julio de 2017

Grid hexagonal con MMQGIS

El plugin MMQGIS es multifuncional y permite, entre otras, producir rejillas (grids) hexagonales. La interface pide como parámetros valores (x, y) que no están muy claramente establecidos a que se refieren. Estos valores están encadenados, es decir, si se fija el valor de x el valor de y queda determinado o viceversa. Generalmente, la caracterización de un polígono hexagonal regular, que descansa sobre uno de sus lados (distancia individual L), se hace con base a la distancia entre el centro y la mitad del lado superior y la dimensión de cualquiera de sus lados.

Después de algunas comprobaciones, se encontró que los valores (x,y) para el plugin MMQGIS, en el caso de las grid hexagonales, guardan la relación que se encuentra en la figura siguiente:

viernes, 14 de julio de 2017

Snapping puntos de un rasgo a otro en un vectorial tipo polígono mediante PyQGIS

Una forma para realizar esto es generando primero todo los vértices para cada rasgo debido a que el método 'moveVertex' de QgsVectorLayer tiene como parametros un QgsPoint del rasgo destino (target) y el id del rasgo fuente (source) y el id del vértice en dicho rasgo. Tales vértices se almacenan en una memory layer de puntos.

El código completo se añade a continuación:

jueves, 13 de julio de 2017

Ejemplo de QgsFieldComboBox.setFilters() en la creación de un plugin con PyQGIS

Los objetos de QgsFieldComboBox (menús tipo persiana para campos de archivos vectoriales) aceptan filtros de la clase QgsFieldProxyModel para desplegar sólo aquellos que tengan un tipo determinado (All, Date, Double, Int, LongLong, Numeric, String, Time). El único cuidado que hay que tener es establecer la debida conexión al slot (función) que permita actualizar los campos cada vez que cambia la capa vectorial.

El código siguiente ha sido preparado para ejecutarse en la Python Console de QGIS. La colocación de las líneas en las funciones respectivas del plugin (__init__, initGui, run, etc) queda por parte del lector.

domingo, 9 de julio de 2017

Establecer estilo de borde a 'no pen' empleando un QgsGraduatedSymbolRendererV2 con PyQGIS

Aunque puedan parecer similares los objetos QgsGraduatedSymbolRendererV2, a diferencia de los QgsCategorizedSymbolRendererV2, no pueden ser instanciados de la misma forma. Para crear el renderer en un sólo paso es necesario obtener primero una rampa de colores (objeto de la clase QgsVectorGradientColorRampV2) que automáticamente generará los símbolos de acuerdo al campo elegido en la tabla de atributos y el número de clases establecidos. El método para colocar el estilo de borde a 'no pen' está en los símbolos (QgsFillSymbolV2 para capas de tipo polígono) y corresponde, para esta tarea, a 'setOutputUnit(1)'. El código completo se encuentra a continuación:

sábado, 8 de julio de 2017

Añadiendo opción de 'offset', al renderer de líneas que se solapan en la misma capa, con PyQGIS

Cuando se tienen rasgos solapados en una misma capa la opción que funciona para separarlos es mediante un renderer de tipo QgsCategorizedSymbolRendererV2. Para ello, primero hay que crear los símbolos y después las categorías correspondientes a éstos. Para instanciar el renderer se le pasa como parámetro el label del campo objeto de la categorización. Finalmente, se añaden las categorías al renderer, este último a la capa y se "refresca" (método 'triggerRepaint' de QgsVectorLayer) para visualizar los resulatdos.

jueves, 6 de julio de 2017

Clase personalizada en PyQGIS para generar tooltips con values de ráster y registros de tablas atributivas de vectoriales

Con base en esta respuesta de gis.stackexchange.com, modifiqué la clase para incorporar como funcionalidades adicionales la posibilidad de visualizar e imprimir no sólo los values de los ráster sino también los atributos de vectoriales tipo punto, línea o polígono. El código completo se encuentra a continuación.

sábado, 1 de julio de 2017

Obtener coordenadas de un click del ratón mediante una clase personalizada en PyQGIS

En un post anterior se hizo mención a la forma de recuperar las coordenadas de un punto mediante un click del ratón empleando la clase QgsMapToolEmitPoint de PyQGIS. La forma como está allí expresada se basa en una analogía con relación a un código tomado del libro de Gary Sherman para la clase QgsMapToolEmitPoint. Sin embargo, ésto es mucho más fácil con esta nueva versión simplificada del código.

jueves, 22 de junio de 2017

Cómo medir la distancia media entre puntos, para un radio fijo, mediante PyQGIS

El código siguiente permite determinar la distancia media, en un radio de 500 m, para todos los rasgos de un vectorial de puntos. Para evitar repeticiones innecesarias en las determinaciones de distancias se emplea el método 'combinations' del módulo itertools. Para verificar que el código se comporta de la manera esperada se determinan los índices correspondientes a cada grupo de distancias que satifacen el requerimiento.

lunes, 19 de junio de 2017

Ráster de atenuación de ruido obtenido mediante PyQGIS para una fuente lineal

En el post anterior se consideró la obtención de un ráster de atenuación de ruido obtenido mediante PyQGIS para una fuente puntual. En éste se tomará en cuenta una fuente lineal de ruido; tal como corresponde a una autopista con mucho tráfico donde los valores pueden ser tan altos como de 90 dBA (Id1) a una distancia d1 de sólo 1 m.

domingo, 18 de junio de 2017

Ráster de atenuación de ruido obtenido mediante PyQGIS para una fuente puntual

La atenuación del ruido, tal como ya se ha señalado con anterioridad, depende de si la fuente emisora es puntual o lineal. En ausencia de obstáculos, se refiere que cada vez que se dobla la distancia con relación a una fuente puntual el sonido se atenua en 6 dBA (decibelios), mientras que en el segundo caso, cada vez que se dobla la distancia con relación a una fuente lineal (por ejemplo, una autopista con mucho tráfico automotor) la atenuación del sonido será sólo de 3 dBA. Generalmente, los reportes de Tabla para la intensidad del sónido (Id1) producida por una determinada fuente puntual se hacen con base a una distancia fija que denominaremos d1. Por tanto, para una taladradora de construcción, es común que se reporte que produce una intensidad de 110 dBA (Id1) a una distancia d1 de 10 m.

miércoles, 14 de junio de 2017

Obtener el valor de un atributo de una capa vectorial mediante un click del ratón con PyQGIS

Esto puede ser realizado mediante la clase QgsMapToolEmitPoint la cual permite generar, al inicio, las coordenadas de un punto a cada click del ratón en la Map View de QGIS. Estas coordenadas se emplean para generar un QgsPoint y comprobar posteriormente si está dentro o fuera de algún rasgo del vectorial. Si está dentro del feature, se recupera su id para acceder entonces al value del atributo empleando el nombre del campo correspondiente. El código completo se tiene a continuación:

viernes, 26 de mayo de 2017

Leer el valor de un ráster y cambiarlo según condiciones dadas mediante PyQGIS

El código que se presenta a continuación lee todos los valores de un ráster mediante un objeto de la clase QgsRasterBlock y los cambia según condiciones establecidas para imprimirlos en un nuevo ráster. Para facilitar la ubicación de tales valores, complementariamente, se crean memory layers de puntos, según cada condición, y se colocan en el medio de las celdas del ráster.

miércoles, 24 de mayo de 2017

Dividiendo círculos en 12 secciones mediante PyQGIS

Para dividir un círculo en 12 doce secciones se puede recurrir a la obtención de un buffer con 12 lados, de un vectorial de punto, para luego producir cada una de las divisiones empleando las coordenadas de los puntos exteriores y las de su centroide (este último común a todas ellas). Como la visualización de la capa resultante no es enteramente circular, paralelamente mediante el método buffer de QgsGeometry, se produce un buffer algo menor para que al ser intersectado con cada rasgo 1/12 se obtenga el efecto deseado.

lunes, 15 de mayo de 2017

Instalar fiona y geopandas en un sistema GNU/Debian estable recien instalado

Recientemente, me vi en la necesidad de instalar un nuevo sistema GNU/Debian estable (Debian 8) porque la actualización de su predecesor transcurrió con un corte de energía eléctrica y los daños fueron irrecuperables. Posteriormente, cuando en consola (como superusuario) me dispuse a instalar fiona y geopandas con easy_install, el cual se encuentra disponible en el paquete setuptools de Debian, se produjo un error inesperado. Es de hacer notar que el único paquete SIG que había instalado hasta el momento era QGIS a través de su repositorio respectivo.

Investigando la posible causa encontré que fiona requiere compilar código C++ de GDAL\OGR para instalarse (al igual que geopandas), por lo que resultaba evidente la posibilidad de dependencias insatisfechas, es decir, la necesidad de un compilador g++. Una investigación algo más exhaustiva me llevó a que la instalación del compilador y sus dependencias estaba garantizada con:

jueves, 30 de marzo de 2017

Contar el número de celdas de cada tipo por bloque en QGIS

En una pregunta de gis.stackexchange.com se consideró la forma de contar el número de celdas de cada tipo por bloque; pero referido al software ArcGis. Obviamente, una manera de hacer esto es con código y para ello se pueden usar las prestaciones del módulo python de GDAL o las clases de PyQGIS. Sin embargo, lo que me llamó la atención fue la ingeniosa solución aritmética de esta respuesta.

miércoles, 29 de marzo de 2017

Interpolación de colores con PyQGIS

La interpolación de colores es un aspecto importante en la simbolización de capas vectoriales y raster porque permite visualizar rasgos (features) o píxeles según un color asignado a la clase a la que pertenecen. El método de interpolación más sencillo que existe es el lineal, sin embargo, para rampas con sólo dos colores, tiene la dificultad (sobre todo para ráster) de establecer buenas gradaciones entre ambos. No obstante, esto se puede mitigar con la incorporación de un color intermedio y así mejorar la gradación.

sábado, 25 de marzo de 2017

Corrigiendo geometrías con PyQGIS: segunda parte

En el post anterior se consideró la corrección de una geometría con problemas en el sentido de que no se podía generar el poligono correspondiente a partir de los rasgos de línea. Se determinó la existencia de varios gaps que fueron corregidos mediante v.clean de la Processing Tool Box. Sin embargo, esto no era la causa de los problemas.

miércoles, 22 de marzo de 2017

Corrigiendo geometrías con PyQGIS: primera parte

En un post anterior se escribió acerca de la validación y corrección de geometrías y de este link se puede bajar un shapefile de cierta zona de Malasia el cual no permite convertirlo adecuadamente en el polígono esperado a pesar de no presentar, aparentemente, problemas de geometría. Sin embargo, de manera subyacente, presenta muchas inconsistencias.

viernes, 17 de marzo de 2017

Validando y corrigiendo geometrías con PyQGIS y plugin Processing LWGEOM Provider en GNU/Linux Debian

La validación de las geometrías es fácilmente realizable en PyQGIS con el método 'isGeosValid' de QgsGeometry. Sin embargo, la corrección una vez detectados los problemas no es tan directa porque los procedimientos disponibles en Processing a veces no funcionan. Un método que es prácticamente infalible es ST_MakeValid de PostGis; pero cuenta con la necesidad de que hay que tener instalado PostgreSQL+PostGis en el sistema.

jueves, 16 de marzo de 2017

Selección de features de puntos con distancia mínima a features tipo polígono en PyQGIS

Estos pueden ser seleccionados mediante la función 'distance' de QgsGeometry para las sucesivas interacciones entre rasgos en un double loop. La condición de distancia mínima se incluye en el loop (en este caso 10000 m = 10 km) lo que sirve para poblar las listas con las distancias y los ids (o los nombres) de los rasgos seleccionados.

miércoles, 15 de marzo de 2017

Cómo colocar puntos a lo largo de una línea usando una lista de distancias con PyQGIS

Existe un procedimiento en processing (qgis:createpointsalonglines) que permite realizar la tarea y, posiblemente, se pueda programar para diferentes separaciones. No obstante, a continuación, expondré un código muy sencillo que emplea PyQGIS. La base del mismo es el método 'interpolate' de QgsGeometry. Se usa para generar puntos irregularmente espaciados sobre una línea con base en una lista de separaciones entre los puntos. Por tanto, las distancias se determinan como suma de las respectivas separaciones.

martes, 14 de marzo de 2017

Cómo imprimir un punto a cada click del ratón sobre el Map Canvas con PyQGIS

La impresión de un punto a cada click del ráton es una acción muy útil que puede ser aprovechada, por ejemplo, para conformar un vectorial de puntos con el plugin QuickWKT, determinar los índices de (fila, columna) de un ráster o posicionar el cursor en una determinada posición del Map Canvas. Emplea objetos y métodos de la clase QgsMapToolEmitPoint para conectar a una función que permite desplegar las coordenadas de tales puntos en unidades de mapa, coordenadas de Map Canvas o coordenadas globales.

domingo, 12 de marzo de 2017

Cómo copiar a una columna el nombre del color para un vectorial con Graduated Symbol Renderer en PyQGIS

En esta pregunta de gis.stackexchange.com se indaga acerca de cómo guardar el color de un rasgo en un campo de la tabla de atributos para un vectorial que ha sido clasificado con un renderizado "Graduated Symbol". La razón de ésta se debe a que el script empleado directamente de otra pregunta no funciona porque es válido para un Categorized Symbol Renderer.

sábado, 11 de marzo de 2017

Uso de processing gdalogr:cliprasterbymasklayer con PyQGIS

Cortar (clip) un ráster por máscara (vectorial tipo polígono) es otra de las opciones también disponibles en processing a través del método gdalogr:cliprasterbymasklayer. Sin embargo, no produce una capa perfectamente alineada con el ráster base; algo que posteriormente habría que solucionar en el parámetro 'EXTRA'.

jueves, 9 de marzo de 2017

Uso de processing 'grass:r.lake.coords' con PyQGIS

El algoritmo de processing 'grass:r.lake.coords' permite generar el espejo de agua de un lago a partir de un ráster dem utilizando principalmente como parámetros de entrada la cota de llenado y las coordenadas de un punto dentro del referido espejo de agua. Para que la ejecución del algoritmo tenga sentido es necesario que el ráster dem incluya un relieve encajante, es decir, que evite que el agua se "derrame" y abarque toda la superficie del ráster.

miércoles, 8 de marzo de 2017

Determinación del rasgo central (feature) con base en la suma de distancias en PyQGIS

En el post anterior se consideró un algoritmo que permite reducir el tiempo de cómputo de la suma de distancias porque las realiza sólo en la porción triangular superior de la matriz de distancias. En este post el referido algoritmo se incluye en un codigo que permite determinar el feature central para la capa activa. Se ha escogido una capa de puntos con 700 rasgos; tal como se observa a continuación:

martes, 7 de marzo de 2017

Suma de distancias en matriz triangular de distancias con Python

La suma de distancias entre rasgos es un elemento que puede ser usado para establecer el rasgo central de una capa porque es la que presenta el valor mínimo. En los SIGs estas distancias generalmente se determinan, por defecto, para capas tipo punto; aunque cualquier geometría es admisible. Sin embargo, cuando el número de features es muy elevado, el tiempo de computo de las distancias se incrementa considerablemente.

lunes, 6 de marzo de 2017

Usando processing gdalogr:rastercalculator para determinar NDVI con PyQGIS

El empleo de cocientes o índices para identificar masas vegetales tiene su base en que una masa vegetal en óptimas condiciones posee una firma espectral que se caracteriza, en especial, por un claro contraste entre la banda del rojo (0.6 a 0.7 µm) y el infrarrojo cercano (0.7 a 1.1 µm). Esto se debe a que la mayor parte de la radiación solar recibida por la planta en el visible es absorbida por los pigmentos de las hojas y éstos apenas afectan a la radiación recibida en el infrarrojo cercano. En el caso del NDVI (Indice de Vegetación de Diferencias Normalizadas; por sus siglas en inglés), éste se determina dividiendo la diferencia de la banda infrarroja (NIR) menos la roja (RED) entre la suma de ambas (NIR+RED); expresadas en términos de reflectividad.

domingo, 5 de marzo de 2017

Algoritmo de Ramer–Douglas–Peucker con PyQGIS

El algoritmo de Ramer–Douglas–Peucker (RDP)1, 2 permite reducir el número de puntos utilizados en la aproximación de una curva. Se fundamenta en la búsqueda de puntos críticos a partir de una tolerancia lineal. La primera línea base corresponde al primer (anclaje) y último punto (flotante) de la línea original. Luego se calculan las distancias perpendiculares de todos los puntos intermedios. Si ninguna de estas distancias es mayor a la tolerancia sólo quedarán retenidos los puntos inicial y final de la línea. Sí se supera la tolerancia el punto con mayor distancia será retenido como punto crítico subdividiendo la línea original en dos secciones. En cada una se repite el proceso de manera independiente y así, sucesivamente, hasta que no haga falta efectuar subdivisión alguna de las líneas.

viernes, 3 de marzo de 2017

Cambiando la capa activa en una Combo Box (PyQGIS)

Aunque existe un método directo y automático para seleccionar capas en la programación con PyQGIS, mediante el uso de un objeto QgsMapLayerComboBox, también es útil conocer cómo puede realizarse ésto empleando un objeto Qt representado por una QComboBox.

martes, 28 de febrero de 2017

Usando Processing qgis:creategrid con PyQGIS

En este post se van a probar diferentes opciones correspondientes a la creacción de retículas mediante el método 'creategrid' de QGIS Processing. Para ello se va usar como base para la obtención de la extensión un ráster que no necesita estar cargado en la Map View de QGIS porque la referencia al objeto se obtiene a partir de una URI (uniform resource identifier) mediante el método 'getObjectFromUri' de processing.

domingo, 26 de febrero de 2017

Estadística zonal con rasgos que se solapan usando PyQGIS

Para determinar la estadística zonal en un vectorial cuyos rasgos se solapan sobre un ráster, se pueden usar los métodos 'unary_union' y 'polygonize' del módulo 'shapely' de Python. El uso combinado de estos métodos permite individualizar las zonas solapadas y facilitar el cálculo de las estadísticas. Para probar esta aproximación se usaron el shapefile y el ráster que se viasualizan en la imagen siguiente:

Graphic Modeler en QGIS para determinar cuantiles y reclasificar un ráster con base en ellos

El Graphic Modeler de QGIS permite crear modelos complejos combinando los algoritmos que ya se encuentran en la Processing Toolbox. Este presenta un Canvas hacia donde la estructura del modelo y el flujo de trabajo puede añadirse según los 9 parámetros de entrada y los algoritmos que se encuentran en la parte izquierda del Canvas. Los elementos de entrada y los algoritmos se añaden con doble click y los primeros se nombran de la manera adecuada para que al usarse dentro de estos últimos se créen los enlaces correspondientes dentro del esquema.

viernes, 24 de febrero de 2017

Processing taudem:peukerdouglas en GNU/Linux Debian

La instalación y ejecución de algoritmos TauDEM en Windows fue considerada en un post anterior. En Linux, la instalación puede ser automatizada utilizando el script obtenido de esta página. A pesar de que el nombre del script sugiera que sólo puede instalarse en Ubuntu, si miran dentro del script verán que fue desarrollado inicialmente para Debian y es de validez universal para cualquier sistema derivado de Debian.

jueves, 23 de febrero de 2017

Buffering pixels en un array de python

En esta pregunta de gis.stackexchange se indaga sobre la posibilidad de un algoritmo que permita producir un anillo de ceros (buffer) alrededor de cada cero en un ráster binario (values 0 y 1). Una vía posible para hacer esto es generar todas las tuplas de índices para los cuales se desean los ceros, almacenarlos en una lista (sin repetición) y luego usar esta para cambiar los unos por ceros en una matriz con values 1 generada con la misma dimensión del array original.

martes, 21 de febrero de 2017

Processing taudem:d8flowdirections para determinar mapas de pendiente y dirección de flujo

TauDEM (Terrain Analysis Using Digital Elevation Models) es una suite de herramientas para Modelos de Elevación Digital (DEM por sus siglas en inglés) que permite la extracción y análisis de información hidrólogica de la topografía que viene representada por el DEM. A pesar de que viene supuestamente disponible para ser usada directamente en Processing de QGIS, lo cierto es que debe ser instalada previamente, habilitada en las opciones de Processing y establecidas las rutas correspondientes a las herramientas y sus dependencias.

lunes, 20 de febrero de 2017

Rotación de vectoriales con processing grass:v.transform en PyQGIS

El comando grass:v.transform de processing permite, mediante una transformación afin, realizar translaciones y rotaciones de archivos vectoriales; independientemente de su tipo y número de rasgos. Las translaciones pueden implementarse de una manera directa pero las rotaciones involucran un grado de complejidad adicional. Ello se debe a que las rotaciones se realizan con relación al eje (0,0) y para implementarlas con relación a otro eje (por ejemplo el centroide de un vectorial) es necesario un cambio del sistema vectorial de referencia.

sábado, 18 de febrero de 2017

Usando grass:v.buffer.distance en PyQGIS

El comando grass:v.buffer.distance es otra de las opciones de GRASS disponible en 'processing' de QGIS y sus parámetros, donde la interpretación de algunos de ellos puede encontrarse en el manual en línea, se visualizan en la imagen siguiente:

viernes, 17 de febrero de 2017

Processing gdalogr:cliprasterbyextent en PyQGIS para cortar un ráster por extensión

En esta ocasión se va a probar en PyQGIS el método de processing gdalogr:cliprasterbyextent para cortar un ráster por extensión. Para el "corte" se va a emplear la extensión de un vectorial tipo polígono; tal como se presenta en la imagen siguiente:

jueves, 16 de febrero de 2017

Utilizando gdalogr:translate en PyQGIS para convertir values a nodata

Continuando con los métodos de Processing, hoy se van a considerar los de GDAL/OGR para trabajar por vez primera en estos posts con archivos de tipo ráster. En este caso, se va a probar el método 'gdalogr:translate' para transformar en 'no data' los values iguales a cero en un ráster de 20 x 20 con values aleatorios entre 0 y 10. El plugin de 'Processing Information' (ver imagen siguiente) permite corroborar la presencia de 44 geoalgoritmos en este renglon; entre los cuales se encuentra el de nuestro interés: 'gdalogr:translate' (número 42).

Utilizando grass:v.voronoi en PyQGIS

Siguiendo con los métodos de Processing, hoy se van a considerar los de GRASS. Estos tienen la particularidad de que para hacerlos funcionar adecuadamente hay que saber cómo introducir el parámetro correspondiente a la región de GRASS; que no es más que una simple extensión. En la imagen siguiente se despliegan, a través del plugin, los 160 algoritmos que de GRASS se tienen a la disposición en 'processing'.

miércoles, 15 de febrero de 2017

Utilizando saga:linepolygonintersection en PyQGIS

Siguiendo con los métodos de Processing, hoy se va a considerar 'linepolygonintersection'. Este produce, a diferencia del anterior, un vectorial de línea. No obstante, se va a cambiar la forma de visualizar la capa automatizando la carga al Map Canvas. Para ello, se utiliza el paso generado alaeatoriamente cuando se usa como parámetro None en la opción correspondiente.

martes, 14 de febrero de 2017

Utilizando saga:polygonlineintersection en PyQGIS

Una de las situaciones que nos obliga a no explorar con más detalle las opciones que ofrece 'Processing' en QGIS es la dificultad que supone el acceso a su documentación. Aunque existe, ésta es muy escueta y se limita a unos pocos ejemplos. Por otra parte, la documentación que ofrece la ayuda de la Python Consola a través de la ejecución de los comandos 'processing.alglist' y 'processing.alghelp' tiene el inconveniente de que no pueden ser asignadas a una variable; a menos que se redirija el flujo de salida estándar. Esto último facilitaría la evaluación de los posibles métodos de 'Processing' mediante el módulo de expresiones regulares.

domingo, 12 de febrero de 2017

Redirigiendo la escritura de la salida estándar por defecto (consola) en Python a una variable

La mayoría de los resultados que en Python imprimimos a través de la consola pueden ser redireccionados facilmente a una variable, a un archivo en memoria o en disco, o a un objeto de visualización de PyQt4; como por ejemplo una QTextBrowser. No obstante, existen algunos pocos comandos que, por defecto, no lo hacen y hay que definir la salida estándar (stdout). Entre ellos tenemos la salida, en la Python Consola de QGIS, del comando 'processing.alglist()'; que requiere importar primero el módulo 'processing'.

miércoles, 8 de febrero de 2017

Obtener promedios ponderados por área usando PyQGIS

En la situación que se tiene en la imagen siguiente se desea obtener el promedio ponderado por área del campo 'val', perteneciente al vectorial tipo polígono, cuando se intersecta con el buffer del vectorial tipo línea.

martes, 7 de febrero de 2017

Estadística zonal con inclusión de píxeles recubiertos sólo parcialmente

La estadística zonal se refiere a la determinación de los parámetros estadísticos de un ráster que subyacen a un vectorial. Cuando el tamaño de estos últimos es comparable al tamaño de celda del ráster entonces los efectos de borde del vectorial que tienden a excluir el centroide de las celdas del ráster pueden llegar a ser importantes porque sus values no serán considerados en las estadísticas.

miércoles, 1 de febrero de 2017

Intersecciones con método 'overlay' de GeoPandas

El método 'overlay' de GeoPandas permite realizar intersecciones (y otras operaciones de geoproceso) en la misma capa (auto intersección) o en capas diferentes; aunque en la misma capa puede ser difícil de interpretar. Por tanto, para comenzar, se va a realizar la operación con los shapefiles de la imagen siguiente:

domingo, 29 de enero de 2017

Intersecciones en la misma capa con GeoPandas

Cuando se desea efectuar la intersección entre rasgos de la misma capa es conveniente, primero, usar el método 'combinations' del módulo 'itertools' para excluir las repeticiones. La situación que se va a considerar se encuentra a continuación; donde la capa tiene 50 % de transparencia para facilitar la observación de los solapamientos.

sábado, 28 de enero de 2017

Muestreo ráster con el módulo rasterio (python)

El módulo python 'rasterio' es una librería que simplifica la manipulación con archivos ráster. Aunque en ambientes Windows puede ser difícil tenerla disponible en la Python Console de QGIS, en mi GNU/Linux Debian se instala fácilmente a través de 'easy_install'.

sábado, 21 de enero de 2017

Cómo crear un geodataframe con GeoPandas empleando rasgos aislados

Una de las principales facetas del módulo python 'GeoPandas' es la facilidad con la que se pueden realizar ciertas tareas. Sin embargo, en el manual a veces no aparecen las cosas que se nos ocurren y toca averiguarlas en otra parte. Por ejemplo, con PyQGIS, si queremos visualizar las capas producto de nuestros geoprocesos se puede recurrir a una memory layer. No obstante, esto puede considerarse como un procedimiento algo laborioso que amerita conocer varios métodos de diferentes clases. Con GeoPandas prácticamente se realiza en una sola línea.

Cómo dibujar pentágonos (o cualquier polígono) con PyQGIS

Dibujar pentágonos (o cualquier otro polígono) es un procedimiento sencillo, independientemente de la proyección, empleando el método 'linspace' del módulo 'numpy'. El código siguiente ejemplifica el proceso. Permite dibujar un pentagono alrededor del punto (-3.055975, 47.601177), ubicado al centro-oeste de Francia, con un diámetro de 3 º.

viernes, 20 de enero de 2017

Cómo crear nuevos campos en una geodataframe con GeoPandas y modificar sus valores

GeoPandas es un módulo python que facilita la manipulación de datos espaciales a través de instrucciones muy concisas. En este caso tocará introducir un nuevo campo al vectorial de la imagen siguiente (con un sólo campo en su tabla de atributos) cuando lo carguemos en memoria como geodataframe.

jueves, 19 de enero de 2017

Cómo seleccionar polígonos que contienen al menos un punto con 'sjoin' de GeoPandas

Si se tiene instalado el módulo GeoPandas de Python es muy sencillo realizar este proceso mediante el método 'sjoin' y su parámetro (opción) 'intersects'. Con el ejemplo de la imagen siguiente:

miércoles, 18 de enero de 2017

Union espacial con GeoPandas (método 'sjoin')

Las uniones espaciales en GeoPandas son posibles mediante el método 'sjoin'. Sin embargo, esto requiere además el concurso del módulo Python 'Rtree' (instalado con easy_install) y la librería libspatialindex tomada de los repositorios de mi Debian.

martes, 17 de enero de 2017

Lista por comprensión en python para eliminar elementos repetidos

Eliminar los elementos repetidos en una lista python es posible mediante el siguiente algoritmo; donde se declara inicialmente una lista que se llena a medida que se cumple la condición establecida en el if del bucle que recorre la lista original.

lunes, 16 de enero de 2017

Reproyectar puntos con módulo pyproj

La reproyección con pyproj es muy fácil y directa. En este caso hay que usar el contructor de la clase 'Proj' y el método 'transform' para la reproyección. El constructor admite varias sintaxis pero, en el ejemplo a continuación, se va a utilizar aquella que hace referencia al código EPSG (European Petroleum Survey Group). Otro aspecto importante a mencionar es que si el datum de origen viene expresado en unidades diferentes a metros, es imprescindible emplear el modificador 'preserve_units = True' en el método 'Proj' para evitar resultados erróneos.

domingo, 15 de enero de 2017

Reproyectar un archivo vectorial mediante GeoPandas

Como se ha señalado con anterioridad, GeoPandas es un módulo python que extiende los 'datatypes' usados por 'pandas' para permitir operaciones sobre geometrías; las cuales son realizadas con el módulo 'shapely'. Además, GeoPandas depende adicionalmente de 'fiona' para el acceso a los archivos y 'descartes' y 'matplotlib' para graficar.

sábado, 14 de enero de 2017

Cómo importar y exportar archivos vectoriales con GeoPandas

GeoPandas es un módulo python que extiende los 'datatypes' usados por 'pandas' para permitir operaciones sobre geometrías; las cuales son realizadas con el módulo 'shapely'. Además, GeoPandas depende adicionalmente de 'fiona' para el acceso a los archivos y 'descartes' y 'matplotlib' para graficar.

viernes, 6 de enero de 2017

Cómo escoger rasgos dentro de una cierta distancia de un rasgo seleccionado (vectorial de línea) mediante PyQGIS

Si se quieren determinar todos los ragos (features) que están dentro de 100 m de un rasgo seleccionado (de un vectorial de línea) se puede usar el código siguiente: