Crear un plugin para muestrear valores ráster con un vectorial de puntos (GDAL/OGR, PyQGIS)

Basado en esta respuesta a una pregunta donde se pretendía obtener los valores de los píxeles de un ráster bajo un vectorial de puntos, utilizando la librería de GDAL/OGR en Python, primero modifiqué ligeramente el código para que se pudiese ejecutar desde la Python Console de QGIS imprimiendo los valores como una lista. El código resultante fue el siguiente:

from osgeo import gdal,ogr

raster_filename = '/home/zeito/pyqgis_data/utah_demUTM2.tif'
shp_filename = '/home/zeito/pyqgis_data/points2.shp'

src_ds = gdal.Open(raster_filename) 
gt = src_ds.GetGeoTransform()
rb = src_ds.GetRasterBand(1)

ds = ogr.Open(shp_filename)
lyr = ds.GetLayer()

values = []

for feat in lyr:
    geom = feat.GetGeometryRef()
    mx,my=geom.GetX(), geom.GetY()  #coord in map units

    #Convert from map to pixel coordinates.
    #Only works for geotransforms with no rotation.
    px = int((mx - gt[0]) / gt[1]) #x pixel
    py = int((my - gt[3]) / gt[5]) #y pixel

    tmp = rb.ReadAsArray(px,py,1,1)
    values.append(tmp[0][0]) #tmp is a numpy array, length=1 as we only asked for 1 pixel value

print values    

La ejecución en la Python Console de QGIS produjo este resultado:

[1366, 1689, 2152, 1636, 1865, 1379, 1371, 1507, 1552, 
1370, 1541, 1919, 1411, 1989, 2474, 2020, 2527, 1368, 
1477, 1391, 1774, 2451, 2336, 1612, 2257]

para el ráster y el shapefile de la imagen siguiente:

get_value_raster3

Aunque pudiese parecer lo contrario, la conversión del código anterior en un plugin para ejecución automática en QGIS (observe que el código anterior no es general porque sólo indica la ruta particular a los archivos ráster y vectorial respectivos) es mucho más sencillo de lo que parece. Esto es así porque el ‘Plugin Builder’ crea la plantilla base para nuestro plugin donde podemos incluir rápidamente dos QgsMapLayerComboBox, con sus filtros respectivos, para las capas ráster y vectorial. Esto nos evita preocuparnos por la capa activa o cómo están las capas ordenadas en el registro facilitando la apertura individual de cada archivo a través del método ‘dataProvider’ común a cada tipo de capa.

Una vez tenido el acceso a cada dataset individual, la implementación del algoritmo para la obtención de los values sigue el procedimiento delineado en el código anterior. Una QMessageBox nos puede ayudar a verificar que los valores de la lista se imprimen de la manera adecuada. Finalmente, sólo resta introducir los valores de la lista en la tabla atributiva del vectorial y eso se logra también a través de los métodos del provider.

En la imagen siguiente se observa como el plugin ya lanzado “captura” automáticamente cada tipo específico de capa. Además, también se detalla la tabla atributiva del vectorial que va a recibir los valores a muestrear.

get_raster_value1

Cuando se hace click en el botón OK del plugin, éste se cierra y aparece casi de inmediato la actualización de la tabla atributiva con los valores deseados; tal como se presenta a continuación en la imagen:

get_raster_value2

Nota: Hay que señalar que resolver este problema mezclando los métodos de GDAL/OGR con los de PyQGIS fue sólo un reto intelectual. Es mucho más sencillo empleando sólo métodos de PyQGIS.

En nuestro curso de PyQGIS, abordaremos con detalle la creación de éste plugin mediante el ‘Plugin Builder’.

PRÓXIMA SESIÓN EL 20 DE OCTUBRE

Esta entrada fue publicada en PyQGIS, QGIS, SIG, Software Libre. Guarda el enlace permanente.

3 respuestas a Crear un plugin para muestrear valores ráster con un vectorial de puntos (GDAL/OGR, PyQGIS)

  1. Pingback: Interpolación IDW (ponderada por el inverso de la distancia) en PyQGIS | El Blog de José Guerrero

  2. Pingback: Newsletter Octubre 2015 | El Blog de José Guerrero

  3. Pingback: Extraer valores de un ráster bajo una línea (GDAL/OGR/PyQGIS) | El Blog de José Guerrero

Responder

Por favor, inicia sesión con uno de estos métodos para publicar tu comentario:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s