Skip to content

Commit fdd1751

Browse files
committed
[processing] enable algs that require 3rd party Python modules when
possible
1 parent 737c9cc commit fdd1751

8 files changed

+178
-126
lines changed

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

+21-16
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,16 @@
2828
import matplotlib.pyplot as plt
2929
import matplotlib.pylab as lab
3030
import numpy as np
31+
3132
from PyQt4.QtCore import *
3233
from qgis.core import *
34+
3335
from processing.core.parameters import ParameterTable
3436
from processing.core.parameters import ParameterTableField
3537
from processing.core.GeoAlgorithm import GeoAlgorithm
3638
from processing.core.outputs import OutputHTML
37-
from processing.tools import *
39+
from processing.tools import vector
40+
from processing.tools import dataobjects
3841

3942

4043
class BarPlot(GeoAlgorithm):
@@ -44,33 +47,35 @@ class BarPlot(GeoAlgorithm):
4447
NAME_FIELD = 'NAME_FIELD'
4548
VALUE_FIELD = 'VALUE_FIELD'
4649

50+
def defineCharacteristics(self):
51+
self.name = 'Bar plot'
52+
self.group = 'Graphics'
53+
54+
self.addParameter(ParameterTable(self.INPUT, self.tr('Input table')))
55+
self.addParameter(ParameterTableField(self.NAME_FIELD,
56+
self.tr('Category name field'), self.INPUT))
57+
self.addParameter(ParameterTableField(self.VALUE_FIELD,
58+
self.tr('Value field'), self.INPUT))
59+
60+
self.addOutput(OutputHTML(self.OUTPUT, self.tr('Output')))
61+
4762
def processAlgorithm(self, progress):
48-
uri = self.getParameterValue(self.INPUT)
49-
layer = getObjectFromUri(uri)
63+
layer = dataobjects.getObjectFromUri(
64+
self.getParameterValue(self.INPUT))
5065
namefieldname = self.getParameterValue(self.NAME_FIELD)
5166
valuefieldname = self.getParameterValue(self.VALUE_FIELD)
67+
5268
output = self.getOutputValue(self.OUTPUT)
53-
values = vector.getAttributeValues(layer, namefieldname,
54-
valuefieldname)
69+
70+
values = vector.values(layer, namefieldname, valuefieldname)
5571
plt.close()
5672

5773
ind = np.arange(len(values[namefieldname]))
5874
width = 0.8
5975
plt.bar(ind, values[valuefieldname], width, color='r')
60-
6176
plt.xticks(ind, values[namefieldname], rotation=45)
6277
plotFilename = output + '.png'
6378
lab.savefig(plotFilename)
6479
f = open(output, 'w')
6580
f.write('<img src="' + plotFilename + '"/>')
6681
f.close()
67-
68-
def defineCharacteristics(self):
69-
self.name = 'Bar plot'
70-
self.group = 'Graphics'
71-
self.addParameter(ParameterTable(self.INPUT, self.tr('Input table')))
72-
self.addParameter(ParameterTableField(self.NAME_FIELD,
73-
self.tr('Category name field'), self.INPUT))
74-
self.addParameter(ParameterTableField(self.VALUE_FIELD,
75-
self.tr('Value field'), self.INPUT))
76-
self.addOutput(OutputHTML(self.OUTPUT, self.tr('Output')))

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

+19-13
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,12 @@
2727

2828
from PyQt4.QtCore import *
2929
from qgis.core import *
30-
from processing.tools.raster import RasterWriter
30+
3131
from processing.core.GeoAlgorithm import GeoAlgorithm
3232
from processing.core.parameters import ParameterRaster
3333
from processing.core.parameters import ParameterNumber
3434
from processing.core.outputs import OutputRaster
35+
from processing.tools.raster import RasterWriter
3536
from processing.tools import dataobjects
3637

3738

@@ -41,13 +42,28 @@ class CreateConstantRaster(GeoAlgorithm):
4142
OUTPUT = 'OUTPUT'
4243
NUMBER = 'NUMBER'
4344

