Với việc chuyển đổi từ QGIS2.x sang QGIS3.x, toàn bộ khung xử lý đã được làm lại và phần lớn của nó chạy như các lớp C ++ mà bạn có thể tương tác bằng Python. Thật không may, cú pháp tham số đơn giản cho dữ liệu / dữ liệu IO không còn hợp lệ. Cấu trúc tham số mới được định hướng nhiều hơn sau các thuật toán xử lý dựng sẵn (Python-) mà bạn tìm thấy được cài đặt sẵn trong hộp công cụ.
Như tôi thấy, bạn đã làm theo mô tả về cấu trúc thuật toán mới của @underdark. Nhưng để điều chỉnh cấu trúc này cho các yêu cầu của bạn (các lớp raster, đầu vào kép, v.v.), bạn phải thay đổi mã tại nhiều vị trí trong tập lệnh. Tôi đã mã hóa một ví dụ sơ bộ với một lời giải thích ngắn cho bạn (chỉ là một bộ xương thuật toán dựa trên ví dụ @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
Những bước nào được thực hiện?
- Nhập tất cả các lớp cần thiết.
- Xác định thuật toán là một lớp kế thừa từ
QgsProcessingAlgorithm
.
- Trước tiên, bạn phải khai báo tên của các tham số đầu vào và đầu ra dưới dạng các biến chuỗi (tên tham số) của lớp thuật toán (ví dụ.
INPUT_RASTER_A = 'INPUT_RASTER_A'
) Để tham chiếu thuật toán của bạn với các tham số được cung cấp bởi khung xử lý.
- Thêm các phương thức kết nối thuật toán của bạn với gui của hộp công cụ xử lý và cung cấp trợ giúp, v.v.
- Sau đó, bạn thêm các tham số của khung xử lý. Chúng được định nghĩa là các lớp con của
QgsProcessingParameterType
- trong trường hợp thuật toán của bạn : QgsProcessingParameterRasterLayer
, QgsProcessingParameterNumber
v.v. Bạn có thể tham khảo các mục API (ví dụ. QgsProcessingParameterRasterLayer
) Để truyền đúng đối số và xây dựng các đối tượng tham số.
- Vượt qua các thông số bên cạnh
context
và feedback
đối tượng để các processAlgorithm()
phương pháp mà bạn có được bộ dữ liệu đầu vào từ các thông số khi chạy (trong trường hợp này QgsRasterLayer đối tượng bằng cách sử dụng các parameterAsRasterLayer()
phương pháp, vv).
- Làm tính toán của bạn.
- Thêm các kết quả đầu ra vào từ điển kết quả và trả về chúng như là kết quả của cuộc gọi
processAlgorithm()
.
Tôi hy vọng tôi có thể cung cấp cho bạn một số hiểu biết về cách thiết kế các thuật toán python của bạn trong QGIS3. Bất cứ khi nào bạn bị mắc kẹt, luôn luôn hữu ích để xem xét các thuật toán hiện có của khung xử lý xử lý các tham số. Bạn có thể có một cái nhìn tại đây .