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
등 의 하위 클래스로 정의됩니다 . QgsProcessingParameterRasterLayer
올바른 인수를 전달하고 매개 변수 객체를 구성하기 위해 API 항목 (예 :)을 참조 할 수 있습니다 .
- 매개 변수
context
및 feedback
오브젝트 와 함께 processAlgorithm()
런타임시 매개 변수에서 입력 데이터 세트를 얻는 메소드로 전달하십시오 (이 경우 parameterAsRasterLayer()
메소드 등 을 사용하여 QgsRasterLayer 오브젝트 ).
- 계산하십시오.
- 결과를 결과 사전에 추가하고 호출 결과로 반환합니다
processAlgorithm()
.
QGIS3에서 파이썬 알고리즘을 디자인하는 방법에 대한 통찰력을 얻을 수 있기를 바랍니다. 붙어있을 때마다 처리 프레임 워크의 기존 알고리즘이 매개 변수를 처리하는 방법을 보는 것이 항상 도움이됩니다. 당신은 여기 에서 그들을 볼 수 있습니다 .