Memanggil plugin interpolasi dari konsol Python QGIS

13

Saya ingin memanggil fungsi plugin interpolasi QGIS (metode TIN) (Raster-> Interpolate) dari konsol python.

Saya tidak dapat menemukan fungsi yang sesuai dalam QGIS API atau dalam daftar algoritma pemrosesan. Saya menemukan algoritma Trigaulasi SAGA, yang berfungsi dengan baik tetapi 5-10 x lebih lambat dan kecepatan penting dalam kasus saya.

Adakah cara untuk menjalankannya?

Vincent D.
sumber
2
Meskipun saya tidak memerlukan ini, itu akan menjadi hal yang berguna untuk diketahui. Saya mengikuti tautan ini: ( gis.stackexchange.com/questions/11216/… ). Saya sampai sejauh from rasterinterpolation import rasterinterpolationtetapi tidak yakin modul mana yang harus dipanggil (atau bagaimana cara memanggil).
Joseph
Bisakah Anda sedikit memperjelas persyaratan Anda? Apakah Anda hanya mencari cara untuk menghitung lapisan raster interpolasi baru dari lapisan raster input?
underdark
Saya memiliki masalah yang sama: Saya ingin membuat model countour yang dimulai dengan interpolasi Raster diikuti oleh kontur Saga \ dari grid. Pertanyaannya adalah - bagaimana cara menambahkan rasterinrepolator di jendela "processing modeler"?
H.Wiener

Jawaban:

4

Saya dapat memberikan solusi lengkap dalam pertanyaan berikut:

Bagaimana cara menghitung raster interpolasi dari konsol python di QGIS?

Saya akan memposting ulang jawabannya di sini juga, karena besarnya minat yang tampaknya menarik:

Menjawab:

Dokumentasi di pyqgis sangat tidak cukup jelas, tapi saya tahu bagaimana benar memanggil kelas interpolasi terkait ( QgsInterpolator, QgsTINInterpolator, QgsIDWInterpolator, QgsGridFileWriter) dari python. Saya akan menjelaskan setiap langkah naskah dengan sangat rinci:

Langkah 1:

Impor inti dan modul analisis dan dapatkan layer vektor yang diinginkan untuk interpolasi dengan memilihnya dengan mouseclick pada tab layer.

import qgis.core
import qgis.analysis

layer = qgis.utils.iface.activeLayer()

Langkah 2:

Siapkan kelas interpolasi dengan Parameter yang diperlukan. Parameter tepat untuk inisialisasi struct LayerData dapat ditemukan di dokumen QGIS API (searchterm: QgsInterpolator).

layer_data = QgsInterpolator.LayerData()
layer_data.vectorLayer = layer
layer_data.zCoordInterpolation=False
layer_data.InterpolationAttribute =0
layer_data.mInputType = 1

Harap perhatikan bahwa saya tidak menggunakan Koordinat z, saya mendapatkan bidang pertama yang tersedia (indeks = 0) sebagai atribut interpolasi, dan menggunakan POIN sebagai tipe input.

Langkah 3:

Pilih mesin interpolasi Anda. Di sini Anda dapat memilih antara metode TIN-Interpolasi ( QgsTINInterpolator) dan IDW-Interpolasi ( QgsIDWInterpolator). Saya mengambil QgsTINInterpolatorkode saya.

tin_interpolator = QgsTINInterpolator([layer_data])

Ingatlah bahwa Anda harus memberikan daftar python layer_datake mesin interpolasi! Ini juga memungkinkan Anda untuk menambahkan beberapa skenario layer_data.

Langkah 4:

Setup parameter yang diperlukan untuk ekspor interpolasi-output (lihat dokumentasi QgsGridFileWriter). Itu termasuk informasi yang mirip dengan gui interpolasi (filepath, luas, resolusi, jumlah kolom dan baris).

export_path ="C:/SomeFolder/output.asc"
rect = layer.extent()
res = 10
ncol = int( ( rect.xMaximum() - rect.xMinimum() ) / res )
nrows = int( (rect.yMaximum() - rect.yMinimum() ) / res)

output = QgsGridFileWriter(tin_interpolator,export_path,rect,ncol, nrows,res,res)
output.writeFile(True)  

iface.addRasterLayer(export_path, "interpolation_output") 

Waspadai ekstensi file output-raster Anda karena QgsGridFileWriterhanya menulis ASCII-grids ( .asc). Data ditulis ke disk dengan memanggil writeFile()metode. Setelah ekspor Anda dapat menambahkan file grid sebagai raster ke kanvas.

Skrip lengkap untuk referensi:

import qgis.analysis
import qgis.core

layer = qgis.utils.iface.activeLayer() 
layer_data = QgsInterpolator.LayerData()
layer_data.vectorLayer = layer
layer_data.zCoordInterpolation=False
layer_data.InterpolationAttribute =0
layer_data.mInputType = 1


tin_interpolator = QgsTINInterpolator([layer_data])

export_path = "E:/GIS_Workbench/script_output/test.asc"

rect = layer.extent()
res = 10
ncol = int( ( rect.xMaximum() - rect.xMinimum() ) / res )
nrows = int( (rect.yMaximum() - rect.yMinimum() ) / res)
output = QgsGridFileWriter(tin_interpolator,export_path,rect,ncol,nrows,res,res)
output.writeFile(True)

Perlu diingat bahwa QGIS-API saat ini ditulis ulang ke versi 3.0 dan kelas interpolasi yang digunakan dipindahkan dari qgis.analysiske qgis.core! Ini akan memiliki dampak besar pada fungsionalitas skrip ini sehingga harus ditulis ulang untuk versi 3.0!

root676
sumber
1
Saya mencoba kode contoh Anda, tetapi hanya bekerja dengan layer_data.InterpolationAttribute = 0, saya mencoba dengan indeks bidang lain, tetapi dan hanya mendapatkan 0.
Leonard
Itu benar - saya mengalami masalah ini juga, tetapi saya tidak punya cukup waktu untuk menyelidiki penyebabnya. Solusi saya adalah memberi makan script layer yang baru saja bidang yang diinginkan. Anda dapat mencoba dokumentasi QGIS API untuk solusi yang ditingkatkan.
root676
3

Anda dapat melakukan ini jika plugin Raster Interpolasi diinstal menggunakan Plugin Manager.

from rasterinterpolation.core.rasterinterpolator import RasterInterpolator
rastLayer = iface.activeLayer()
interpolator = RasterInterpolator(rastLayer,0,1)
a= interpolator.linear(QgsPoint(10.662629, 76.225421))
print a

Catatan: saya tidak benar-benar tahu apa yang dilakukan kode di atas selain fakta bahwa ia mencetak nilai. Tapi itu mungkin akan membantu Anda untuk memahami penggunaannya.

Vinayan
sumber