[Qgis-user] QGIS 3 Processing question

Frank Broniewski hallo at frankbroniewski.com
Sun Jul 1 23:34:32 PDT 2018


Thanks for your answer, I feared that this might be an option after all. I will try Rudi’s answer first and then yours. I will definitely post my insights here so everyone can profit 

 

Frank

 

Von: Jean-Baptiste Desbas <jb.desbas at gmail.com> 
Gesendet: Freitag, 29. Juni 2018 16:03
An: Frank Broniewski <hallo at frankbroniewski.com>
Cc: Nyall Dawson <nyall.dawson at gmail.com>; qgis-user <qgis-user at lists.osgeo.org>
Betreff: Re: [Qgis-user] QGIS 3 Processing question

 

Hi, 

 

I had the same issue. I had to loop over the output vector layer (child alg) to feed the sink (main alg). Maybe is not the simpliest/shortest/fastest, but it works.

Something like that :

 

o = processing.run(
            'qgis:pointsalonglines', 
            params, context=context, feedback=feedback
        )['OUTPUT'] 

 

 (sink, dest_id) = self.parameterAsSink(

                    parameters,
                    self.OUTPUT,
                    context,
                    o.fields,
                    o.wkbType(),
                    o.sourceCrs()
)

 

for f in o.getFeatures()

    sink.addFeature(f)

 

 

return {'OUTPUT':dest_id}

 

 

2018-06-29 9:35 GMT+02:00 Frank Broniewski <hallo at frankbroniewski.com <mailto:hallo at frankbroniewski.com> >:

Hi Nyall,

thanks a ton for your response. I am well know for making things tricky for myself 😃
Anyway, my testing-algorithm-script is still not working. It runs through, but I do not get the expected result loaded into the layer tree. I suppose it runs through - the  output from the 'qgis:pointsalonglines' is a QgsVectorLayer - but after finishing I get nuthink back.

Here's my complete script: You'll need a temporary polygon layer in a projected CRS (I use EPSG:31466) for it to work nicely. Copy & Paste it into a new script window and run it. I simply don't find the reason why the point result layer isn't loaded into my layer tree ...


from qgis.PyQt.QtCore import QCoreApplication
from qgis.core import (QgsApplication,
                       QgsProcessing,
                       QgsFeatureSink,
                       QgsProcessingAlgorithm,
                       QgsProcessingParameterFeatureSource,
                       QgsProcessingParameterNumber,
                       QgsProcessingParameterFeatureSink)

import processing


class PolygonCenterline(QgsProcessingAlgorithm):

    INPUT = 'INPUT'
    DISTANCE = 'DISTANCE'
    OUTPUT = 'OUTPUT'

    def tr(self, text):
        return QCoreApplication.translate('Processing', text)

    def createInstance(self):
        return PolygonCenterline()

    def group(self):
        return self.tr <http://self.tr> ('Cartography')

    def groupId(self):
        return 'cartography'

    def name(self):
        return 'polygoncenterline'

    def displayName(self):
        return self.tr <http://self.tr> ('Calculate a polygon centerline')

    def initAlgorithm(self, config=None):
        self.addParameter(
            QgsProcessingParameterFeatureSource(
                self.INPUT,
                self.tr <http://self.tr> ('Vector Polygon Layer'),
                [QgsProcessing.TypeVectorPolygon]
            )
        )

        self.addParameter(
            QgsProcessingParameterNumber(
                self.DISTANCE,
                self.tr <http://self.tr> ('Point distance value'),
                type=QgsProcessingParameterNumber.Double,
                minValue=10.0
            )
        )

        self.addParameter(
            QgsProcessingParameterFeatureSink(
                self.OUTPUT,
                self.tr <http://self.tr> ('Center line')
            )
        )

    def processAlgorithm(self, parameters, context, feedback):
        # qgis:pointsalonglines
        params = {
            'INPUT': parameters[self.INPUT], 
            'DISTANCE': parameters[self.DISTANCE],
            'START_OFFSET': 0,
            'END_OFFSET': 0,
            'OUTPUT': 'memory:'
        }
        points = processing.run(
            'qgis:pointsalonglines', 
            params, context=context, feedback=feedback
        )['OUTPUT']

        return {self.OUTPUT: points}




-----Ursprüngliche Nachricht-----
Von: Nyall Dawson <nyall.dawson at gmail.com <mailto:nyall.dawson at gmail.com> > 
Gesendet: Freitag, 29. Juni 2018 01:04
An: Frank Broniewski <hallo at frankbroniewski.com <mailto:hallo at frankbroniewski.com> >
Cc: qgis-user <qgis-user at lists.osgeo.org <mailto:qgis-user at lists.osgeo.org> >
Betreff: Re: [Qgis-user] QGIS 3 Processing question


On Fri, 29 Jun 2018 at 07:14, Frank Broniewski <hallo at frankbroniewski.com <mailto:hallo at frankbroniewski.com> > wrote:
>
>     def processAlgorithm(self, parameters, context, feedback):


You're making this tricky for yourself! Cut out everything in processAlgorithm related to self.INPUT, and just pass the parameter value direct to the child algorithm to handle:

>         params = {
>
>             'INPUT': parameters[self.INPUT],
>
>             'DISTANCE': pt_value,
>
>             'START_OFFSET': 0,
>
>             'END_OFFSET': 0,
>
>             'OUTPUT': 'memory:'
>
>         }


Nyall


_______________________________________________
Qgis-user mailing list
Qgis-user at lists.osgeo.org <mailto:Qgis-user at lists.osgeo.org> 
List info: https://lists.osgeo.org/mailman/listinfo/qgis-user
Unsubscribe: https://lists.osgeo.org/mailman/listinfo/qgis-user

 

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osgeo.org/pipermail/qgis-user/attachments/20180702/9c922897/attachment.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/pkcs7-signature
Size: 5488 bytes
Desc: not available
URL: <http://lists.osgeo.org/pipermail/qgis-user/attachments/20180702/9c922897/attachment.bin>


More information about the Qgis-user mailing list