45+
def defineCharacteristics(self):
46+
self.name = 'Create constant raster layer'
47+
self.group = 'Raster tools'
48+
49+
self.addParameter(ParameterRaster(self.INPUT,
50+
self.tr('Reference layer')))
51+
self.addParameter(ParameterNumber(self.NUMBER,
52+
self.tr('Constant value'), default=1.0))
53+
54+
self.addOutput(OutputRaster(self.OUTPUT,
55+
self.tr('Output layer')))
56+
4457
def processAlgorithm(self, progress):
45-
output = self.getOutputFromName(self.OUTPUT)
46-
value = self.getOutputValue(self.NUMBER)
4758
layer = dataobjects.getObjectFromUri(
4859
self.getParameterValue(self.INPUT))
60+
value = self.getOutputValue(self.NUMBER)
61+
62+
output = self.getOutputFromName(self.OUTPUT)
63+
4964
cellsize = (layer.extent().xMaximum() - layer.extent().xMinimum()) \
5065
/ layer.width()
66+
5167
w = RasterWriter(output.getCompatibleFileName(self),
5268
layer.extent().xMinimum(),
5369
layer.extent().yMinimum(),
@@ -59,13 +75,3 @@ def processAlgorithm(self, progress):
5975
)
6076
w.matrix[:] = value
6177
w.close()
62-
63-
def defineCharacteristics(self):
64-
self.name = 'Create constant raster layer'
65-
self.group = 'Raster tools'
66-
self.addParameter(ParameterRaster(self.INPUT,
67-
self.tr('Reference layer')))
68-
self.addParameter(ParameterNumber(self.NUMBER,
69-
self.tr('Constant value'), default=1.0))
70-
self.addOutput(OutputRaster(self.OUTPUT,
71-
self.tr('Output layer')))

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

+25-20
Original file line numberDiff line numberDiff line change
@@ -28,14 +28,17 @@
2828
import matplotlib.pyplot as plt
2929
import matplotlib.pylab as lab
3030
import numpy as np
31+
3132
from PyQt4.QtCore import *
3233
from qgis.core import *
3334

3435
from processing.core.GeoAlgorithm import GeoAlgorithm
3536
from processing.core.parameters import ParameterTable
3637
from processing.core.parameters import ParameterTableField
3738
from processing.core.outputs import OutputHTML
38-
from processing.tools import *
39+
40+
from processing.tools import vector
41+
from processing.tools import dataobjects
3942

4043

4144
class MeanAndStdDevPlot(GeoAlgorithm):
@@ -46,17 +49,33 @@ class MeanAndStdDevPlot(GeoAlgorithm):
4649
MEAN_FIELD = 'MEAN_FIELD'
4750
STDDEV_FIELD = 'STDDEV_FIELD'
4851

52+
def defineCharacteristics(self):
53+
self.name = 'Mean and standard deviation plot'
54+
self.group = 'Graphics'
55+
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.MEAN_FIELD,
62+
self.tr('Mean field'), self.INPUT))
63+
self.addParameter(ParameterTableField(self.STDDEV_FIELD,
64+
self.tr('StdDev field'), self.INPUT))
65+
66+
self.addOutput(OutputHTML(self.OUTPUT, self.tr('Output')))
67+
4968
def processAlgorithm(self, progress):
50-
uri = self.getParameterValue(self.INPUT)
51-
layer = dataobjects.getObjectFromUri(uri)
69+
layer = dataobjects.getObjectFromUri(
70+
self.getParameterValue(self.INPUT))
5271
namefieldname = self.getParameterValue(self.NAME_FIELD)
5372
meanfieldname = self.getParameterValue(self.MEAN_FIELD)
5473
stddevfieldname = self.getParameterValue(self.STDDEV_FIELD)
74+
5575
output = self.getOutputValue(self.OUTPUT)
56-
values = vector.getAttributeValues(layer, namefieldname,
57-
meanfieldname, stddevfieldname)
58-
plt.close()
5976

