После обновления до Qgis 3.0 стало очень трудно найти какую-либо информацию, касающуюся написания сценариев обработки в Qgis 3.0.
@Underdark (см. Здесь ) послужил основой для скелета. Этот код также, кажется, был добавлен в Qgis при написании нового скрипта из шаблона (Qgis 3.0.2).
Однако я не мог найти способ помочь новичкам в Python, таким как я, понять, как изменить этот код, особенно для входного и выходного слоев.
Моя цель состоит в том, чтобы написать скрипт, принимающий 2 растровых слоя и двойной в качестве входных данных, выводящий два слоя.
Какие изменения потребуются в коде примера, чтобы это сделать?
Для Qgis 2.x я бы использовал следующий синтаксис:
##Layer1=raster
##Layer2=raster
##myDouble=Double
##OutLayer1=output raster
##OutLayer2=output raster
Из того, что я понимаю, изменения должны быть сделаны в следующей процедуре, но я не уверен, что поставить на место.
def initAlgorithm(self, config=None):
self.addParameter(QgsProcessingParameterFeatureSource(
self.INPUT,
self.tr("Input layer"),
[QgsProcessing.TypeVectorAnyGeometry]))
self.addParameter(QgsProcessingParameterFeatureSink(
self.OUTPUT,
self.tr("Output layer"),
QgsProcessing.TypeVectorAnyGeometry))
16 мая была выпущена документация по API Qgis python . Однако мне все еще неясно, как использовать это здесь. (Что вполне может быть недостаток знаний Python)
Ответы:
С переходом с QGIS2.x на QGIS3.x вся инфраструктура обработки была переработана, и большая ее часть теперь работает как классы C ++, с которыми вы можете взаимодействовать с помощью Python. К сожалению, простой синтаксис параметров для ввода-вывода данных / набора данных больше не действителен. Новая структура параметров гораздо более ориентирована после встроенных (Python-) алгоритмов обработки, которые вы найдете предварительно установленными в наборе инструментов.
Как я вижу, вы уже следовали описанию новой структуры алгоритма @underdark. Но чтобы настроить эту структуру в соответствии с вашими требованиями (растровые слои, двойной ввод и т. Д.), Вам необходимо изменить код в нескольких местах в сценарии. Я написал грубый пример с кратким объяснением для вас (просто скелет алгоритма, основанный на примере @underdarks):
Какие шаги сделаны?
QgsProcessingAlgorithm
.INPUT_RASTER_A = 'INPUT_RASTER_A'
), Чтобы связать ваш алгоритм с параметрами, предоставленными платформой обработки.QgsProcessingParameterType
- в случае вашего алгоритма:QgsProcessingParameterRasterLayer
,QgsProcessingParameterNumber
и так далее. Вы можете обратиться к записям API (т. Е.QgsProcessingParameterRasterLayer
), Чтобы передать правильные аргументы и построить объекты параметров.context
иfeedback
объекты кprocessAlgorithm()
способу , где вы получение входных наборов данных из параметров во время выполнения (в данном случае QgsRasterLayer объектов, используяparameterAsRasterLayer()
метод и т.д.).processAlgorithm()
.Я надеюсь, что смогу дать вам некоторое представление о том, как разрабатывать ваши алгоритмы Python в QGIS3. Всякий раз, когда вы застряли, всегда полезно посмотреть, как существующие алгоритмы инфраструктуры обработки обрабатывают параметры. Вы можете посмотреть их здесь .
источник