Erstellen einer Rasterebene aus einem Numpy-Array mit pyqgis?


9

Ich arbeite an einem Plugin für Qgis, um räumliche Kernel-Dichtekarten zu berechnen. Ich habe alle Berechnungen, alles was mir fehlt ist eine Möglichkeit, ein Numpy Array mit Dichtewerten in eine Multiband-Rasterebene umzuwandeln.

Muss ich mit Gdal einen Geotiff für eine temporäre Datei erstellen und dann laden?

Oder gibt es eine direkte Möglichkeit, die Ebene aus Daten im Speicher zu erstellen?

Wenn ja, wie geht das?

Antworten:


5

Hier ist der Code, mit dem ich ein Array in ein gdal-Raster konvertiere und es auf der Festplatte speichere. "Param" ist ein Wörterbuch mit gdal-Parametern (siehe gdal-Dokumentation) und "array" ist ein numpy-Array. Dann können Sie einen QgsMapLayer mit Ihrer Datei als Quelle instanziieren . Sie müssen den Geotiff auf der Festplatte erstellen.

    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

Danke, was ist die Pixelgröße? (xmax-xmin) / x_pixel?
Fccoelho

Was sind die Nullen in der SetGeoTransform?
Fccoelho

Für alle Fragen überprüfen Sie hier - SetGeoTransform: gdal.org/…
Pablo
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.