77+
values = vector.values(layer, namefieldname, meanfieldname, stddevfieldname)
78+
plt.close()
6079
ind = np.arange(len(values[namefieldname]))
6180
width = 0.8
6281
plt.bar(ind, values[meanfieldname], width, color='r',
@@ -70,17 +89,3 @@ def processAlgorithm(self, progress):
7089
f = open(output, 'w')
7190
f.write('<img src="' + plotFilename + '"/>')
7291
f.close()
73-
74-
def defineCharacteristics(self):
75-
self.name = 'Mean and standard deviation plot'
76-
self.group = 'Graphics'
77-
self.addParameter(ParameterTable(self.INPUT,
78-
self.tr('Input table')))
79-
self.addParameter(ParameterTableField(self.NAME_FIELD,
80-
self.tr('Category name field'), self.INPUT,
81-
ParameterTableField.DATA_TYPE_ANY))
82-
self.addParameter(ParameterTableField(self.MEAN_FIELD,
83-
self.tr('Mean field'), self.INPUT))
84-
self.addParameter(ParameterTableField(self.STDDEV_FIELD,
85-
self.tr('StdDev field'), self.INPUT))
86-
self.addOutput(OutputHTML(self.OUTPUT, self.tr('Output')))

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

+22-17
Original file line numberDiff line numberDiff line change
@@ -30,13 +30,16 @@
3030
import matplotlib.cm as cm
3131
from matplotlib.pyplot import figure, show, rc
3232
import numpy as np
33+
3334
from PyQt4.QtCore import *
3435
from qgis.core import *
36+
3537
from processing.core.GeoAlgorithm import GeoAlgorithm
3638
from processing.core.parameters import ParameterTable
3739
from processing.core.parameters import ParameterTableField
3840
from processing.core.outputs import OutputHTML
39-
from processing.tools import *
41+
from processing.tools import vector
42+
from processing.tools import dataobjects
4043

4144

4245
class PolarPlot(GeoAlgorithm):
@@ -46,16 +49,29 @@ class PolarPlot(GeoAlgorithm):
4649
NAME_FIELD = 'NAME_FIELD'
4750
VALUE_FIELD = 'VALUE_FIELD'
4851

52+
def defineCharacteristics(self):
53+
self.name = 'Polar plot'
54+
self.group = 'Graphics'
55+
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+
self.addParameter(ParameterTableField(self.VALUE_FIELD,
61+
self.tr('Value field'), self.INPUT))
62+
63+
self.addOutput(OutputHTML(self.OUTPUT, self.tr('Output')))
64+
4965
def processAlgorithm(self, progress):
50-
uri = self.getParameterValue(self.INPUT)
51-
layer = getObjectFromUri(uri)
66+
layer = dataobjects.getObjectFromUri(
67+
self.getParameterValue(self.INPUT))
5268
namefieldname = self.getParameterValue(self.NAME_FIELD)
5369
valuefieldname = self.getParameterValue(self.VALUE_FIELD)
70+
5471
output = self.getOutputValue(self.OUTPUT)
55-
values = vector.getAttributeValues(layer, namefieldname,
56-
valuefieldname)
57-
plt.close()
5872

73+
values = vector.values(layer, namefieldname, valuefieldname)
74+
plt.close()
5975
fig = figure(figsize=(8, 8))
6076
ax = fig.add_axes([0.1, 0.1, 0.8, 0.8], polar=True)
6177
N = len(values[valuefieldname])
@@ -68,14 +84,3 @@ def processAlgorithm(self, progress):
6884
f = open(output, 'w')
6985
f.write('<img src="' + plotFilename + '"/>')
7086
f.close()
71-
72-
def defineCharacteristics(self):
73-
self.name = 'Polar plot'
74-
self.group = 'Graphics'
75-
self.addParameter(ParameterTable(self.INPUT,
76-
self.tr('Input table')))
77-
self.addParameter(ParameterTableField(self.NAME_FIELD,
78-
self.tr('Category name field'), self.INPUT))
79-
self.addParameter(ParameterTableField(self.VALUE_FIELD,
80-
self.tr('Value field'), self.INPUT))
81-
self.addOutput(OutputHTML(self.OUTPUT, self.tr('Output')))

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

+20-13
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,12 @@
2727

2828
import os
2929

30+
try:
31+
import matplotlib.pyplot
32+
hasMatplotlib = True
33+
except:
34+
hasMatplotlib = False
35+
3036
from PyQt4.QtGui import *
3137

3238
from processing.core.AlgorithmProvider import AlgorithmProvider
@@ -119,12 +125,6 @@
119125
from SelectByExpression import SelectByExpression
120126
from HypsometricCurves import HypsometricCurves
121127
from SplitLinesWithLines import SplitLinesWithLines
122-
# from VectorLayerHistogram import VectorLayerHistogram
123-
# from VectorLayerScatterplot import VectorLayerScatterplot
124-
# from MeanAndStdDevPlot import MeanAndStdDevPlot
125-
# from BarPlot import BarPlot
126-
# from PolarPlot import PolarPlot
127-
# from RasterLayerHistogram import RasterLayerHistogram
128128

129129
import processing.resources_rc
130130

@@ -170,15 +170,22 @@ def __init__(self):
170170
PostGISExecuteSQL(), ImportIntoPostGIS(),
171171
SetVectorStyle(), SetRasterStyle(),
172172
SelectByExpression(), HypsometricCurves(),
173-
SplitLinesWithLines()
174-
# ------ raster ------
175-
# CreateConstantRaster(),
176-
# ------ graphics ------
177-
# VectorLayerHistogram(), VectorLayerScatterplot(),
178-
# RasterLayerHistogram(), MeanAndStdDevPlot(),
179-
# BarPlot(), PolarPlot()
173+
SplitLinesWithLines(), CreateConstantRaster(),
180174
]
181175

