mirror of
https://github.com/qgis/QGIS.git
synced 2025-02-22 00:06:12 -05:00
Port remaining plotly based algs to new API
This commit is contained in:
parent
9464ab75e6
commit
184899ec30
1
.gitignore
vendored
1
.gitignore
vendored
@ -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
|
||||
|
@ -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')))
|
||||
|
||||
|
@ -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}
|
||||
|
@ -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}
|
||||
|
@ -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}
|
||||
|
@ -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')
|
||||
|
@ -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}
|
||||
|
@ -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}
|
||||
|
@ -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}
|
||||
|
@ -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}
|
||||
|
@ -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):
|
||||
|
20
tests/testdata/landsat-int16-b1.tif.aux.xml
vendored
20
tests/testdata/landsat-int16-b1.tif.aux.xml
vendored
@ -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>
|
Loading…
x
Reference in New Issue
Block a user