Skip to content

Commit f9680dd

Browse files
committed
[processing] use custom options widget in GDAL algorithms
1 parent 60cb517 commit f9680dd

File tree

13 files changed

+235
-433
lines changed

13 files changed

+235
-433
lines changed
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
11
FILE(GLOB PY_FILES *.py)
22

3+
ADD_SUBDIRECTORY(ui)
4+
35
PLUGIN_INSTALL(processing ./algs/gdal ${PY_FILES})

python/plugins/processing/algs/gdal/ClipByExtent.py

Lines changed: 22 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -32,13 +32,11 @@
3232

3333
from processing.algs.gdal.GdalAlgorithm import GdalAlgorithm
3434

35-
from processing.core.parameters import ParameterRaster
36-
from processing.core.parameters import ParameterExtent
37-
from processing.core.parameters import ParameterString
35+
from processing.core.parameters import (ParameterRaster,
36+
ParameterExtent,
37+
ParameterString,
38+
ParameterSelection)
3839
from processing.core.outputs import OutputRaster
39-
from processing.core.parameters import ParameterSelection
40-
from processing.core.parameters import ParameterNumber
41-
from processing.core.parameters import ParameterBoolean
4240

4341
from processing.algs.gdal.GdalUtils import GdalUtils
4442

@@ -51,77 +49,41 @@ class ClipByExtent(GdalAlgorithm):
5149
OUTPUT = 'OUTPUT'
5250
NO_DATA = 'NO_DATA'
5351
PROJWIN = 'PROJWIN'
54-
EXTRA = 'EXTRA'
52+
OPTIONS = 'OPTIONS'
5553
RTYPE = 'RTYPE'
5654
TYPE = ['Byte', 'Int16', 'UInt16', 'UInt32', 'Int32', 'Float32', 'Float64']
57-
TILED = 'TILED'
58-
COMPRESS = 'COMPRESS'
59-
JPEGCOMPRESSION = 'JPEGCOMPRESSION'
60-
PREDICTOR = 'PREDICTOR'
61-
ZLEVEL = 'ZLEVEL'
62-
BIGTIFF = 'BIGTIFF'
63-
BIGTIFFTYPE = ['', 'YES', 'NO', 'IF_NEEDED', 'IF_SAFER']
64-
COMPRESSTYPE = ['NONE', 'JPEG', 'LZW', 'PACKBITS', 'DEFLATE']
65-
TFW = 'TFW'
6655

6756
def getIcon(self):
6857
return QIcon(os.path.join(pluginPath, 'images', 'gdaltools', 'raster-clip.png'))
6958

7059
def defineCharacteristics(self):
7160
self.name, self.i18n_name = self.trAlgorithm('Clip raster by extent')
7261
self.group, self.i18n_group = self.trAlgorithm('[GDAL] Extraction')
73-
self.addParameter(ParameterRaster(
74-
self.INPUT, self.tr('Input layer'), False))
62+
63+
self.addParameter(ParameterRaster(self.INPUT, self.tr('Input layer')))
7564
self.addParameter(ParameterString(self.NO_DATA,
7665
self.tr("Nodata value, leave blank to take the nodata value from input"),
77-
'', optional=True))
66+
'',
67+
optional=True))
7868
self.addParameter(ParameterExtent(self.PROJWIN, self.tr('Clipping extent')))
79-
80-
params = []
81-
params.append(ParameterSelection(self.RTYPE,
82-
self.tr('Output raster type'), self.TYPE, 5))
83-
params.append(ParameterSelection(self.COMPRESS,
84-
self.tr('GeoTIFF options. Compression type:'), self.COMPRESSTYPE, 4))
85-
params.append(ParameterNumber(self.JPEGCOMPRESSION,
86-
self.tr('Set the JPEG compression level'),
87-
1, 100, 75))
88-
params.append(ParameterNumber(self.ZLEVEL,
89-
self.tr('Set the DEFLATE compression level'),
90-
1, 9, 6))
91-
params.append(ParameterNumber(self.PREDICTOR,
92-
self.tr('Set the predictor for LZW or DEFLATE compression'),
93-
1, 3, 1))
94-
params.append(ParameterBoolean(self.TILED,
95-
self.tr('Create tiled output (only used for the GTiff format)'), False))
96-
params.append(ParameterSelection(self.BIGTIFF,
97-
self.tr('Control whether the created file is a BigTIFF or a classic TIFF'), self.BIGTIFFTYPE, 0))
98-
params.append(ParameterBoolean(self.TFW,
99-
self.tr('Force the generation of an associated ESRI world file (.tfw))'), False))
100-
params.append(ParameterString(self.EXTRA,
101-
self.tr('Additional creation parameters'), '', optional=True))
102-
103-
for param in params:
104-
param.isAdvanced = True
105-
self.addParameter(param)
69+
self.addParameter(ParameterString(self.OPTIONS,
70+
self.tr('Additional creation options'),
71+
optional=True,
72+
metadata={'widget_wrapper': 'processing.algs.gdal.ui.RasterOptionsWidget.RasterOptionsWidgetWrapper'}))
73+
self.addParameter(ParameterSelection(self.RTYPE,
74+
self.tr('Output raster type'),
75+
self.TYPE, 5))
10676

