ด้วยการเปลี่ยนจาก QGIS2.x เป็น QGIS3.x เฟรมเวิร์กการประมวลผลทั้งหมดได้รับการทำใหม่และส่วนใหญ่ของมันจะทำงานในขณะนี้เป็นคลาส C ++ ที่คุณสามารถโต้ตอบกับการใช้ Python น่าเสียดายที่ไวยากรณ์พารามิเตอร์อย่างง่ายสำหรับ data / dataset 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'
) เพื่ออ้างอิงอัลกอริทึมของคุณด้วยพารามิเตอร์ที่กำหนดโดยเฟรมเวิร์กการประมวลผล
- เพิ่มวิธีการที่เชื่อมโยงอัลกอริทึมของคุณไปยังกล่องเครื่องมือประมวลผลและให้ความช่วยเหลือ ฯลฯ
- จากนั้นคุณเพิ่มพารามิเตอร์ของเฟรมเวิร์กการประมวลผล เหล่านั้นจะถูกกำหนดให้เป็นชั้นเรียนเด็ก
QgsProcessingParameterType
- ในกรณีของอัลกอริทึมของคุณ: QgsProcessingParameterRasterLayer
, QgsProcessingParameterNumber
และอื่น ๆ คุณสามารถศึกษารายการ API (เช่น. QgsProcessingParameterRasterLayer
) เพื่อส่งผ่านอาร์กิวเมนต์ที่ถูกต้องและสร้างวัตถุพารามิเตอร์
- ส่งพารามิเตอร์ข้าง
context
และfeedback
วัตถุไปยังprocessAlgorithm()
วิธีการที่คุณได้รับชุดข้อมูลอินพุตจากพารามิเตอร์ที่ runtime (ในกรณีนี้วัตถุ QgsRasterLayer โดยใช้parameterAsRasterLayer()
วิธีการ ฯลฯ )
- ทำการคำนวณของคุณ
processAlgorithm()
เพิ่มผลผลิตผลการพจนานุกรมและพวกเขากลับเป็นผลของการโทร
ฉันหวังว่าฉันจะให้ข้อมูลเชิงลึกเกี่ยวกับวิธีออกแบบ python algorithm ของคุณใน QGIS3 เมื่อใดก็ตามที่คุณติดอยู่จะเป็นประโยชน์เสมอที่จะดูว่าอัลกอริทึมที่มีอยู่ของเฟรมเวิร์กการประมวลผลจัดการกับพารามิเตอร์อย่างไร คุณสามารถดูได้ที่พวกเขาที่นี่