কিউজিআইএস ৩.০ সহ পাইথন প্রসেসিং স্ক্রিপ্ট লেখা


17

কিউজিআইএস ৩.০-এ আপডেট হওয়ার পরে, কিউজিআইএস ৩.০-তে প্রসেসিং স্ক্রিপ্টগুলি লেখার বিষয়ে কোনও তথ্য পাওয়া খুব কঠিন হয়ে পড়েছে।

@ উন্দরডার্ক ( এখানে দেখুন ) কঙ্কালের জন্য একটি ভিত্তি সরবরাহ করেছে। টেমপ্লেট (QGIS 3.0.2) থেকে নতুন স্ক্রিপ্ট লেখার সময় এই কোডটি QGIS এ যুক্ত করা হয়েছিল বলে মনে হয়।

তবে, সেই কোডটি কীভাবে পরিবর্তন করতে হয়, বিশেষত ইনপুট এবং আউটপুট স্তরগুলির জন্য, আমার মতো পাইথন নবজাতকদের সহায়তা করার কোনও উপায় আমি খুঁজে পাইনি।

আমার লক্ষ্য হ'ল দুটি স্ক্রিন আউটপুট করে দু'টি রাস্টার স্তর এবং ইনপুট হিসাবে একটি ডাবল নিয়ে স্ক্রিপ্ট লেখা write

এটি অনুমোদনের জন্য উদাহরণ কোডে প্রয়োজনীয় পরিবর্তনগুলি কী হবে?

কিউজিআইএস ২.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 ই মে, QGIS পাইথন এপিআই ডকুমেন্টেশন প্রকাশিত হয়েছিল। তবে এটি এখানে কীভাবে ব্যবহার করা যায় তা এখনও আমার পক্ষে অস্পষ্ট। (যা খুব ভাল পাইথন জ্ঞানের অভাব হতে পারে)


1
আপনি কিউগিস ২.x এর উপর একই উদ্দেশ্যে ব্যবহৃত কোডের একটি নমুনা সরবরাহ করতে পারেন? কিগিস ৩.x এর ডকুমেন্টেশন এখানে উপলভ্য হবে: ডকস.কিগিস.আর.সেটেস্টিং / এএন / ডকস / পিক্সিস_ডিফলার_কুকবুক /… যত তাড়াতাড়ি তা হবে আপডেট করা হয়েছে। ডক ইস্যুগুলি এখানে ট্র্যাক করা হয়েছে: github.com/qgis/QGIS- ডকুমেন্টেশন
ননো

কোড উদাহরণ সহ উত্তর সম্পাদিত। লিঙ্কগুলির জন্য ধন্যবাদ, আমি ইতিমধ্যে কুকবুক অনুসরণ করেছিলাম তবে দুর্ভাগ্যক্রমে আমি আমার উত্তরটি সেখানে খুঁজে পাইনি!
কান্টন

আমি কিউগিস এপিআই ডক্স সম্পর্কে পড়েছি, তবে আমি ও @ ইউনারডार्কের কোডের মধ্যে সম্পর্ক রাখতে পারি না। (লিঙ্কগুলির জন্য সম্পাদনা দেখুন)
কান্তান

উত্তর:


29

QGIS2.x থেকে QGIS3.x স্থানান্তরিত হওয়ার সাথে সাথে পুরো প্রক্রিয়াজাতকরণ কাঠামোটি আবার তৈরি হয়ে গেছে এবং এর বড় অংশগুলি এখন সি ++ শ্রেণি হিসাবে চলে যা আপনি পাইথন ব্যবহারের সাথে ইন্টারেক্ট করতে পারবেন। দুর্ভাগ্যক্রমে ডেটা / ডেটাসেট আইওয়ের জন্য সহজ পরামিতি সিনট্যাক্স আর বৈধ নয়। নতুন প্যারামিটার কাঠামোটি বিল্টইন (পাইথন-) প্রসেসিং অ্যালগরিদমগুলির পরে যা আপনি টুলবাক্সে পূর্বেই ইনস্টলড পেয়েছেন তার পরে অনেক বেশি ওরিয়েন্টেটেড।