10777
self.addOutput(OutputRaster(self.OUTPUT, self.tr('Clipped (extent)')))
10878

10979
def getConsoleCommands(self):
11080
out = self.getOutputValue(self.OUTPUT)
11181
noData = self.getParameterValue(self.NO_DATA)
82+
opts = self.getParameterValue(self.OPTIONS)
83+
projwin = self.getParameterValue(self.PROJWIN)
84+
11285
if noData is not None:
11386
noData = str(noData)
114-
projwin = str(self.getParameterValue(self.PROJWIN))
115-
extra = self.getParameterValue(self.EXTRA)
116-
if extra is not None:
117-
extra = str(extra)
118-
jpegcompression = str(self.getParameterValue(self.JPEGCOMPRESSION))
119-
predictor = str(self.getParameterValue(self.PREDICTOR))
120-
zlevel = str(self.getParameterValue(self.ZLEVEL))
121-
tiled = str(self.getParameterValue(self.TILED))
122-
compress = self.COMPRESSTYPE[self.getParameterValue(self.COMPRESS)]
123-
bigtiff = self.BIGTIFFTYPE[self.getParameterValue(self.BIGTIFF)]
124-
tfw = str(self.getParameterValue(self.TFW))
12587

12688
arguments = []
12789
arguments.append('-of')
@@ -139,22 +101,9 @@ def getConsoleCommands(self):
139101
arguments.append(regionCoords[1])
140102
arguments.append(regionCoords[2])
141103

142-
if extra and len(extra) > 0:
143-
arguments.append(extra)
144-
if GdalUtils.getFormatShortNameFromFilename(out) == "GTiff":
145-
arguments.append("-co COMPRESS=" + compress)
146-
if compress == 'JPEG':
147-
arguments.append("-co JPEG_QUALITY=" + jpegcompression)
148-
elif (compress == 'LZW') or (compress == 'DEFLATE'):
149-
arguments.append("-co PREDICTOR=" + predictor)
150-
if compress == 'DEFLATE':
151-
arguments.append("-co ZLEVEL=" + zlevel)
152-
if tiled == "True":
153-
arguments.append("-co TILED=YES")
154-
if tfw == "True":
155-
arguments.append("-co TFW=YES")
156-
if len(bigtiff) > 0:
157-
arguments.append("-co BIGTIFF=" + bigtiff)
104+
if opts:
105+
arguments.append('-co')
106+
arguments.append(opts)
158107

159108
arguments.append(self.getParameterValue(self.INPUT))
160109
arguments.append(out)

python/plugins/processing/algs/gdal/ClipByMask.py

Lines changed: 26 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,11 @@
3232

3333
from osgeo import gdal
3434

35-
from processing.core.parameters import ParameterRaster
36-
from processing.core.parameters import ParameterVector
37-
from processing.core.parameters import ParameterBoolean
38-
from processing.core.parameters import ParameterString
39-
from processing.core.parameters import ParameterSelection
40-
from processing.core.parameters import ParameterNumber
35+
from processing.core.parameters import (ParameterRaster,
36+
ParameterVector,
37+
ParameterBoolean,
38+
ParameterString,
39+
ParameterSelection)
4140

