З переходом від QGIS2.x до QGIS3.x весь фреймворк обробки був перероблений, і велика частина його працює зараз як C ++ класи, з якими можна взаємодіяти за допомогою Python. На жаль, простий синтаксис параметрів для 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
і так далі. Ви можете проконсультувати записи API (тобто QgsProcessingParameterRasterLayer
) для передачі правильних аргументів та побудови об'єктів параметрів.
- Передайте параметри поряд
context
і feedback
об'єкти processAlgorithm()
методу, де ви отримуєте набори вхідних наборів даних з параметрів під час виконання (у цьому випадку об'єкти QgsRasterLayer, використовуючи parameterAsRasterLayer()
метод тощо).
- Зробіть свої обчислення.
- Додайте вихідні дані до словника результатів та поверніть їх у результаті виклику
processAlgorithm()
.
Я сподіваюся, що я міг би дати вам деяку інформацію про те, як розробити алгоритми python у QGIS3. Щоразу, коли ви застрягли, завжди корисно подивитися, як існуючі алгоритми рамки обробки обробляють параметри. Ви можете подивитися на них тут .