আমি দেখতে পাচ্ছি, আপনি ইতিমধ্যে @unddark দ্বারা নতুন অ্যালগরিদম কাঠামোর বর্ণনা অনুসরণ করেছেন। তবে আপনার প্রয়োজনীয়তার জন্য এই কাঠামোটি সামঞ্জস্য করতে (রাস্টার স্তর, ডাবল ইনপুট ইত্যাদি) আপনাকে স্ক্রিপ্টের একাধিক স্থানে কোড পরিবর্তন করতে হবে। আমি আপনার জন্য একটি সংক্ষিপ্ত ব্যাখ্যা দিয়ে মোটামুটি উদাহরণ কোড করেছি (@undarks উদাহরণের উপর ভিত্তি করে একটি অ্যালগরিদম কঙ্কাল):

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সঠিক যুক্তিগুলি পাস করার জন্য এবং প্যারামিটার অবজেক্টগুলি তৈরি ) এর ।
  6. রানটাইম সময় আপনি প্যারামিটারগুলি থেকে ইনপুট ডেটাসেটগুলি প্রাপ্ত পদ্ধতিটিতে প্যারামিটার contextএবং feedbackঅবজেক্টগুলি পাশ করুন processAlgorithm()(এই ক্ষেত্রে QgsRasterLayer অবজেক্টগুলি ব্যবহার করেparameterAsRasterLayer() )।
  7. আপনার গণনা করুন।
  8. ফলাফলের অভিধানে আউটপুট যুক্ত করুন এবং কল করার ফলস্বরূপ সেগুলি ফিরিয়ে দিন processAlgorithm()

আমি আশা করি কিউজিআইএস 3-তে কীভাবে আপনার অজগর অ্যালগরিদমগুলি ডিজাইন করবেন সে সম্পর্কে আপনাকে কিছু অন্তর্দৃষ্টি দিতে পারলাম। আপনি যখনই আটকে আছেন, প্রক্রিয়াজাতকরণ কাঠামোর বিদ্যমান অ্যালগরিদমগুলি কীভাবে পরামিতিগুলি পরিচালনা করে তা দেখতে সর্বদা সহায়ক। আপনি তাদের এখানে একবার দেখতে পারেন ।


1
ভাল লেখার! মন যদি আমি এটি github.com/qgis/QGIS/blob/master/doc/porting_processing.dox এ যুক্ত করি ?
ndawson

আপনি এটি কিউজিস ডকুমেন্টেশনে যুক্ত করলে আমি সম্মানিত হব। অনুগ্রহপূর্বক তা - ই করো! কিউগিস 3 এর জন্য আরও অজগর ডকুমেন্টেশন অবদান রাখার জন্য কোনও পূর্বশর্ত রয়েছে? আমি মনে করি স্ক্রিপ্টার এবং প্রোগ্রামারদের ক্ষেত্রে বিস্তৃত ব্যবহারকারী বেসের জন্য এটি অপরিহার্য।
রুট 676

1
পূর্বশর্ত নেই। গিটিহাব পুলের অনুরোধের মাধ্যমে অফিসিয়াল পাইথন কুকবুকে যুক্ত হওয়া আসলে এটি বেশ সহজ (সমস্ত সম্পাদনা এমনকি গিটহাব সাইটে করা যেতে পারে: github.com/qgis/QGIS- ডকুমেন্টেশন / ট্র্রি / মাস্টার / সোর্স / ডকস / )। সরকারী দস্তাবেজগুলিতে আরও উদাহরণ যুক্ত করাও খুব স্বাগত হবে!
এনডাউসন

1
আপনার উত্তরের জন্য ধন্যবাদ! আমি আজ ব্যস্ত ছিলাম, তবে আমি আগামীকাল খননের চেষ্টা করব। এটি সত্যিই আশাব্যঞ্জক মনে হচ্ছে।
কান্টান

2
এটি অবশ্যই একটি দুর্দান্ত উত্তর, বিশদ এবং রেফারেন্সের জন্য ধন্যবাদ। গিটহাবের স্ক্রিপ্টগুলির লিঙ্কটি একটি আসল সোনার খনি! প্রথমে কিভিয়ারেন্ট ঘোষণাপত্রটি আমাকে ত্রুটি দিয়েছিল, কিন্তু আমি যখন এডিটরটিতে এটি টাইপ করেছি এবং স্বয়ংক্রিয়ভাবে সমাপ্তি ব্যবহার করি তখন ত্রুটিটি অদৃশ্য হয়ে যায়। স্ক্রিপ্টিংয়ে ডুব দেওয়ার জন্য এটি এখন সত্যিই একটি বড় পদক্ষেপ নেয়, আমি আশা করি এটি নতুন প্রোগ্রামারদের নিরুৎসাহিত করবে না। আরও ডকুমেন্টেশন যেমন পাওয়া যায়, তবুও, আমি আশা করি এটি আরও স্পষ্ট হয়ে উঠছে!
ক্যান্টন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.