4241
from processing.core.outputs import OutputRaster
4342

@@ -59,64 +58,39 @@ class ClipByMask(GdalAlgorithm):
5958
ALPHA_BAND = 'ALPHA_BAND'
6059
CROP_TO_CUTLINE = 'CROP_TO_CUTLINE'
6160
KEEP_RESOLUTION = 'KEEP_RESOLUTION'
62-
EXTRA = 'EXTRA'
61+
OPTIONS = 'OPTIONS'
6362
RTYPE = 'RTYPE'
6463
TYPE = ['Byte', 'Int16', 'UInt16', 'UInt32', 'Int32', 'Float32', 'Float64']
65-
TILED = 'TILED'
66-
COMPRESS = 'COMPRESS'
67-
JPEGCOMPRESSION = 'JPEGCOMPRESSION'
68-
PREDICTOR = 'PREDICTOR'
69-
ZLEVEL = 'ZLEVEL'
70-
BIGTIFF = 'BIGTIFF'
71-
BIGTIFFTYPE = ['', 'YES', 'NO', 'IF_NEEDED', 'IF_SAFER']
72-
COMPRESSTYPE = ['NONE', 'JPEG', 'LZW', 'PACKBITS', 'DEFLATE']
73-
TFW = 'TFW'
7464

7565
def getIcon(self):
7666
return QIcon(os.path.join(pluginPath, 'images', 'gdaltools', 'raster-clip.png'))
7767

7868
def defineCharacteristics(self):
7969
self.name, self.i18n_name = self.trAlgorithm('Clip raster by mask layer')
8070
self.group, self.i18n_group = self.trAlgorithm('[GDAL] Extraction')
71+
8172
self.addParameter(ParameterRaster(self.INPUT, self.tr('Input layer'), False))
8273
self.addParameter(ParameterVector(self.MASK, self.tr('Mask layer'),
8374
[dataobjects.TYPE_VECTOR_POLYGON]))
8475
self.addParameter(ParameterString(self.NO_DATA,
8576
self.tr("Nodata value, leave blank to take the nodata value from input"),
8677
'', optional=True))
8778
self.addParameter(ParameterBoolean(self.ALPHA_BAND,
88-
self.tr('Create and output alpha band'), False))
79+
self.tr('Create and output alpha band'),
80+
False))
8981
self.addParameter(ParameterBoolean(self.CROP_TO_CUTLINE,
90-
self.tr('Crop the extent of the target dataset to the extent of the cutline'), True))
82+
self.tr('Crop the extent of the target dataset to the extent of the cutline'),
83+
True))
9184
self.addParameter(ParameterBoolean(self.KEEP_RESOLUTION,
92-
self.tr('Keep resolution of output raster'), False))
93-
94-
params = []
95-
params.append(ParameterSelection(self.RTYPE,
96-
self.tr('Output raster type'), self.TYPE, 5))
97-
params.append(ParameterSelection(self.COMPRESS,
98-
self.tr('GeoTIFF options. Compression type:'), self.COMPRESSTYPE, 4))
99-
params.append(ParameterNumber(self.JPEGCOMPRESSION,
100-
self.tr('Set the JPEG compression level'),
101-
1, 100, 75))
102-
params.append(ParameterNumber(self.ZLEVEL,
103-
self.tr('Set the DEFLATE compression level'),
104-
1, 9, 6))
105-
params.append(ParameterNumber(self.PREDICTOR,
106-
self.tr('Set the predictor for LZW or DEFLATE compression'),
107-
1, 3, 1))
108-
params.append(ParameterBoolean(self.TILED,
109-
self.tr('Create tiled output (only used for the GTiff format)'), False))
110-
params.append(ParameterSelection(self.BIGTIFF,
111-
self.tr('Control whether the created file is a BigTIFF or a classic TIFF'), self.BIGTIFFTYPE, 0))
112-
params.append(ParameterBoolean(self.TFW,
113-
self.tr('Force the generation of an associated ESRI world file (.tfw))'), False))
114-
params.append(ParameterString(self.EXTRA,
115-
self.tr('Additional creation parameters'), '', optional=True))
116-
117-
for param in params:
118-
param.isAdvanced = True
119-
self.addParameter(param)
85+
self.tr('Keep resolution of output raster'),
86+
False))
87+
self.addParameter(ParameterString(self.OPTIONS,
88+
self.tr('Additional creation options'),
89+
optional=True,
90+
metadata={'widget_wrapper': 'processing.algs.gdal.ui.RasterOptionsWidget.RasterOptionsWidgetWrapper'}))
91+
self.addParameter(ParameterSelection(self.RTYPE,
92+
self.tr('Output raster type'),
93+
self.TYPE, 5))
12094

