¿Crear capa ráster a partir de una matriz numpy usando pyqgis?

9

Estoy trabajando en un complemento para Qgis para calcular mapas de densidad espacial del kernel. Tengo todos los cálculos funcionando, todo lo que me falta es una forma de convertir un Numpy Array, con valores de densidad en una capa ráster multibanda.

¿Tengo que crear un geotiff en un archivo temporal usando Gdal y luego cargarlo?

¿O hay una forma directa de crear la capa a partir de datos en la memoria?

Si es así, ¿cómo hacerlo?

fccoelho
fuente

Respuestas:

5

Aquí está el código que uso para convertir una matriz en ráster gdal guardándolo en el disco, "param" es un diccionario que contiene parámetros gdal (consulte la documentación de gdal) y "array" es una matriz numpy. Luego puede crear una instancia de QgsMapLayer con su archivo como fuente. Tienes que crear el geotiff en el disco.

    from osgeo import gdal as osgdal  # Adapt the import to fit yor environement.

    driver = osgdal.GetDriverByName(param['out_format'])

    dataset = driver.Create(
            param['dst_filename'],
            param['x_pixels'],
            param['y_pixels'],
            1,
            osgdal.GDT_Float32,
            )

    dataset.SetGeoTransform((
            param['xmin'],           #0
            param['pixel_size'],     #1
            0,                       #2
            param['ymin'],           #3
            0,                       #4
            param['pixel_size']))    #5

    out_srs = osr.SpatialReference()
    out_srs.ImportFromEPSG(param['SRID'])

    dataset.SetProjection(out_srs.ExportToWkt())
    dataset.GetRasterBand(1).WriteArray(array.T)  # Remove "T" if it's inverted.
    dataset = None
Pablo
fuente
Gracias, ¿qué es el tamaño de píxel? (xmax-xmin) / x_pixels?
fccoelho
¿Cuáles son los 0 en SetGeoTransform?
fccoelho
Para todas las preguntas, consulte aquí - SetGeoTransform: gdal.org/…
Pablo