Dengan transisi dari QGIS2.x ke QGIS3.x seluruh kerangka kerja pemrosesan telah dikerjakan ulang dan sebagian besar dijalankan sekarang sebagai kelas C ++ yang dapat Anda berinteraksi dengan menggunakan Python. Sayangnya sintaks parameter sederhana untuk data / dataset IO tidak lagi valid. Struktur parameter baru jauh lebih berorientasi setelah algoritma Pemrosesan bawaan (Python-) yang Anda temukan sudah diinstal sebelumnya di kotak peralatan.
Seperti yang saya lihat, Anda sudah mengikuti deskripsi struktur algoritma baru oleh @underdark. Tetapi untuk menyesuaikan struktur ini untuk kebutuhan Anda (layer raster, input ganda, dll.) Anda harus mengubah kode di beberapa lokasi dalam skrip. Saya telah memberi kode contoh kasar dengan penjelasan singkat untuk Anda (hanya kerangka algoritma berdasarkan contoh @underdarks):
from qgis.PyQt.QtCore import QCoreApplication, QVariant
from qgis.core import (QgsProcessing, QgsProcessingAlgorithm,
QgsProcessingParameterRasterLayer,QgsProcessingParameterNumber,
QgsProcessingParameterRasterDestination)
class RasterAlg(QgsProcessingAlgorithm):
INPUT_RASTER_A = 'INPUT_RASTER_A'
INPUT_RASTER_B = 'INPUT_RASTER_B'
INPUT_DOUBLE = 'INPUT_DOUBLE'
OUTPUT_RASTER_A = 'OUTPUT_RASTER_A'
OUTPUT_RASTER_B = 'OUTPUT_RASTER_B'
def __init__(self):
super().__init__()
def name(self):
return "RasterAlg"
def tr(self, text):
return QCoreApplication.translate("RasterAlg", text)
def displayName(self):
return self.tr("RasterAlg script")
def group(self):
return self.tr("RasterAlgs")
def groupId(self):
return "RasterAlgs"
def shortHelpString(self):
return self.tr("RasterAlg script without logic")
def helpUrl(self):
return "https://qgis.org"
def createInstance(self):
return type(self)()
def initAlgorithm(self, config=None):
self.addParameter(QgsProcessingParameterRasterLayer(
self.INPUT_RASTER_A,
self.tr("Input Raster A"), None, False))
self.addParameter(QgsProcessingParameterRasterLayer(
self.INPUT_RASTER_B,
self.tr("Input Raster B"), None, False))
self.addParameter(QgsProcessingParameterNumber(
self.INPUT_DOUBLE,
self.tr("Input Double"),
QgsProcessingParameterNumber.Double,
QVariant(1.0)))
self.addParameter(QgsProcessingParameterRasterDestination(
self.OUTPUT_RASTER_A,
self.tr("Output Raster A"),
None, False))
self.addParameter(QgsProcessingParameterRasterDestination(
self.OUTPUT_RASTER_B,
self.tr("Output Raster B"),
None, False))
def processAlgorithm(self, parameters, context, feedback):
raster_a = self.parameterAsRasterLayer(parameters, self.INPUT_RASTER_A, context)
raster_b = self.parameterAsRasterLayer(parameters, self.INPUT_RASTER_B, context)
double_val = self.parameterAsDouble(parameters, self.INPUT_DOUBLE,context)
output_path_raster_a = self.parameterAsOutputLayer(parameters, self.OUTPUT_RASTER_A, context)
output_path_raster_b = self.parameterAsOutputLayer(parameters, self.OUTPUT_RASTER_B, context)
#DO SOME CALCULATION
results = {}
results[self.OUTPUT_RASTER_A] = output_path_raster_a
results[self.OUTPUT_RASTER_B] = output_path_raster_b
return results
Langkah mana yang dilakukan?
- Impor semua kelas yang diperlukan.
- Tetapkan algoritma sebagai kelas yang diwarisi dari
QgsProcessingAlgorithm
.
- Pertama, Anda harus mendeklarasikan nama parameter input dan output sebagai variabel string (nama parameter) dari kelas algoritma (mis.
INPUT_RASTER_A = 'INPUT_RASTER_A'
) Untuk referensi algoritma Anda dengan parameter yang disediakan oleh kerangka kerja pemrosesan.
- Tambahkan metode yang menyambungkan algoritma Anda ke gui toolbox pemrosesan dan berikan bantuan, dll.
- Kemudian Anda menambahkan parameter kerangka kerja pemrosesan. Mereka didefinisikan sebagai kelas anak
QgsProcessingParameterType
- dalam kasus algoritma Anda: QgsProcessingParameterRasterLayer
, QgsProcessingParameterNumber
, dan sebagainya. Anda dapat berkonsultasi entri API (mis. QgsProcessingParameterRasterLayer
) Untuk memberikan argumen yang benar dan membangun objek parameter.
- Lewati parameter di samping
context
dan feedback
objek ke processAlgorithm()
metode di mana Anda mendapatkan dataset input dari parameter saat runtime (dalam hal ini objek QgsRasterLayer dengan menggunakan parameterAsRasterLayer()
metode, dll.).
- Lakukan perhitungan Anda.
- Tambahkan output ke kamus hasil dan kembalikan sebagai hasil panggilan
processAlgorithm()
.
Saya harap saya bisa memberi Anda beberapa wawasan tentang bagaimana merancang algoritma python Anda di QGIS3. Setiap kali Anda macet, selalu membantu untuk melihat bagaimana algoritma yang ada dari kerangka kerja menangani parameter. Anda dapat melihatnya di sini .