12195
self.addOutput(OutputRaster(self.OUTPUT, self.tr('Clipped (mask)')))
12296

@@ -127,21 +101,14 @@ def getConsoleCommands(self):
127101
self.getParameterValue(self.MASK))
128102
ogrMask = ogrConnectionString(mask)[1:-1]
129103
noData = self.getParameterValue(self.NO_DATA)
104+
opts = self.getParameterValue(self.OPTIONS)
105+
130106
if noData is not None:
131107
noData = str(noData)
108+
132109
addAlphaBand = self.getParameterValue(self.ALPHA_BAND)
133110
cropToCutline = self.getParameterValue(self.CROP_TO_CUTLINE)
134111
keepResolution = self.getParameterValue(self.KEEP_RESOLUTION)
135-
extra = self.getParameterValue(self.EXTRA)
136-
if extra is not None:
137-
extra = str(extra)
138-
jpegcompression = str(self.getParameterValue(self.JPEGCOMPRESSION))
139-
predictor = str(self.getParameterValue(self.PREDICTOR))
140-
zlevel = str(self.getParameterValue(self.ZLEVEL))
141-
tiled = str(self.getParameterValue(self.TILED))
142-
compress = self.COMPRESSTYPE[self.getParameterValue(self.COMPRESS)]
143-
bigtiff = self.BIGTIFFTYPE[self.getParameterValue(self.BIGTIFF)]
144-
tfw = str(self.getParameterValue(self.TFW))
145112

146113
arguments = []
147114
arguments.append('-ot')
@@ -174,24 +141,9 @@ def getConsoleCommands(self):
174141
if addAlphaBand:
175142
arguments.append('-dstalpha')
176143

177-
if extra and len(extra) > 0:
178-
arguments.append(extra)
179-
if GdalUtils.getFormatShortNameFromFilename(out) == "GTiff":
180-
arguments.append("-co COMPRESS=" + compress)
181-
if compress == 'JPEG':
182-
arguments.append("-co JPEG_QUALITY=" + jpegcompression)
183-
elif (compress == 'LZW') or (compress == 'DEFLATE'):
184-
arguments.append("-co PREDICTOR=" + predictor)
185-
if compress == 'DEFLATE':
186-
arguments.append("-co ZLEVEL=" + zlevel)
187-
if tiled == "True":
188-
arguments.append("-co TILED=YES")
189-
if tfw == "True":
190-
arguments.append("-co TFW=YES")
191-
if len(bigtiff) > 0:
192-
arguments.append("-co BIGTIFF=" + bigtiff)
193-
194-
arguments.append("-wo OPTIMIZE_SIZE=TRUE")
144+
if opts:
145+
arguments.append('-co')
146+
arguments.append(opts)
195147

196148
if GdalUtils.version() in [2010000, 2010100]:
197149
arguments.append("--config GDALWARP_IGNORE_BAD_CUTLINE YES")

python/plugins/processing/algs/gdal/GdalUtils.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,7 @@ def getFormatShortNameFromFilename(filename):
175175
def escapeAndJoin(strList):
176176
joined = ''
177177
for s in strList:
178+
print(s)
178179
if s[0] != '-' and ' ' in s:
179180
escaped = '"' + s.replace('\\', '\\\\').replace('"', '\\"') \
180181
+ '"'

python/plugins/processing/algs/gdal/merge.py

Lines changed: 32 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,14 @@
3030
from qgis.PyQt.QtGui import QIcon
3131

