С переходом с QGIS2.x на QGIS3.x вся инфраструктура обработки была переработана, и большая ее часть теперь работает как классы C ++, с которыми вы можете взаимодействовать с помощью Python. К сожалению, простой синтаксис параметров для ввода-вывода данных / набора данных больше не действителен. Новая структура параметров гораздо более ориентирована после встроенных (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'
), Чтобы связать ваш алгоритм с параметрами, предоставленными платформой обработки.
- Добавьте методы, которые связывают ваш алгоритм с графическим интерфейсом панели инструментов обработки, предоставляя строки помощи и т. Д.
- Затем вы добавляете параметры структуры обработки. Они определяются как дочерние классы
QgsProcessingParameterType
- в случае вашего алгоритма: QgsProcessingParameterRasterLayer
, QgsProcessingParameterNumber
и так далее. Вы можете обратиться к записям API (т. Е. QgsProcessingParameterRasterLayer
), Чтобы передать правильные аргументы и построить объекты параметров.
- Пропускают параметры наряду
context
и feedback
объекты к processAlgorithm()
способу , где вы получение входных наборов данных из параметров во время выполнения (в данном случае QgsRasterLayer объектов, используя parameterAsRasterLayer()
метод и т.д.).
- Сделай свой расчет.
- Добавьте выходные данные в словарь результатов и верните их как результат вызова
processAlgorithm()
.
Я надеюсь, что смогу дать вам некоторое представление о том, как разрабатывать ваши алгоритмы Python в QGIS3. Всякий раз, когда вы застряли, всегда полезно посмотреть, как существующие алгоритмы инфраструктуры обработки обрабатывают параметры. Вы можете посмотреть их здесь .