Port remaining plotly based algs to new API

This commit is contained in:
Nyall Dawson 2017-08-30 07:28:25 +10:00
parent 9464ab75e6
commit 184899ec30
12 changed files with 188 additions and 187 deletions

1
.gitignore vendored
View File

@ -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

View File

@ -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')))

View File

@ -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}

View File

@ -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}

View File

@ -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}

View File

@ -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')

View File

@ -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}

View File

@ -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}

View File

@ -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}

View File

@ -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}

View File

@ -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):

View File

@ -1,20 +0,0 @@
<PAMDataset>
<PAMRasterBand band="1">
<Histograms>
<HistItem>
<HistMin>121.5555555555556</HistMin>
<HistMax>130.4444444444445</HistMax>
<BucketCount>9</BucketCount>
<IncludeOutOfRange>0</IncludeOutOfRange>
<Approximate>0</Approximate>
<HistCounts>22|377|2878|10013|13500|9834|2936|409|31</HistCounts>
</HistItem>
</Histograms>
<Metadata>
<MDI key="STATISTICS_MAXIMUM">130</MDI>
<MDI key="STATISTICS_MEAN">126.001725</MDI>
<MDI key="STATISTICS_MINIMUM">122</MDI>
<MDI key="STATISTICS_STDDEV">1.1294343825018</MDI>
</Metadata>
</PAMRasterBand>
</PAMDataset>