3232
from processing.algs.gdal.GdalAlgorithm import GdalAlgorithm
33+
from processing.core.parameters import (ParameterBoolean,
34+
ParameterString,
35+
ParameterSelection,
36+
ParameterMultipleInput)
3337
from processing.core.outputs import OutputRaster
34-
from processing.core.parameters import ParameterBoolean
35-
from processing.core.parameters import ParameterMultipleInput
36-
from processing.core.parameters import ParameterSelection
3738
from processing.tools.system import isWindows
3839
from processing.tools import dataobjects
40+
3941
from processing.algs.gdal.GdalUtils import GdalUtils
4042

4143
pluginPath = os.path.split(os.path.split(os.path.dirname(__file__))[0])[0]
@@ -44,10 +46,11 @@
4446
class merge(GdalAlgorithm):
4547

4648
INPUT = 'INPUT'
47-
OUTPUT = 'OUTPUT'
49+
OPTIONS = 'OPTIONS'
4850
PCT = 'PCT'
4951
SEPARATE = 'SEPARATE'
5052
RTYPE = 'RTYPE'
53+
OUTPUT = 'OUTPUT'
5154

5255
TYPE = ['Byte', 'Int16', 'UInt16', 'UInt32', 'Int32', 'Float32', 'Float64']
5356

@@ -57,31 +60,44 @@ def getIcon(self):
5760
def defineCharacteristics(self):
5861
self.name, self.i18n_name = self.trAlgorithm('Merge')
5962
self.group, self.i18n_group = self.trAlgorithm('[GDAL] Miscellaneous')
60-
self.addParameter(ParameterMultipleInput(merge.INPUT,
61-
self.tr('Input layers'), dataobjects.TYPE_RASTER))
62-
self.addParameter(ParameterBoolean(merge.PCT,
63-
self.tr('Grab pseudocolor table from first layer'), False))
64-
self.addParameter(ParameterBoolean(merge.SEPARATE,
65-
self.tr('Place each input file into a separate band'), False))
63+
self.addParameter(ParameterMultipleInput(self.INPUT,
64+
self.tr('Input layers'),
65+
dataobjects.TYPE_RASTER))
66+
self.addParameter(ParameterString(self.OPTIONS,
67+
self.tr('Additional creation options'),
68+
optional=True,
69+
metadata={'widget_wrapper': 'processing.algs.gdal.ui.RasterOptionsWidget.RasterOptionsWidgetWrapper'}))
70+
self.addParameter(ParameterBoolean(self.PCT,
71+
self.tr('Grab pseudocolor table from first layer'),
72+
False))
73+
self.addParameter(ParameterBoolean(self.SEPARATE,
74+
self.tr('Place each input file into a separate band'),
75+
False))
6676
self.addParameter(ParameterSelection(self.RTYPE,
67-
self.tr('Output raster type'), self.TYPE, 5))
77+
self.tr('Output raster type'),
78+
self.TYPE, 5))
6879

69-
self.addOutput(OutputRaster(merge.OUTPUT, self.tr('Merged')))
80+
self.addOutput(OutputRaster(self.OUTPUT, self.tr('Merged')))
7081

7182
def getConsoleCommands(self):
7283
arguments = []
7384
arguments.append('-ot')
7485
arguments.append(self.TYPE[self.getParameterValue(self.RTYPE)])
75-
if self.getParameterValue(merge.SEPARATE):
86+
if self.getParameterValue(self.SEPARATE):
7687
arguments.append('-separate')
77-
if self.getParameterValue(merge.PCT):
88+
if self.getParameterValue(self.PCT):
7889
arguments.append('-pct')
90+
opts = self.getParameterValue(self.OPTIONS)
91+
if opts:
92+
arguments.append('-co')
93+
arguments.append(opts)
94+
7995
arguments.append('-o')
80-
out = self.getOutputValue(merge.OUTPUT)
96+
out = self.getOutputValue(self.OUTPUT)
8197
arguments.append(out)
8298
arguments.append('-of')
8399
arguments.append(GdalUtils.getFormatShortNameFromFilename(out))
84-
arguments.extend(self.getParameterValue(merge.INPUT).split(';'))
100+
arguments.extend(self.getParameterValue(self.INPUT).split(';'))
85101

86102
commands = []
87103
if isWindows():

0 commit comments

Comments
 (0)