¿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?

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

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.