From 184899ec30cc5fb48900f242b083671ac5a7c890 Mon Sep 17 00:00:00 2001 From: Nyall Dawson Date: Wed, 30 Aug 2017 07:28:25 +1000 Subject: [PATCH] Port remaining plotly based algs to new API --- .gitignore | 1 + .../plugins/processing/algs/qgis/BarPlot.py | 7 +-- .../plugins/processing/algs/qgis/BoxPlot.py | 56 ++++++++++--------- .../processing/algs/qgis/MeanAndStdDevPlot.py | 40 ++++++------- .../plugins/processing/algs/qgis/PolarPlot.py | 36 ++++++------ .../algs/qgis/QGISAlgorithmProvider.py | 29 +++++----- .../algs/qgis/RasterLayerHistogram.py | 39 ++++++++----- .../algs/qgis/VectorLayerHistogram.py | 41 +++++++------- .../algs/qgis/VectorLayerScatterplot.py | 47 ++++++++-------- .../algs/qgis/VectorLayerScatterplot3D.py | 55 +++++++++--------- python/plugins/processing/tools/raster.py | 4 +- tests/testdata/landsat-int16-b1.tif.aux.xml | 20 ------- 12 files changed, 188 insertions(+), 187 deletions(-) delete mode 100644 tests/testdata/landsat-int16-b1.tif.aux.xml diff --git a/.gitignore b/.gitignore index d31f8283e40..2dbf609ff2a 100644 --- a/.gitignore +++ b/.gitignore @@ -61,6 +61,7 @@ tests/testdata/grass/wgs84/test/.gislock tests/testdata/grass/wgs84/test6/.gislock tests/testdata/grass/wgs84/test7/.gislock tests/testdata/*.aux.xml +tests/testdata/landsat-int16-b1.tif.aux.xml tests/testdata/raster/*.aux.xml tests/testdata/raster/band1_byte_noct_epsg4326.tif.aux.xml tests/testdata/raster/band1_float32_noct_epsg4326.tif.aux.xml diff --git a/python/plugins/processing/algs/qgis/BarPlot.py b/python/plugins/processing/algs/qgis/BarPlot.py index d4c163fc71c..388d83f96a9 100644 --- a/python/plugins/processing/algs/qgis/BarPlot.py +++ b/python/plugins/processing/algs/qgis/BarPlot.py @@ -29,10 +29,7 @@ import plotly as plt import plotly.graph_objs as go -from qgis.core import (QgsApplication, - QgsFeatureSink, - QgsProcessingUtils, - QgsProcessingParameterFeatureSource, +from qgis.core import (QgsProcessingParameterFeatureSource, QgsProcessingParameterField, QgsProcessingParameterFileDestination, QgsProcessingOutputHtml) @@ -63,7 +60,7 @@ class BarPlot(QgisAlgorithm): self.tr('Value field'), None, self.INPUT, QgsProcessingParameterField.Numeric)) - self.addParameter(QgsProcessingParameterFileDestination(self.OUTPUT, self.tr('Added'), self.tr('HTML files (*.html)'))) + self.addParameter(QgsProcessingParameterFileDestination(self.OUTPUT, self.tr('Bar plot'), self.tr('HTML files (*.html)'))) self.addOutput(QgsProcessingOutputHtml(self.OUTPUT, self.tr('Bar plot'))) diff --git a/python/plugins/processing/algs/qgis/BoxPlot.py b/python/plugins/processing/algs/qgis/BoxPlot.py index 81915c624d8..642679aff61 100644 --- a/python/plugins/processing/algs/qgis/BoxPlot.py +++ b/python/plugins/processing/algs/qgis/BoxPlot.py @@ -28,14 +28,13 @@ __revision__ = '$Format:%H$' import plotly as plt import plotly.graph_objs as go -from qgis.core import (QgsApplication, - QgsFeatureSink, - QgsProcessingUtils) -from processing.core.parameters import ParameterTable -from processing.core.parameters import ParameterTableField -from processing.core.parameters import ParameterSelection +from qgis.core import (QgsProcessingParameterFeatureSource, + QgsProcessingParameterField, + QgsProcessingParameterEnum, + QgsProcessingParameterFileDestination, + QgsProcessingOutputHtml, + QgsFeatureRequest) from processing.algs.qgis.QgisAlgorithm import QgisAlgorithm -from processing.core.outputs import OutputHTML from processing.tools import vector @@ -54,25 +53,27 @@ class BoxPlot(QgisAlgorithm): super().__init__() def initAlgorithm(self, config=None): - self.addParameter(ParameterTable(self.INPUT, self.tr('Input table'))) - self.addParameter(ParameterTableField(self.NAME_FIELD, - self.tr('Category name field'), - self.INPUT, - ParameterTableField.DATA_TYPE_ANY)) - self.addParameter(ParameterTableField(self.VALUE_FIELD, - self.tr('Value field'), - self.INPUT, - ParameterTableField.DATA_TYPE_NUMBER)) + self.addParameter(QgsProcessingParameterFeatureSource(self.INPUT, + self.tr('Input layer'))) + self.addParameter(QgsProcessingParameterField(self.NAME_FIELD, + self.tr('Category name field'), + parentLayerParameterName=self.INPUT, + type=QgsProcessingParameterField.Any)) + self.addParameter(QgsProcessingParameterField(self.VALUE_FIELD, + self.tr('Value field'), + parentLayerParameterName=self.INPUT, + type=QgsProcessingParameterField.Numeric)) msd = [self.tr('Show Mean'), self.tr('Show Standard Deviation'), self.tr('Don\'t show Mean and Standard Deviation') ] - self.addParameter(ParameterSelection( + self.addParameter(QgsProcessingParameterEnum( self.MSD, self.tr('Additional Statistic Lines'), - msd, default=0)) + options=msd, defaultValue=0)) - self.addOutput(OutputHTML(self.OUTPUT, self.tr('Box plot'))) + self.addParameter(QgsProcessingParameterFileDestination(self.OUTPUT, self.tr('Box plot'), self.tr('HTML files (*.html)'))) + self.addOutput(QgsProcessingOutputHtml(self.OUTPUT, self.tr('Box plot'))) def name(self): return 'boxplot' @@ -81,17 +82,18 @@ class BoxPlot(QgisAlgorithm): return self.tr('Box plot') def processAlgorithm(self, parameters, context, feedback): - layer = QgsProcessingUtils.mapLayerFromString(self.getParameterValue(self.INPUT), context) - namefieldname = self.getParameterValue(self.NAME_FIELD) - valuefieldname = self.getParameterValue(self.VALUE_FIELD) + source = self.parameterAsSource(parameters, self.INPUT, context) + namefieldname = self.parameterAsString(parameters, self.NAME_FIELD, context) + valuefieldname = self.parameterAsString(parameters, self.VALUE_FIELD, context) - output = self.getOutputValue(self.OUTPUT) + output = self.parameterAsFileOutput(parameters, self.OUTPUT, context) - values = vector.values(layer, valuefieldname) + values = vector.values(source, valuefieldname) - x_var = [i[namefieldname] for i in layer.getFeatures()] + x_index = source.fields().lookupField(namefieldname) + x_var = [i[namefieldname] for i in source.getFeatures(QgsFeatureRequest().setFlags(QgsFeatureRequest.NoGeometry).setSubsetOfAttributes([x_index]))] - msdIndex = self.getParameterValue(self.MSD) + msdIndex = self.parameterAsEnum(parameters, self.MSD, context) msd = True if msdIndex == 1: @@ -105,3 +107,5 @@ class BoxPlot(QgisAlgorithm): boxmean=msd)] plt.offline.plot(data, filename=output, auto_open=False) + + return {self.OUTPUT: output} diff --git a/python/plugins/processing/algs/qgis/MeanAndStdDevPlot.py b/python/plugins/processing/algs/qgis/MeanAndStdDevPlot.py index fdca9a7a4d6..f5e64299a96 100644 --- a/python/plugins/processing/algs/qgis/MeanAndStdDevPlot.py +++ b/python/plugins/processing/algs/qgis/MeanAndStdDevPlot.py @@ -28,13 +28,12 @@ __revision__ = '$Format:%H$' import plotly as plt import plotly.graph_objs as go -from qgis.core import (QgsApplication, - QgsFeatureSink, - QgsProcessingUtils) +from qgis.core import (QgsProcessingParameterFeatureSource, + QgsProcessingParameterField, + QgsProcessingUtils, + QgsProcessingParameterFileDestination, + QgsProcessingOutputHtml) from processing.algs.qgis.QgisAlgorithm import QgisAlgorithm -from processing.core.parameters import ParameterTable -from processing.core.parameters import ParameterTableField -from processing.core.outputs import OutputHTML from processing.tools import vector @@ -53,15 +52,16 @@ class MeanAndStdDevPlot(QgisAlgorithm): super().__init__() def initAlgorithm(self, config=None): - self.addParameter(ParameterTable(self.INPUT, - self.tr('Input table'))) - self.addParameter(ParameterTableField(self.NAME_FIELD, - self.tr('Category name field'), self.INPUT, - ParameterTableField.DATA_TYPE_ANY)) - self.addParameter(ParameterTableField(self.VALUE_FIELD, - self.tr('Value field'), self.INPUT)) + self.addParameter(QgsProcessingParameterFeatureSource(self.INPUT, + self.tr('Input table'))) + self.addParameter(QgsProcessingParameterField(self.NAME_FIELD, + self.tr('Category name field'), parentLayerParameterName=self.INPUT, + type=QgsProcessingParameterField.Any)) + self.addParameter(QgsProcessingParameterField(self.VALUE_FIELD, + self.tr('Value field'), parentLayerParameterName=self.INPUT)) - self.addOutput(OutputHTML(self.OUTPUT, self.tr('Plot'))) + self.addParameter(QgsProcessingParameterFileDestination(self.OUTPUT, self.tr('Plot'), self.tr('HTML files (*.html)'))) + self.addOutput(QgsProcessingOutputHtml(self.OUTPUT, self.tr('Plot'))) def name(self): return 'meanandstandarddeviationplot' @@ -70,13 +70,13 @@ class MeanAndStdDevPlot(QgisAlgorithm): return self.tr('Mean and standard deviation plot') def processAlgorithm(self, parameters, context, feedback): - layer = QgsProcessingUtils.mapLayerFromString(self.getParameterValue(self.INPUT), context) - namefieldname = self.getParameterValue(self.NAME_FIELD) - valuefieldname = self.getParameterValue(self.VALUE_FIELD) + source = self.parameterAsSource(parameters, self.INPUT, context) + namefieldname = self.parameterAsString(parameters, self.NAME_FIELD, context) + valuefieldname = self.parameterAsString(parameters, self.VALUE_FIELD, context) - output = self.getOutputValue(self.OUTPUT) + output = self.parameterAsFileOutput(parameters, self.OUTPUT, context) - values = vector.values(layer, namefieldname, valuefieldname) + values = vector.values(source, namefieldname, valuefieldname) d = {} for i in range(len(values[namefieldname])): @@ -93,3 +93,5 @@ class MeanAndStdDevPlot(QgisAlgorithm): name=k )) plt.offline.plot(data, filename=output, auto_open=False) + + return {self.OUTPUT: output} diff --git a/python/plugins/processing/algs/qgis/PolarPlot.py b/python/plugins/processing/algs/qgis/PolarPlot.py index d3bb27e330b..dd0b650786c 100644 --- a/python/plugins/processing/algs/qgis/PolarPlot.py +++ b/python/plugins/processing/algs/qgis/PolarPlot.py @@ -29,12 +29,11 @@ import plotly as plt import plotly.graph_objs as go import numpy as np -from qgis.core import (QgsApplication, - QgsProcessingUtils) +from qgis.core import (QgsProcessingParameterFeatureSource, + QgsProcessingParameterField, + QgsProcessingParameterFileDestination, + QgsProcessingOutputHtml) from processing.algs.qgis.QgisAlgorithm import QgisAlgorithm -from processing.core.parameters import ParameterTable -from processing.core.parameters import ParameterTableField -from processing.core.outputs import OutputHTML from processing.tools import vector @@ -52,14 +51,15 @@ class PolarPlot(QgisAlgorithm): super().__init__() def initAlgorithm(self, config=None): - self.addParameter(ParameterTable(self.INPUT, - self.tr('Input table'))) - self.addParameter(ParameterTableField(self.NAME_FIELD, - self.tr('Category name field'), self.INPUT)) # FIXME unused? - self.addParameter(ParameterTableField(self.VALUE_FIELD, - self.tr('Value field'), self.INPUT)) + self.addParameter(QgsProcessingParameterFeatureSource(self.INPUT, + self.tr('Input layer'))) + self.addParameter(QgsProcessingParameterField(self.NAME_FIELD, + self.tr('Category name field'), parentLayerParameterName=self.INPUT)) # FIXME unused? + self.addParameter(QgsProcessingParameterField(self.VALUE_FIELD, + self.tr('Value field'), parentLayerParameterName=self.INPUT)) - self.addOutput(OutputHTML(self.OUTPUT, self.tr('Polar plot'))) + self.addParameter(QgsProcessingParameterFileDestination(self.OUTPUT, self.tr('Polar plot'), self.tr('HTML files (*.html)'))) + self.addOutput(QgsProcessingOutputHtml(self.OUTPUT, self.tr('Polar plot'))) def name(self): return 'polarplot' @@ -68,14 +68,16 @@ class PolarPlot(QgisAlgorithm): return self.tr('Polar plot') def processAlgorithm(self, parameters, context, feedback): - layer = QgsProcessingUtils.mapLayerFromString(self.getParameterValue(self.INPUT), context) - namefieldname = self.getParameterValue(self.NAME_FIELD) # NOQA FIXME unused? - valuefieldname = self.getParameterValue(self.VALUE_FIELD) + source = self.parameterAsSource(parameters, self.INPUT, context) + namefieldname = self.parameterAsString(parameters, self.NAME_FIELD, context) # NOQA FIXME unused? + valuefieldname = self.parameterAsString(parameters, self.VALUE_FIELD, context) - output = self.getOutputValue(self.OUTPUT) + output = self.parameterAsFileOutput(parameters, self.OUTPUT, context) - values = vector.values(layer, valuefieldname) + values = vector.values(source, valuefieldname) data = [go.Area(r=values[valuefieldname], t=np.degrees(np.arange(0.0, 2 * np.pi, 2 * np.pi / len(values[valuefieldname]))))] plt.offline.plot(data, filename=output, auto_open=False) + + return {self.OUTPUT: output} diff --git a/python/plugins/processing/algs/qgis/QGISAlgorithmProvider.py b/python/plugins/processing/algs/qgis/QGISAlgorithmProvider.py index 0f2621d936b..8e062e8f664 100644 --- a/python/plugins/processing/algs/qgis/QGISAlgorithmProvider.py +++ b/python/plugins/processing/algs/qgis/QGISAlgorithmProvider.py @@ -323,20 +323,23 @@ class QGISAlgorithmProvider(QgsProcessingProvider): ] if hasPlotly: - # from .VectorLayerHistogram import VectorLayerHistogram - # from .RasterLayerHistogram import RasterLayerHistogram - # from .VectorLayerScatterplot import VectorLayerScatterplot - # from .MeanAndStdDevPlot import MeanAndStdDevPlot from .BarPlot import BarPlot - # from .PolarPlot import PolarPlot - # from .BoxPlot import BoxPlot - # from .VectorLayerScatterplot3D import VectorLayerScatterplot3D - # - algs.extend([BarPlot()]) - #[VectorLayerHistogram(), RasterLayerHistogram(), - # VectorLayerScatterplot(), MeanAndStdDevPlot(), - # BarPlot(), PolarPlot(), BoxPlot(), - # VectorLayerScatterplot3D()]) + from .BoxPlot import BoxPlot + from .MeanAndStdDevPlot import MeanAndStdDevPlot + from .PolarPlot import PolarPlot + from .RasterLayerHistogram import RasterLayerHistogram + from .VectorLayerHistogram import VectorLayerHistogram + from .VectorLayerScatterplot import VectorLayerScatterplot + from .VectorLayerScatterplot3D import VectorLayerScatterplot3D + + algs.extend([BarPlot(), + BoxPlot(), + MeanAndStdDevPlot(), + PolarPlot(), + RasterLayerHistogram(), + VectorLayerHistogram(), + VectorLayerScatterplot(), + VectorLayerScatterplot3D()]) # to store algs added by 3rd party plugins as scripts folder = os.path.join(os.path.dirname(__file__), 'scripts') diff --git a/python/plugins/processing/algs/qgis/RasterLayerHistogram.py b/python/plugins/processing/algs/qgis/RasterLayerHistogram.py index bd2da55208f..02488cc6361 100644 --- a/python/plugins/processing/algs/qgis/RasterLayerHistogram.py +++ b/python/plugins/processing/algs/qgis/RasterLayerHistogram.py @@ -28,12 +28,12 @@ __revision__ = '$Format:%H$' import plotly as plt import plotly.graph_objs as go -from qgis.core import (QgsApplication, - QgsProcessingUtils) +from qgis.core import (QgsProcessingParameterRasterLayer, + QgsProcessingParameterBand, + QgsProcessingParameterNumber, + QgsProcessingParameterFileDestination, + QgsProcessingOutputHtml) from processing.algs.qgis.QgisAlgorithm import QgisAlgorithm -from processing.core.parameters import ParameterNumber -from processing.core.parameters import ParameterRaster -from processing.core.outputs import OutputHTML from processing.tools import raster @@ -41,7 +41,8 @@ class RasterLayerHistogram(QgisAlgorithm): INPUT = 'INPUT' BINS = 'BINS' - PLOT = 'PLOT' + OUTPUT = 'OUTPUT' + BAND = 'BAND' def group(self): return self.tr('Graphics') @@ -50,12 +51,17 @@ class RasterLayerHistogram(QgisAlgorithm): super().__init__() def initAlgorithm(self, config=None): - self.addParameter(ParameterRaster(self.INPUT, - self.tr('Input layer'))) - self.addParameter(ParameterNumber(self.BINS, - self.tr('Number of bins'), 2, None, 10)) + self.addParameter(QgsProcessingParameterRasterLayer(self.INPUT, + self.tr('Input layer'))) + self.addParameter(QgsProcessingParameterBand(self.BAND, + self.tr('Band number'), + 1, + self.INPUT)) + self.addParameter(QgsProcessingParameterNumber(self.BINS, + self.tr('number of bins'), minValue=2, defaultValue=10)) - self.addOutput(OutputHTML(self.PLOT, self.tr('Histogram'))) + self.addParameter(QgsProcessingParameterFileDestination(self.OUTPUT, self.tr('Histogram'), self.tr('HTML files (*.html)'))) + self.addOutput(QgsProcessingOutputHtml(self.OUTPUT, self.tr('Histogram'))) def name(self): return 'rasterlayerhistogram' @@ -64,13 +70,14 @@ class RasterLayerHistogram(QgisAlgorithm): return self.tr('Raster layer histogram') def processAlgorithm(self, parameters, context, feedback): - layer = QgsProcessingUtils.mapLayerFromString(self.getParameterValue(self.INPUT), context) - nbins = self.getParameterValue(self.BINS) + layer = self.parameterAsRasterLayer(parameters, self.INPUT, context) + band = self.parameterAsInt(parameters, self.BAND, context) + nbins = self.parameterAsInt(parameters, self.BINS, context) - output = self.getOutputValue(self.PLOT) + output = self.parameterAsFileOutput(parameters, self.OUTPUT, context) # ALERT: this is potentially blocking if the layer is too big - values = raster.scanraster(layer, feedback) + values = raster.scanraster(layer, feedback, band) valueslist = [] for v in values: @@ -80,3 +87,5 @@ class RasterLayerHistogram(QgisAlgorithm): data = [go.Histogram(x=valueslist, nbinsx=nbins)] plt.offline.plot(data, filename=output, auto_open=False) + + return {self.OUTPUT: output} diff --git a/python/plugins/processing/algs/qgis/VectorLayerHistogram.py b/python/plugins/processing/algs/qgis/VectorLayerHistogram.py index 5d8f1c3da63..ce0137baa56 100644 --- a/python/plugins/processing/algs/qgis/VectorLayerHistogram.py +++ b/python/plugins/processing/algs/qgis/VectorLayerHistogram.py @@ -28,14 +28,12 @@ __revision__ = '$Format:%H$' import plotly as plt import plotly.graph_objs as go -from qgis.core import (QgsApplication, - QgsFeatureSink, - QgsProcessingUtils) +from qgis.core import (QgsProcessingParameterFeatureSource, + QgsProcessingParameterField, + QgsProcessingParameterNumber, + QgsProcessingParameterFileDestination, + QgsProcessingOutputHtml) from processing.algs.qgis.QgisAlgorithm import QgisAlgorithm -from processing.core.parameters import ParameterVector -from processing.core.parameters import ParameterTableField -from processing.core.parameters import ParameterNumber -from processing.core.outputs import OutputHTML from processing.tools import vector @@ -53,15 +51,16 @@ class VectorLayerHistogram(QgisAlgorithm): super().__init__() def initAlgorithm(self, config=None): - self.addParameter(ParameterVector(self.INPUT, - self.tr('Input layer'))) - self.addParameter(ParameterTableField(self.FIELD, - self.tr('Attribute'), self.INPUT, - ParameterTableField.DATA_TYPE_NUMBER)) - self.addParameter(ParameterNumber(self.BINS, - self.tr('number of bins'), 2, None, 10)) + self.addParameter(QgsProcessingParameterFeatureSource(self.INPUT, + self.tr('Input layer'))) + self.addParameter(QgsProcessingParameterField(self.FIELD, + self.tr('Attribute'), parentLayerParameterName=self.INPUT, + type=QgsProcessingParameterField.Numeric)) + self.addParameter(QgsProcessingParameterNumber(self.BINS, + self.tr('number of bins'), minValue=2, defaultValue=10)) - self.addOutput(OutputHTML(self.OUTPUT, self.tr('Histogram'))) + self.addParameter(QgsProcessingParameterFileDestination(self.OUTPUT, self.tr('Histogram'), self.tr('HTML files (*.html)'))) + self.addOutput(QgsProcessingOutputHtml(self.OUTPUT, self.tr('Histogram'))) def name(self): return 'vectorlayerhistogram' @@ -70,14 +69,16 @@ class VectorLayerHistogram(QgisAlgorithm): return self.tr('Vector layer histogram') def processAlgorithm(self, parameters, context, feedback): - layer = QgsProcessingUtils.mapLayerFromString(self.getParameterValue(self.INPUT), context) - fieldname = self.getParameterValue(self.FIELD) - bins = self.getParameterValue(self.BINS) + source = self.parameterAsSource(parameters, self.INPUT, context) + fieldname = self.parameterAsString(parameters, self.FIELD, context) + bins = self.parameterAsInt(parameters, self.BINS, context) - output = self.getOutputValue(self.OUTPUT) + output = self.parameterAsFileOutput(parameters, self.OUTPUT, context) - values = vector.values(layer, fieldname) + values = vector.values(source, fieldname) data = [go.Histogram(x=values[fieldname], nbinsx=bins)] plt.offline.plot(data, filename=output, auto_open=False) + + return {self.OUTPUT: output} diff --git a/python/plugins/processing/algs/qgis/VectorLayerScatterplot.py b/python/plugins/processing/algs/qgis/VectorLayerScatterplot.py index 62a16e12038..b89a6226141 100644 --- a/python/plugins/processing/algs/qgis/VectorLayerScatterplot.py +++ b/python/plugins/processing/algs/qgis/VectorLayerScatterplot.py @@ -28,14 +28,12 @@ __revision__ = '$Format:%H$' import plotly as plt import plotly.graph_objs as go -from qgis.core import (QgsApplication, - QgsFeatureSink, - QgsProcessingUtils) +from qgis.core import (QgsProcessingParameterFeatureSource, + QgsProcessingParameterField, + QgsProcessingUtils, + QgsProcessingParameterFileDestination, + QgsProcessingOutputHtml) from processing.algs.qgis.QgisAlgorithm import QgisAlgorithm -from processing.core.parameters import ParameterVector -from processing.core.parameters import ParameterTableField -from processing.core.outputs import OutputHTML - from processing.tools import vector @@ -53,18 +51,19 @@ class VectorLayerScatterplot(QgisAlgorithm): super().__init__() def initAlgorithm(self, config=None): - self.addParameter(ParameterVector(self.INPUT, - self.tr('Input layer'))) - self.addParameter(ParameterTableField(self.XFIELD, - self.tr('X attribute'), - self.INPUT, - ParameterTableField.DATA_TYPE_NUMBER)) - self.addParameter(ParameterTableField(self.YFIELD, - self.tr('Y attribute'), - self.INPUT, - ParameterTableField.DATA_TYPE_NUMBER)) + self.addParameter(QgsProcessingParameterFeatureSource(self.INPUT, + self.tr('Input layer'))) + self.addParameter(QgsProcessingParameterField(self.XFIELD, + self.tr('X attribute'), + parentLayerParameterName=self.INPUT, + type=QgsProcessingParameterField.Numeric)) + self.addParameter(QgsProcessingParameterField(self.YFIELD, + self.tr('Y attribute'), + parentLayerParameterName=self.INPUT, + type=QgsProcessingParameterField.Numeric)) - self.addOutput(OutputHTML(self.OUTPUT, self.tr('Scatterplot'))) + self.addParameter(QgsProcessingParameterFileDestination(self.OUTPUT, self.tr('Scatterplot'), self.tr('HTML files (*.html)'))) + self.addOutput(QgsProcessingOutputHtml(self.OUTPUT, self.tr('Scatterplot'))) def name(self): return 'vectorlayerscatterplot' @@ -73,14 +72,16 @@ class VectorLayerScatterplot(QgisAlgorithm): return self.tr('Vector layer scatterplot') def processAlgorithm(self, parameters, context, feedback): - layer = QgsProcessingUtils.mapLayerFromString(self.getParameterValue(self.INPUT), context) - xfieldname = self.getParameterValue(self.XFIELD) - yfieldname = self.getParameterValue(self.YFIELD) + source = self.parameterAsSource(parameters, self.INPUT, context) + xfieldname = self.parameterAsString(parameters, self.XFIELD, context) + yfieldname = self.parameterAsString(parameters, self.YFIELD, context) - output = self.getOutputValue(self.OUTPUT) + output = self.parameterAsFileOutput(parameters, self.OUTPUT, context) - values = vector.values(layer, xfieldname, yfieldname) + values = vector.values(source, xfieldname, yfieldname) data = [go.Scatter(x=values[xfieldname], y=values[yfieldname], mode='markers')] plt.offline.plot(data, filename=output, auto_open=False) + + return {self.OUTPUT: output} diff --git a/python/plugins/processing/algs/qgis/VectorLayerScatterplot3D.py b/python/plugins/processing/algs/qgis/VectorLayerScatterplot3D.py index 97720c98f02..da5b27631c7 100644 --- a/python/plugins/processing/algs/qgis/VectorLayerScatterplot3D.py +++ b/python/plugins/processing/algs/qgis/VectorLayerScatterplot3D.py @@ -28,13 +28,12 @@ __revision__ = '$Format:%H$' import plotly as plt import plotly.graph_objs as go -from qgis.core import (QgsApplication, - QgsFeatureSink, +from qgis.core import (QgsProcessingParameterFeatureSource, + QgsProcessingParameterField, + QgsProcessingParameterFileDestination, + QgsProcessingOutputHtml, QgsProcessingUtils) from processing.algs.qgis.QgisAlgorithm import QgisAlgorithm -from processing.core.parameters import ParameterVector -from processing.core.parameters import ParameterTableField -from processing.core.outputs import OutputHTML from processing.tools import vector @@ -54,22 +53,23 @@ class VectorLayerScatterplot3D(QgisAlgorithm): super().__init__() def initAlgorithm(self, config=None): - self.addParameter(ParameterVector(self.INPUT, - self.tr('Input layer'))) - self.addParameter(ParameterTableField(self.XFIELD, - self.tr('X attribute'), - self.INPUT, - ParameterTableField.DATA_TYPE_NUMBER)) - self.addParameter(ParameterTableField(self.YFIELD, - self.tr('Y attribute'), - self.INPUT, - ParameterTableField.DATA_TYPE_NUMBER)) - self.addParameter(ParameterTableField(self.ZFIELD, - self.tr('Z attribute'), - self.INPUT, - ParameterTableField.DATA_TYPE_NUMBER)) + self.addParameter(QgsProcessingParameterFeatureSource(self.INPUT, + self.tr('Input layer'))) + self.addParameter(QgsProcessingParameterField(self.XFIELD, + self.tr('X attribute'), + parentLayerParameterName=self.INPUT, + type=QgsProcessingParameterField.Numeric)) + self.addParameter(QgsProcessingParameterField(self.YFIELD, + self.tr('Y attribute'), + parentLayerParameterName=self.INPUT, + type=QgsProcessingParameterField.Numeric)) + self.addParameter(QgsProcessingParameterField(self.ZFIELD, + self.tr('Z attribute'), + parentLayerParameterName=self.INPUT, + type=QgsProcessingParameterField.Numeric)) - self.addOutput(OutputHTML(self.OUTPUT, self.tr('Scatterplot 3D'))) + self.addParameter(QgsProcessingParameterFileDestination(self.OUTPUT, self.tr('Histogram'), self.tr('HTML files (*.html)'))) + self.addOutput(QgsProcessingOutputHtml(self.OUTPUT, self.tr('Histogram'))) def name(self): return 'scatter3dplot' @@ -78,15 +78,14 @@ class VectorLayerScatterplot3D(QgisAlgorithm): return self.tr('Vector layer scatterplot 3D') def processAlgorithm(self, parameters, context, feedback): + source = self.parameterAsSource(parameters, self.INPUT, context) + xfieldname = self.parameterAsString(parameters, self.XFIELD, context) + yfieldname = self.parameterAsString(parameters, self.YFIELD, context) + zfieldname = self.parameterAsString(parameters, self.ZFIELD, context) - layer = QgsProcessingUtils.mapLayerFromString(self.getParameterValue(self.INPUT), context) - xfieldname = self.getParameterValue(self.XFIELD) - yfieldname = self.getParameterValue(self.YFIELD) - zfieldname = self.getParameterValue(self.ZFIELD) + output = self.parameterAsFileOutput(parameters, self.OUTPUT, context) - output = self.getOutputValue(self.OUTPUT) - - values = vector.values(layer, xfieldname, yfieldname, zfieldname) + values = vector.values(source, xfieldname, yfieldname, zfieldname) data = [go.Scatter3d( x=values[xfieldname], @@ -95,3 +94,5 @@ class VectorLayerScatterplot3D(QgisAlgorithm): mode='markers')] plt.offline.plot(data, filename=output, auto_open=False) + + return {self.OUTPUT: output} diff --git a/python/plugins/processing/tools/raster.py b/python/plugins/processing/tools/raster.py index 0ddc9db02ec..8cc8889ab58 100644 --- a/python/plugins/processing/tools/raster.py +++ b/python/plugins/processing/tools/raster.py @@ -38,10 +38,10 @@ from osgeo import gdal from qgis.core import QgsProcessingException -def scanraster(layer, feedback): +def scanraster(layer, feedback, band_number=1): filename = str(layer.source()) dataset = gdal.Open(filename, gdal.GA_ReadOnly) - band = dataset.GetRasterBand(1) + band = dataset.GetRasterBand(band_number) nodata = band.GetNoDataValue() bandtype = gdal.GetDataTypeName(band.DataType) for y in range(band.YSize): diff --git a/tests/testdata/landsat-int16-b1.tif.aux.xml b/tests/testdata/landsat-int16-b1.tif.aux.xml deleted file mode 100644 index 9aac780357f..00000000000 --- a/tests/testdata/landsat-int16-b1.tif.aux.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - 121.5555555555556 - 130.4444444444445 - 9 - 0 - 0 - 22|377|2878|10013|13500|9834|2936|409|31 - - - - 130 - 126.001725 - 122 - 1.1294343825018 - - -