QGIS2.x'ten QGIS3.x'e geçiş ile tüm işleme çerçevesi yeniden işlendi ve büyük bölümleri şimdi Python kullanarak etkileşime girebileceğiniz C ++ sınıfları olarak çalışıyor. Maalesef veri / veri kümesi ES'si için basit parametre sözdizimi artık geçerli değil. Yeni parametre yapısı, araç kutusuna önceden kurulmuş olarak bulduğunuz yerleşik (Python-) İşleme algoritmalarından sonra çok daha yönlendirilir.
Gördüğüm gibi, zaten yeni algoritma yapısının açıklamasını @underdark izlediniz. Ancak bu yapıyı gereksinimlerinize göre ayarlamak için (raster katmanları, çift giriş, vb.) Koddaki birden çok konumdaki kodu değiştirmeniz gerekir. Sizin için kısa bir açıklama ile kaba bir örnek kodladım (sadece @underdarks örneğine dayanan bir algoritma iskeleti):
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
Hangi adımlar yapılıyor?
- Gerekli tüm sınıfları içe aktarın.
- Algoritmayı bir miras olarak sınıf olarak tanımlayın
QgsProcessingAlgorithm
.
- Öncelikle, algoritmanıza
INPUT_RASTER_A = 'INPUT_RASTER_A'
işlem çerçevesi tarafından sağlanan parametrelerle referans vermek için giriş ve çıkış parametrelerinin adlarını algoritma sınıfının (parametre adları) dize değişkenleri (parametre adları) olarak bildirmeniz gerekir.
- Algoritmanızı işleme araç kutusu gui'sine bağlayan ve yardım dizeleri vb. Sağlayan yöntemleri ekleyin.
- Sonra işleme çerçevesinin parametrelerini ekleyin. Bunlar çocuk sınıfları olarak tanımlanmıştır
QgsProcessingParameterType
- senin algoritmanın durumunda: QgsProcessingParameterRasterLayer
, QgsProcessingParameterNumber
, vb. QgsProcessingParameterRasterLayer
Doğru argümanları iletmek ve parametre nesnelerini oluşturmak için API girişlerine (örn. ) Başvurabilirsiniz.
- Parametreleri
context
ve feedback
nesneleri processAlgorithm()
, çalışma zamanında parametrelerden giriş veri kümelerini aldığınız parameterAsRasterLayer()
yönteme iletin (bu durumda, yöntemi kullanarak QgsRasterLayer nesneleri ).
- Hesaplamanızı yapın.
- Çıktıları sonuç sözlüğüne ekleyin ve çağrı sonucunda döndürün
processAlgorithm()
.
Umarım QGIS3'te python algoritmalarınızı nasıl tasarlayacağınıza dair bazı bilgiler verebilirim. Sıkıştığınız zaman, işleme çerçevesinin mevcut algoritmalarının parametreleri nasıl işlediğine bakmak her zaman yararlıdır. Onlara buradan bakabilirsiniz .