Qgis 3.0으로 파이썬 처리 스크립트 작성


15

Qgis 3.0으로 업데이트 한 후 Qgis 3.0에서 처리 스크립트 작성에 관한 정보를 찾기가 매우 어려워졌습니다.

@Underdark ( 여기 참조 )는 골격의 기초를 제공했습니다. 이 코드는 템플릿 (Qgis 3.0.2)에서 새 스크립트를 작성할 때 Qgis에 추가 된 것으로 보입니다.

그러나 필자는 저와 같은 파이썬 초보자가 특히 입력 및 출력 레이어의 코드를 변경하는 방법을 이해하는 데 도움이되는 방법을 찾지 못했습니다.

내 목표는 2 개의 래스터 레이어와 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))

5 월 16 일 Qgis python API 설명서가 릴리스되었습니다. 그러나 여기서 어떻게 사용하는지는 여전히 명확하지 않습니다. (파이썬 지식이 부족한 것)


1
당신은 당신이 여기에 사용할 수 QGIS 3.X에 QGIS 2.XX 문서에서 같은 목적으로 사용되는 코드의 샘플을 제공 할 수있다 : docs.qgis.org/testing/en/docs/pyqgis_developer_cookbook/...을 즉시가 될 것 같은 업데이트되었습니다. 문서 문제는 여기에서 추적됩니다 : github.com/qgis/QGIS-Documentation/issues
Nono

코드 예제로 편집 한 답변입니다. 링크 주셔서 감사합니다, 나는 이미 요리 책을 따르고 있었지만 불행히도 나는 거기에서 내 대답을 찾을 수 없었습니다!
Kantan

Qgis API 문서에 대해 읽었지만 @Underdark와는 관련이 없습니다. (링크 편집 참조)
Kantan

답변:


26

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

어떤 단계를 수행합니까?

  1. 필요한 클래스를 모두 가져옵니다.
  2. 에서 상속하는 클래스로 알고리즘을 정의하십시오 QgsProcessingAlgorithm.
  3. 먼저 INPUT_RASTER_A = 'INPUT_RASTER_A'처리 프레임 워크에서 제공 한 매개 변수로 알고리즘을 참조 하려면 입력 및 출력 매개 변수 이름을 알고리즘 클래스 (예 :)의 문자열 변수 (매개 변수 이름)로 선언해야합니다 .
  4. 알고리즘을 처리 도구 상자 GUI에 연결하고 도움말 문자열 등을 제공하는 메소드를 추가하십시오.
  5. 그런 다음 처리 프레임 워크의 매개 변수를 추가하십시오. 이들은 QgsProcessingParameterType알고리즘의 경우 QgsProcessingParameterRasterLayer,, QgsProcessingParameterNumber등 의 하위 클래스로 정의됩니다 . QgsProcessingParameterRasterLayer올바른 인수를 전달하고 매개 변수 객체를 구성하기 위해 API 항목 (예 :)을 참조 할 수 있습니다 .
  6. 매개 변수 contextfeedback오브젝트 와 함께 processAlgorithm()런타임시 매개 변수에서 입력 데이터 세트를 얻는 메소드로 전달하십시오 (이 경우 parameterAsRasterLayer()메소드 등 을 사용하여 QgsRasterLayer 오브젝트 ).
  7. 계산하십시오.
  8. 결과를 결과 사전에 추가하고 호출 결과로 반환합니다 processAlgorithm().

QGIS3에서 파이썬 알고리즘을 디자인하는 방법에 대한 통찰력을 얻을 수 있기를 바랍니다. 붙어있을 때마다 처리 프레임 워크의 기존 알고리즘이 매개 변수를 처리하는 방법을 보는 것이 항상 도움이됩니다. 당신은 여기 에서 그들을 볼 수 있습니다 .



qgis 문서에 추가하면 영광입니다. 이렇게하십시오! qgis3에 더 많은 파이썬 문서를 제공하기위한 전제 조건이 있습니까? 나는 이것이 스크립터와 프로그래머 측면에서 더 넓은 사용자 기반에 필수적이라고 생각합니다.
root676

1
전제 조건이 없습니다. 실제로 GitHub 풀 요청을 통해 공식 파이썬 요리 책에 추가하는 것은 매우 쉽습니다 ( github.com/qgis/QGIS-Documentation/tree/master/source/docs/… ). 공식 문서에 더 많은 예제를 추가하는 것도 환영합니다!
ndawson

1
답변 주셔서 감사합니다! 나는 오늘 바빴다. 그러나 나는 내일 파고 노력할 것이다. 정말 유망 해 보인다.
Kantan

2
세부 사항과 참조에 감사드립니다. gitHub의 스크립트 링크는 실제 금광입니다! 처음에 QVariant 선언에 오류가 발생했지만 편집기에서 다시 입력하고 자동 완성을 사용하면 오류가 사라졌습니다. 이제는 스크립팅에 뛰어 들기 위해 실제로 큰 발걸음을 내딛었습니다. 새로운 프로그래머를 낙담시키지 않기를 바랍니다. 더 많은 문서가 제공 될수록 더 명확 해지기를 바랍니다.
Kantan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.