176+
if hasMatplotlib:
177+
from VectorLayerHistogram import VectorLayerHistogram
178+
from RasterLayerHistogram import RasterLayerHistogram
179+
from VectorLayerScatterplot import VectorLayerScatterplot
180+
from MeanAndStdDevPlot import MeanAndStdDevPlot
181+
from BarPlot import BarPlot
182+
from PolarPlot import PolarPlot
183+
184+
self.alglist.extend([VectorLayerHistogram(), RasterLayerHistogram(),
185+
VectorLayerScatterplot(), MeanAndStdDevPlot(), BarPlot(),
186+
PolarPlot(),
187+
])
188+
182189
folder = os.path.join(os.path.dirname(__file__), 'scripts')
183190
scripts = ScriptUtils.loadFromFolder(folder)
184191
for script in scripts:

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

+22-13
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,10 @@
2727

2828
import matplotlib.pyplot as plt
2929
import matplotlib.pylab as lab
30+
3031
from PyQt4.QtCore import *
3132
from qgis.core import *
33+
3234
from processing.core.GeoAlgorithm import GeoAlgorithm
3335
from processing.core.parameters import ParameterNumber
3436
from processing.core.parameters import ParameterRaster
@@ -45,13 +47,28 @@ class RasterLayerHistogram(GeoAlgorithm):
4547
TABLE = 'TABLE'
4648
BINS = 'BINS'
4749

50+
def defineCharacteristics(self):
51+
self.name = 'Raster layer histogram'
52+
self.group = 'Graphics'
53+
54+
self.addParameter(ParameterRaster(self.INPUT,
55+
self.tr('Input layer')))
56+
self.addParameter(ParameterNumber(self.BINS,
57+
self.tr('Number of bins'), 2, None, 10))
58+
59+
self.addOutput(OutputHTML(self.PLOT, self.tr('Output plot')))
60+
self.addOutput(OutputTable(self.TABLE, self.tr('Output table')))
61+
62+
4863
def processAlgorithm(self, progress):
49-
uri = self.getParameterValue(self.INPUT)
50-
layer = dataobjects.getObjectFromUri(uri)
64+
layer = dataobjects.getObjectFromUri(
65+
self.getParameterValue(self.INPUT))
66+
nbins = self.getParameterValue(self.BINS)
67+
5168
outputplot = self.getOutputValue(self.PLOT)
5269
outputtable = self.getOutputFromName(self.TABLE)
70+
5371
values = raster.scanraster(layer, progress)
54-
nbins = self.getParameterValue(self.BINS)
5572

5673
# ALERT: this is potentially blocking if the layer is too big
5774
plt.close()
@@ -60,23 +77,15 @@ def processAlgorithm(self, progress):
6077
if v is not None:
6178
valueslist.append(v)
6279
(n, bins, values) = plt.hist(valueslist, nbins)
80+
6381
fields = [QgsField('CENTER_VALUE', QVariant.Double),
6482
QgsField('NUM_ELEM', QVariant.Double)]
6583
writer = outputtable.getTableWriter(fields)
6684
for i in xrange(len(values)):
6785
writer.addRecord([str(bins[i]) + '-' + str(bins[i + 1]), n[i]])
86+
6887
plotFilename = outputplot + '.png'
6988
lab.savefig(plotFilename)
7089
f = open(outputplot, 'w')
7190
f.write('<img src="' + plotFilename + '"/>')
7291
f.close()
73-
74-
def defineCharacteristics(self):
75-
self.name = 'Raster layer histogram'
76-
self.group = 'Graphics'
77-
self.addParameter(ParameterRaster(self.INPUT,
78-
self.tr('Input layer')))
79-
self.addParameter(ParameterNumber(self.BINS,
80-
self.tr('Number of bins'), 2, None, 10))
81-
self.addOutput(OutputHTML(self.PLOT, self.tr('Output plot')))
82-
self.addOutput(OutputTable(self.TABLE, self.tr('Output table')))

0 commit comments

Comments
 (0)