QGIS2.xからQGIS3.xへの移行により、処理フレームワーク全体が作り直され、Pythonを使用して対話できるC ++クラスとして大部分が実行されるようになりました。残念ながら、データ/データセットIOの単純なパラメーター構文は無効になりました。新しいパラメーター構造は、ツールボックスにプリインストールされている組み込みの(Python-)処理アルゴリズムの後にはるかに指向されています。
私が見るように、あなたはすでに@underdarkによる新しいアルゴリズム構造の説明に従っています。ただし、要件(ラスターレイヤー、ダブル入力など)に合わせてこの構造を調整するには、スクリプトの複数の場所でコードを変更する必要があります。簡単な説明で大まかな例をコーディングしました(@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
どのステップが実行されますか?
- 必要なすべてのクラスをインポートします。
- 継承クラスとしてのアルゴリズムを定義します
QgsProcessingAlgorithm
。
- まず
INPUT_RASTER_A = 'INPUT_RASTER_A'
、処理フレームワークによって提供されるパラメーターでアルゴリズムを参照するために、アルゴリズムクラスの文字列変数(パラメーター名)として入力および出力パラメーターの名前を宣言する必要があります。
- アルゴリズムを処理ツールボックスguiに接続するメソッドを追加し、ヘルプストリングなどを提供します。
- 次に、処理フレームワークのパラメーターを追加します。これらは
QgsProcessingParameterType
-の子クラスとして定義されます-アルゴリズムの場合:QgsProcessingParameterRasterLayer
、QgsProcessingParameterNumber
など。QgsProcessingParameterRasterLayer
適切な引数を渡し、パラメータオブジェクトを構築するために、APIエントリ(たとえば、)を参照できます。
- パラメータと一緒に渡す
context
とfeedback
にオブジェクトをprocessAlgorithm()
使用すると、(この場合QgsRasterLayerを使用してオブジェクト実行時のパラメータから入力データセットを取得する方法parameterAsRasterLayer()
など、方法を)。
- 計算を行います。
- 出力を結果ディクショナリに追加し、呼び出しの結果として返します
processAlgorithm()
。
QGIS3でPythonアルゴリズムを設計する方法について、いくつかの洞察が得られることを願っています。立ち往生しているときはいつでも、処理フレームワークの既存のアルゴリズムがどのようにパラメーターを処理するかを調べることは常に役立ちます。ここでそれらを見ることができます。