Membuat layer raster dari array numpy menggunakan pyqgis?


9

Saya sedang mengerjakan plugin untuk Qgis untuk menghitung peta kerapatan kernel spasial. Saya memiliki semua perhitungan yang berfungsi, semua yang saya lewatkan adalah cara untuk mengubah Numpy Array, dengan nilai kepadatan menjadi lapisan raster multiband.

Apakah saya harus membuat geotiff pada file temp menggunakan Gdal dan kemudian memuatnya?

Atau adakah cara langsung untuk membuat layer dari data dalam memori?

jika demikian, bagaimana cara melakukannya?

Jawaban:


5

Berikut adalah kode yang saya gunakan untuk mengonversi array ke gdal raster, menyimpannya ke disk, "param" adalah kamus yang berisi parameter gdal (periksa dokumentasi gdal) dan "array" adalah array yang numpy. Daripada Anda dapat instantiate QgsMapLayer dengan file Anda sebagai sumber. Anda harus membuat geotiff di disk.

    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

Terima kasih, apa itu ukuran piksel? (xmax-xmin) / x_pixels?
fccoelho

apa saja 0s dalam SetGeoTransform?
fccoelho

Untuk semua pertanyaan, periksa di sini - SetGeoTransform: gdal.org/…
Pablo
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.