Skip to content

Commit 184899e

Browse files
committed
Port remaining plotly based algs to new API
1 parent 9464ab7 commit 184899e

12 files changed

+191
-190
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ tests/testdata/grass/wgs84/test/.gislock
6161
tests/testdata/grass/wgs84/test6/.gislock
6262
tests/testdata/grass/wgs84/test7/.gislock
6363
tests/testdata/*.aux.xml
64+
tests/testdata/landsat-int16-b1.tif.aux.xml
6465
tests/testdata/raster/*.aux.xml
6566
tests/testdata/raster/band1_byte_noct_epsg4326.tif.aux.xml
6667
tests/testdata/raster/band1_float32_noct_epsg4326.tif.aux.xml

python/plugins/processing/algs/qgis/BarPlot.py

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,7 @@
2929
import plotly.graph_objs as go
3030

3131

32-
from qgis.core import (QgsApplication,
33-
QgsFeatureSink,
34-
QgsProcessingUtils,
35-
QgsProcessingParameterFeatureSource,
32+
from qgis.core import (QgsProcessingParameterFeatureSource,
3633
QgsProcessingParameterField,
3734
QgsProcessingParameterFileDestination,
3835
QgsProcessingOutputHtml)
@@ -63,7 +60,7 @@ def initAlgorithm(self, config=None):
6360
self.tr('Value field'),
6461
None, self.INPUT, QgsProcessingParameterField.Numeric))
6562

66-
self.addParameter(QgsProcessingParameterFileDestination(self.OUTPUT, self.tr('Added'), self.tr('HTML files (*.html)')))
63+
self.addParameter(QgsProcessingParameterFileDestination(self.OUTPUT, self.tr('Bar plot'), self.tr('HTML files (*.html)')))
6764

6865
self.addOutput(QgsProcessingOutputHtml(self.OUTPUT, self.tr('Bar plot')))
6966

python/plugins/processing/algs/qgis/BoxPlot.py

Lines changed: 30 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -28,14 +28,13 @@
2828
import plotly as plt
2929
import plotly.graph_objs as go
3030

31-
from qgis.core import (QgsApplication,
32-
QgsFeatureSink,
33-
QgsProcessingUtils)
34-
from processing.core.parameters import ParameterTable
35-
from processing.core.parameters import ParameterTableField
36-
from processing.core.parameters import ParameterSelection
31+
from qgis.core import (QgsProcessingParameterFeatureSource,
32+
QgsProcessingParameterField,
33+
QgsProcessingParameterEnum,
34+
QgsProcessingParameterFileDestination,
35+
QgsProcessingOutputHtml,
36+
QgsFeatureRequest)
3737
from processing.algs.qgis.QgisAlgorithm import QgisAlgorithm
38-
from processing.core.outputs import OutputHTML
3938
from processing.tools import vector
4039

4140

@@ -54,25 +53,27 @@ def __init__(self):
5453
super().__init__()
5554

5655
def initAlgorithm(self, config=None):
57-
self.addParameter(ParameterTable(self.INPUT, self.tr('Input table')))
58-
self.addParameter(ParameterTableField(self.NAME_FIELD,
59-
self.tr('Category name field'),
60-
self.INPUT,
61-
ParameterTableField.DATA_TYPE_ANY))
62-
self.addParameter(ParameterTableField(self.VALUE_FIELD,
63-
self.tr('Value field'),
64-
self.INPUT,
65-
ParameterTableField.DATA_TYPE_NUMBER))
56+
self.addParameter(QgsProcessingParameterFeatureSource(self.INPUT,
57+
self.tr('Input layer')))
58+
self.addParameter(QgsProcessingParameterField(self.NAME_FIELD,
59+
self.tr('Category name field'),
60+
parentLayerParameterName=self.INPUT,
61+
type=QgsProcessingParameterField.Any))
62+
self.addParameter(QgsProcessingParameterField(self.VALUE_FIELD,
63+
self.tr('Value field'),
64+
parentLayerParameterName=self.INPUT,
65+
type=QgsProcessingParameterField.Numeric))
6666
msd = [self.tr('Show Mean'),
6767
self.tr('Show Standard Deviation'),
6868
self.tr('Don\'t show Mean and Standard Deviation')
6969
]
70-
self.addParameter(ParameterSelection(
70+
self.addParameter(QgsProcessingParameterEnum(
7171
self.MSD,
7272
self.tr('Additional Statistic Lines'),
73-
msd, default=0))
73+
options=msd, defaultValue=0))
7474

75-
self.addOutput(OutputHTML(self.OUTPUT, self.tr('Box plot')))
75+
self.addParameter(QgsProcessingParameterFileDestination(self.OUTPUT, self.tr('Box plot'), self.tr('HTML files (*.html)')))
76+
self.addOutput(QgsProcessingOutputHtml(self.OUTPUT, self.tr('Box plot')))
7677

7778
def name(self):
7879
return 'boxplot'
@@ -81,17 +82,18 @@ def displayName(self):
8182
return self.tr('Box plot')
8283

8384
def processAlgorithm(self, parameters, context, feedback):
84-
layer = QgsProcessingUtils.mapLayerFromString(self.getParameterValue(self.INPUT), context)
85-
namefieldname = self.getParameterValue(self.NAME_FIELD)
86-
valuefieldname = self.getParameterValue(self.VALUE_FIELD)
85+
source = self.parameterAsSource(parameters, self.INPUT, context)
86+
namefieldname = self.parameterAsString(parameters, self.NAME_FIELD, context)
87+
valuefieldname = self.parameterAsString(parameters, self.VALUE_FIELD, context)
8788

88-
output = self.getOutputValue(self.OUTPUT)
89+
output = self.parameterAsFileOutput(parameters, self.OUTPUT, context)
8990

90-
values = vector.values(layer, valuefieldname)
91+
values = vector.values(source, valuefieldname)
9192

92-
x_var = [i[namefieldname] for i in layer.getFeatures()]
93+
x_index = source.fields().lookupField(namefieldname)
94+
x_var = [i[namefieldname] for i in source.getFeatures(QgsFeatureRequest().setFlags(QgsFeatureRequest.NoGeometry).setSubsetOfAttributes([x_index]))]
9395

94-
msdIndex = self.getParameterValue(self.MSD)
96+
msdIndex = self.parameterAsEnum(parameters, self.MSD, context)
9597
msd = True
9698

9799
if msdIndex == 1:
@@ -105,3 +107,5 @@ def processAlgorithm(self, parameters, context, feedback):
105107
boxmean=msd)]
106108

107109
plt.offline.plot(data, filename=output, auto_open=False)
110+
111+
return {self.OUTPUT: output}

python/plugins/processing/algs/qgis/MeanAndStdDevPlot.py

Lines changed: 21 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,12 @@
2828
import plotly as plt
2929
import plotly.graph_objs as go
3030

31-
from qgis.core import (QgsApplication,
32-
QgsFeatureSink,
33-
QgsProcessingUtils)
31+
from qgis.core import (QgsProcessingParameterFeatureSource,
32+
QgsProcessingParameterField,
33+
QgsProcessingUtils,
34+
QgsProcessingParameterFileDestination,
35+
QgsProcessingOutputHtml)
3436
from processing.algs.qgis.QgisAlgorithm import QgisAlgorithm
35-
from processing.core.parameters import ParameterTable
36-
from processing.core.parameters import ParameterTableField
37-
from processing.core.outputs import OutputHTML
3837

3938
from processing.tools import vector
4039

@@ -53,15 +52,16 @@ def __init__(self):
5352
super().__init__()
5453

5554
def initAlgorithm(self, config=None):
56-
self.addParameter(ParameterTable(self.INPUT,
57-
self.tr('Input table')))
58-
self.addParameter(ParameterTableField(self.NAME_FIELD,
59-
self.tr('Category name field'), self.INPUT,
60-
ParameterTableField.DATA_TYPE_ANY))
61-
self.addParameter(ParameterTableField(self.VALUE_FIELD,
62-
self.tr('Value field'), self.INPUT))
55+
self.addParameter(QgsProcessingParameterFeatureSource(self.INPUT,
56+
self.tr('Input table')))
57+
self.addParameter(QgsProcessingParameterField(self.NAME_FIELD,
58+
self.tr('Category name field'), parentLayerParameterName=self.INPUT,
59+
type=QgsProcessingParameterField.Any))
60+
self.addParameter(QgsProcessingParameterField(self.VALUE_FIELD,
61+
self.tr('Value field'), parentLayerParameterName=self.INPUT))
6362

64-
self.addOutput(OutputHTML(self.OUTPUT, self.tr('Plot')))
63+
self.addParameter(QgsProcessingParameterFileDestination(self.OUTPUT, self.tr('Plot'), self.tr('HTML files (*.html)')))
64+
self.addOutput(QgsProcessingOutputHtml(self.OUTPUT, self.tr('Plot')))
6565

6666
def name(self):
6767
return 'meanandstandarddeviationplot'
@@ -70,13 +70,13 @@ def displayName(self):
7070
return self.tr('Mean and standard deviation plot')
7171

7272
def processAlgorithm(self, parameters, context, feedback):
73-
layer = QgsProcessingUtils.mapLayerFromString(self.getParameterValue(self.INPUT), context)
74-
namefieldname = self.getParameterValue(self.NAME_FIELD)
75-
valuefieldname = self.getParameterValue(self.VALUE_FIELD)
73+
source = self.parameterAsSource(parameters, self.INPUT, context)
74+
namefieldname = self.parameterAsString(parameters, self.NAME_FIELD, context)
75+
valuefieldname = self.parameterAsString(parameters, self.VALUE_FIELD, context)
7676

77-
output = self.getOutputValue(self.OUTPUT)
77+
output = self.parameterAsFileOutput(parameters, self.OUTPUT, context)
7878

79-
values = vector.values(layer, namefieldname, valuefieldname)
79+
values = vector.values(source, namefieldname, valuefieldname)
8080

8181
d = {}
8282
for i in range(len(values[namefieldname])):
@@ -93,3 +93,5 @@ def processAlgorithm(self, parameters, context, feedback):
9393
name=k
9494
))
9595
plt.offline.plot(data, filename=output, auto_open=False)
96+
97+
return {self.OUTPUT: output}

python/plugins/processing/algs/qgis/PolarPlot.py

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -29,12 +29,11 @@
2929
import plotly.graph_objs as go
3030
import numpy as np
3131

32-
from qgis.core import (QgsApplication,
33-
QgsProcessingUtils)
32+
from qgis.core import (QgsProcessingParameterFeatureSource,
33+
QgsProcessingParameterField,
34+
QgsProcessingParameterFileDestination,
35+
QgsProcessingOutputHtml)
3436
from processing.algs.qgis.QgisAlgorithm import QgisAlgorithm
35-
from processing.core.parameters import ParameterTable
36-
from processing.core.parameters import ParameterTableField
37-
from processing.core.outputs import OutputHTML
3837
from processing.tools import vector
3938

4039

@@ -52,14 +51,15 @@ def __init__(self):
5251
super().__init__()
5352

5453
def initAlgorithm(self, config=None):
55-
self.addParameter(ParameterTable(self.INPUT,
56-
self.tr('Input table')))
57-
self.addParameter(ParameterTableField(self.NAME_FIELD,
58-
self.tr('Category name field'), self.INPUT)) # FIXME unused?
59-
self.addParameter(ParameterTableField(self.VALUE_FIELD,
60-
self.tr('Value field'), self.INPUT))
54+
self.addParameter(QgsProcessingParameterFeatureSource(self.INPUT,
55+
self.tr('Input layer')))
56+
self.addParameter(QgsProcessingParameterField(self.NAME_FIELD,
57+
self.tr('Category name field'), parentLayerParameterName=self.INPUT)) # FIXME unused?
58+
self.addParameter(QgsProcessingParameterField(self.VALUE_FIELD,
59+
self.tr('Value field'), parentLayerParameterName=self.INPUT))
6160

62-
self.addOutput(OutputHTML(self.OUTPUT, self.tr('Polar plot')))
61+
self.addParameter(QgsProcessingParameterFileDestination(self.OUTPUT, self.tr('Polar plot'), self.tr('HTML files (*.html)')))
62+
self.addOutput(QgsProcessingOutputHtml(self.OUTPUT, self.tr('Polar plot')))
6363

6464
def name(self):
6565
return 'polarplot'
@@ -68,14 +68,16 @@ def displayName(self):
6868
return self.tr('Polar plot')
6969

7070
def processAlgorithm(self, parameters, context, feedback):
71-
layer = QgsProcessingUtils.mapLayerFromString(self.getParameterValue(self.INPUT), context)
72-
namefieldname = self.getParameterValue(self.NAME_FIELD) # NOQA FIXME unused?
73-
valuefieldname = self.getParameterValue(self.VALUE_FIELD)
71+
source = self.parameterAsSource(parameters, self.INPUT, context)
72+
namefieldname = self.parameterAsString(parameters, self.NAME_FIELD, context) # NOQA FIXME unused?
73+
valuefieldname = self.parameterAsString(parameters, self.VALUE_FIELD, context)
7474

75-
output = self.getOutputValue(self.OUTPUT)
75+
output = self.parameterAsFileOutput(parameters, self.OUTPUT, context)
7676

77-
values = vector.values(layer, valuefieldname)
77+
values = vector.values(source, valuefieldname)
7878

7979
data = [go.Area(r=values[valuefieldname],
8080
t=np.degrees(np.arange(0.0, 2 * np.pi, 2 * np.pi / len(values[valuefieldname]))))]
8181
plt.offline.plot(data, filename=output, auto_open=False)
82+
83+
return {self.OUTPUT: output}

python/plugins/processing/algs/qgis/QGISAlgorithmProvider.py

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -323,20 +323,23 @@ def getAlgs(self):
323323
]
324324

325325
if hasPlotly:
326-
# from .VectorLayerHistogram import VectorLayerHistogram
327-
# from .RasterLayerHistogram import RasterLayerHistogram
328-
# from .VectorLayerScatterplot import VectorLayerScatterplot
329-
# from .MeanAndStdDevPlot import MeanAndStdDevPlot
330326
from .BarPlot import BarPlot
331-
# from .PolarPlot import PolarPlot
332-
# from .BoxPlot import BoxPlot
333-
# from .VectorLayerScatterplot3D import VectorLayerScatterplot3D
334-
#
335-
algs.extend([BarPlot()])
336-
#[VectorLayerHistogram(), RasterLayerHistogram(),
337-
# VectorLayerScatterplot(), MeanAndStdDevPlot(),
338-
# BarPlot(), PolarPlot(), BoxPlot(),
339-
# VectorLayerScatterplot3D()])
327+
from .BoxPlot import BoxPlot
328+
from .MeanAndStdDevPlot import MeanAndStdDevPlot
329+
from .PolarPlot import PolarPlot
330+
from .RasterLayerHistogram import RasterLayerHistogram
331+
from .VectorLayerHistogram import VectorLayerHistogram
332+
from .VectorLayerScatterplot import VectorLayerScatterplot
333+
from .VectorLayerScatterplot3D import VectorLayerScatterplot3D
334+
335+
algs.extend([BarPlot(),
336+
BoxPlot(),
337+
MeanAndStdDevPlot(),
338+
PolarPlot(),
339+
RasterLayerHistogram(),
340+
VectorLayerHistogram(),
341+
VectorLayerScatterplot(),
342+
VectorLayerScatterplot3D()])
340343

341344
# to store algs added by 3rd party plugins as scripts
342345
folder = os.path.join(os.path.dirname(__file__), 'scripts')

python/plugins/processing/algs/qgis/RasterLayerHistogram.py

Lines changed: 25 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -28,20 +28,21 @@
2828
import plotly as plt
2929
import plotly.graph_objs as go
3030

31-
from qgis.core import (QgsApplication,
32-
QgsProcessingUtils)
31+
from qgis.core import (QgsProcessingParameterRasterLayer,
32+
QgsProcessingParameterBand,
33+
QgsProcessingParameterNumber,
34+
QgsProcessingParameterFileDestination,
35+
QgsProcessingOutputHtml)
3336
from processing.algs.qgis.QgisAlgorithm import QgisAlgorithm
34-
from processing.core.parameters import ParameterNumber
35-
from processing.core.parameters import ParameterRaster
36-
from processing.core.outputs import OutputHTML
3737
from processing.tools import raster
3838

3939

4040
class RasterLayerHistogram(QgisAlgorithm):
4141

4242
INPUT = 'INPUT'
4343
BINS = 'BINS'
44-
PLOT = 'PLOT'
44+
OUTPUT = 'OUTPUT'
45+
BAND = 'BAND'
4546

4647
def group(self):
4748
return self.tr('Graphics')
@@ -50,12 +51,17 @@ def __init__(self):
5051
super().__init__()
5152

5253
def initAlgorithm(self, config=None):
53-
self.addParameter(ParameterRaster(self.INPUT,
54-
self.tr('Input layer')))
55-
self.addParameter(ParameterNumber(self.BINS,
56-
self.tr('Number of bins'), 2, None, 10))
57-
58-
self.addOutput(OutputHTML(self.PLOT, self.tr('Histogram')))
54+
self.addParameter(QgsProcessingParameterRasterLayer(self.INPUT,
55+
self.tr('Input layer')))
56+
self.addParameter(QgsProcessingParameterBand(self.BAND,
57+
self.tr('Band number'),
58+
1,
59+
self.INPUT))
60+
self.addParameter(QgsProcessingParameterNumber(self.BINS,
61+
self.tr('number of bins'), minValue=2, defaultValue=10))
62+
63+
self.addParameter(QgsProcessingParameterFileDestination(self.OUTPUT, self.tr('Histogram'), self.tr('HTML files (*.html)')))
64+
self.addOutput(QgsProcessingOutputHtml(self.OUTPUT, self.tr('Histogram')))
5965

6066
def name(self):
6167
return 'rasterlayerhistogram'
@@ -64,13 +70,14 @@ def displayName(self):
6470
return self.tr('Raster layer histogram')
6571

6672
def processAlgorithm(self, parameters, context, feedback):
67-
layer = QgsProcessingUtils.mapLayerFromString(self.getParameterValue(self.INPUT), context)
68-
nbins = self.getParameterValue(self.BINS)
73+
layer = self.parameterAsRasterLayer(parameters, self.INPUT, context)
74+
band = self.parameterAsInt(parameters, self.BAND, context)
75+
nbins = self.parameterAsInt(parameters, self.BINS, context)
6976

70-
output = self.getOutputValue(self.PLOT)
77+
output = self.parameterAsFileOutput(parameters, self.OUTPUT, context)
7178

7279
# ALERT: this is potentially blocking if the layer is too big
73-
values = raster.scanraster(layer, feedback)
80+
values = raster.scanraster(layer, feedback, band)
7481

7582
valueslist = []
7683
for v in values:
@@ -80,3 +87,5 @@ def processAlgorithm(self, parameters, context, feedback):
8087
data = [go.Histogram(x=valueslist,
8188
nbinsx=nbins)]
8289
plt.offline.plot(data, filename=output, auto_open=False)
90+
91+
return {self.OUTPUT: output}

0 commit comments

Comments
 (0)