[QGIS-Developer] How to create a simple processing script in QGIS 3.x, eg just a buffer
Anita Graser
anitagraser at gmx.at
Fri Aug 10 05:32:42 PDT 2018
Great, thanks for sharing, Andrew!
Anita
On Fri, Aug 10, 2018 at 2:05 PM Andrew C <andrew.cutts at gmail.com> wrote:
> Hi Anita,
>
> I worked it out. Here is a very simple replication of a buffer for
> scripting, in case anyone else needs it. I don't know if this is best
> practice but it works for a simple test. I didn't realise I could parse
> parameters['INPUT'] as an input.
>
> Thanks for your help
>
> Kind Regards
>
> Andrew
>
> import processing
> from qgis.PyQt.QtCore import QCoreApplication
> from qgis.core import QgsProcessingAlgorithm, QgsProcessing,
> QgsProcessingParameterFeatureSink,QgsProcessingParameterFeatureSource
>
> class testAlg(QgsProcessingAlgorithm):
> OUTPUT = 'OUTPUT'
> INPUT = 'INPUT'
>
> def tr(self, text):
> return QCoreApplication.translate('testalg', text)
>
> def createInstance(self):
> return type(self)()
>
> def group(self):
> return self.tr('Test')
>
> def groupId(self):
> return 'test'
>
> def __init__(self):
> super().__init__()
>
> def initAlgorithm(self, config=None):
>
> self.addParameter(
> QgsProcessingParameterFeatureSource(
> self.INPUT,
> self.tr('Input layer'),
> [QgsProcessing.TypeVectorAnyGeometry]
> )
> )
>
> self.addParameter(
> QgsProcessingParameterFeatureSink(
> self.OUTPUT,
> self.tr('Output'),
> QgsProcessing.TypeVectorPolygon
> )
> )
>
> def name(self):
> return 'testalg'
>
> def displayName(self):
> return self.tr('Test Algorithm')
>
> def processAlgorithm(self, parameters, context, feedback):
>
> output = processing.run("native:buffer", {
> 'INPUT': parameters['INPUT'],
> 'DISTANCE': 10,
> 'SEGMENTS': 5,
> 'END_CAP_STYLE': 0,
> 'JOIN_STYLE': 0,
> 'MITER_LIMIT': 2,
> 'DISSOLVE': False,
> 'OUTPUT': parameters['OUTPUT']
> }, context=context, feedback=feedback)['OUTPUT']
>
> return {self.OUTPUT: output}
>
> On Thu, Aug 9, 2018 at 5:29 PM Andrew C <andrew.cutts at gmail.com> wrote:
>
>> Hi Anita,
>>
>> Thanks very much for this. I am still lost though. If I replace the sink
>> and add your code I don't get an output in the dialog box - it needs to be
>> a parameter for that to happen right?
>>
>> I found this
>> https://gis.stackexchange.com/questions/282773/writing-a-python-processing-script-with-qgis-3-0
>> which lead me to this
>> https://github.com/qgis/QGIS/blob/master/doc/porting_processing.dox
>>
>> Which is recommending "Best practice in 3.x Processing algorithms is to
>> use "feature sinks" instead of vector layer outputs"
>>
>>
>> Kind Regards
>> Andrew
>>
>>
>>
>> On Thu, Aug 9, 2018 at 2:23 PM Anita Graser <anitagraser at gmx.at> wrote:
>>
>>> Hi Andrew,
>>>
>>> On Thu, Aug 9, 2018 at 2:57 PM Andrew C <andrew.cutts at gmail.com> wrote:
>>>
>>>> I am not clear on how QgsFeatureSinkis working, perhaps that is why I
>>>> am not getting the buffered layer? Normally in a script I could try
>>>> printing variables I cannot see where these are printed either when I
>>>> tested.
>>>>
>>>
>>> I think you'd need an output layer instead of a feature sink. Have a
>>> look at
>>> https://github.com/qgis/QGIS/blob/master/python/plugins/processing/algs/qgis/PostGISExecuteAndLoadSQL.py
>>>
>>> self.addOutput(QgsProcessingOutputVectorLayer(
>>>
>>> self.OUTPUT,
>>>
>>> self.tr("Output layer"),
>>>
>>> QgsProcessing.TypeVectorAnyGeometry))
>>>
>>> Regards,
>>> Anita
>>>
>>>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osgeo.org/pipermail/qgis-developer/attachments/20180810/5a181955/attachment.html>
More information about the QGIS-Developer
mailing list