क्यूजीआईएस 3.0 के साथ एक अजगर प्रसंस्करण स्क्रिप्ट लिखना


17

QGIS 3.0 के अपडेट के बाद, QGIS 3.0 में प्रोसेसिंग स्क्रिप्ट लिखने से संबंधित कोई भी जानकारी प्राप्त करना बहुत मुश्किल हो गया है।

@Underdark ( यहां देखें ) ने कंकाल के लिए एक आधार प्रदान किया है। यह कोड QGIS में भी जोड़ा गया है, जब टेम्पलेट से एक नई स्क्रिप्ट लिख रहा है (QGIS 3.0.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))

16 मई को, क्यूजीआईएस पायथन एपीआई प्रलेखन जारी किया गया था। हालाँकि यह अभी भी मेरे लिए स्पष्ट नहीं है कि इसका उपयोग कैसे किया जाए। (जो बहुत अच्छी तरह से पायथन ज्ञान की कमी हो सकती है)


1
क्या आप qgis पर एक ही उद्देश्य के लिए उपयोग किए गए कोड का नमूना प्रदान कर सकते हैं। 2.xx qgis 3.x पर प्रलेखन यहाँ उपलब्ध होगा: docs.qgis.org/testing/en/docs/pyqgis_developer-cookbook/… जैसे ही यह होगा अपडेट किया गया। : डॉक्टर मुद्दों यहां नज़र रखी जाती है github.com/qgis/QGIS-Documentation/issues
Nono

कोड उदाहरण के साथ संपादित उत्तर। लिंक के लिए धन्यवाद, मैं पहले से ही रसोई की किताब का पालन कर रहा था, लेकिन दुर्भाग्य से मुझे अपना जवाब नहीं मिला!
कांतन

मैं Qgis API डॉक्स के बारे में पढ़ता हूं, लेकिन मैं उस और @Underdark के कोड के बीच संबंध नहीं रख सकता। (लिंक के लिए संपादित देखें)
कांतन

जवाबों:


29

QGIS2.x से QGIS3.x के संक्रमण के साथ, पूरे प्रसंस्करण ढांचे को फिर से काम किया गया है और इसके बड़े हिस्से अब C ++ कक्षाओं के रूप में चलते हैं जिन्हें आप पायथन का उपयोग करके बातचीत कर सकते हैं। दुर्भाग्य से डेटा / डेटासेट IO के लिए सरल पैरामीटर सिंटैक्स अब मान्य नहीं हैं। नई पैरामीटर संरचना बिलिन (पायथन-) प्रसंस्करण एल्गोरिदम के बाद बहुत अधिक उन्मुख है जो आपको टूलबॉक्स में पूर्वस्थापित मिलती है।

जैसा कि मैंने देखा, आपने पहले ही @underdark द्वारा नई एल्गोरिथ्म संरचना का वर्णन किया है। लेकिन अपनी आवश्यकताओं (रेखापुंज परतों, डबल इनपुट, आदि) के लिए इस संरचना को समायोजित करने के लिए आपको स्क्रिप्ट में कई स्थानों पर कोड को बदलना होगा। मैंने आपके लिए एक संक्षिप्त विवरण के साथ एक मोटे उदाहरण को कोडित किया है (सिर्फ @ एल्गोरिदम उदाहरण के आधार पर एक एल्गोरिथ्म कंकाल):

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. अपने एल्गोरिथ्म को वायर करने वाले तरीकों को प्रोसेसिंग टूलबॉक्स गुई में जोड़ें और हेल्पस्ट्रिंग आदि प्रदान करें।
  5. फिर आप प्रसंस्करण ढांचे के मापदंडों को जोड़ते हैं। उन के बच्चे कक्षाओं के रूप में परिभाषित कर रहे हैं QgsProcessingParameterType- अपने एल्गोरिथ्म के मामले में: QgsProcessingParameterRasterLayer, QgsProcessingParameterNumber, और इतने पर। QgsProcessingParameterRasterLayerसही तर्क पास करने और पैरामीटर ऑब्जेक्ट बनाने के लिए आप API प्रविष्टियों (यानी। ) से परामर्श कर सकते हैं।
  6. जहाँ आप रनटाइम में पैरामीटर से इनपुट डेटासेट प्राप्त करते हैं, उस पद्धति के साथ contextऔर feedbackऑब्जेक्ट्स को पास करें processAlgorithm()(इस मामले में QgsRasterLayer ऑब्जेक्ट्स को parameterAsRasterLayer()विधि, आदि का उपयोग करके )।
  7. अपनी गणना करें।
  8. परिणाम डिक्शनरी में आउटपुट जोड़ें और कॉलिंग के परिणाम के रूप में उन्हें वापस करें processAlgorithm()

मुझे आशा है कि मैं आपको QGIS3 में अपने अजगर एल्गोरिदम को डिजाइन करने के बारे में कुछ जानकारी दे सकता हूं। जब भी आप अटक जाते हैं, तो यह देखना हमेशा मददगार होता है कि प्रोसेसिंग फ्रेमवर्क के मौजूदा एल्गोरिदम मापदंडों को कैसे संभालते हैं। आप उन्हें यहाँ देख सकते हैं ।


1
अच्छा लिखो! अगर मैं इसे github.com/qgis/QGIS/blob/master/doc/porting_processing.dox में जोड़ दूं तो बुरा लगेगा ?
ndawson

अगर आप इसे qgis प्रलेखन में जोड़ते हैं तो मुझे सम्मानित किया जाएगा। कृपया ऐसा करो! क्या qgis3 के लिए अधिक अजगर प्रलेखन में योगदान देने के लिए कोई और शर्तें हैं? मुझे लगता है कि यह स्क्रिप्टर्स और प्रोग्रामर के संदर्भ में व्यापक उपयोगकर्ता आधार के लिए आवश्यक है।
root676

1
किसी और चीज की नहीं। GitHub पुल अनुरोधों (GitHub साइट पर सभी संपादन भी किए जा सकते हैं: github.com/qgis/QGIS-Documentation/tree/master/source/docs/… ) के माध्यम से आधिकारिक अजगर रसोई की किताब को जोड़ना वास्तव में काफी आसान है । आधिकारिक डॉक्स में अधिक उदाहरण जोड़ना भी बहुत स्वागत योग्य होगा!
ndawson

1
आपके उत्तर के लिए धन्यवाद! मैं आज व्यस्त था, लेकिन मैं कल खुदाई करने की कोशिश करूंगा। यह वास्तव में आशाजनक लगता है।
Kantan

2
यह निश्चित रूप से एक महान जवाब है, विवरण और संदर्भ के लिए धन्यवाद। गिटहब पर लिपियों का लिंक एक वास्तविक सोने की खान है! पहले तो QVariant घोषणा ने मुझे एक त्रुटि दी, लेकिन जब मैंने इसे संपादक में वापस लिया और स्वचालित पूर्णता का उपयोग किया, तो त्रुटि गायब हो गई। अब यह वास्तव में स्क्रिप्टिंग में गोता लगाने के लिए एक बड़ा कदम उठाता है, मुझे उम्मीद है कि यह नए प्रोग्रामर को हतोत्साहित नहीं करेगा। जैसा कि अधिक प्रलेखन उपलब्ध है, हालांकि, मुझे आशा है कि यह स्पष्ट हो रहा है!
कान्तन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.