[QGIS-Developer] How to create a simple processing script in QGIS 3.x, eg just a buffer
Andrew C
andrew.cutts at gmail.com
Fri Aug 10 05:05:30 PDT 2018
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/ec0cca7b/attachment-0001.html>
More information about the QGIS-Developer
mailing list