Skip to content

Commit 3fd27d1

Browse files
authoredJan 10, 2017
Merge pull request #3926 from alexbruy/processing-gdal-opts
Processing gdal opts
2 parents 378212c + 29d108f commit 3fd27d1

16 files changed

+393
-434
lines changed
 

‎python/gui/qgsrasterformatsaveoptionswidget.sip

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,19 +21,70 @@ class QgsRasterFormatSaveOptionsWidget : QWidget
2121
const QString& provider = "gdal" );
2222
~QgsRasterFormatSaveOptionsWidget();
2323

24+
/**
25+
* Set output raster format, it is used to determine list
26+
* of available options
27+
*/
2428
void setFormat( const QString& format );
29+
30+
/**
31+
* Set provider key, , it is used to determine list
32+
* of available options
33+
*/
2534
void setProvider( const QString& provider );
35+
36+
/**
37+
* Set output raster layer
38+
*/
2639
void setRasterLayer( QgsRasterLayer* rasterLayer );
40+
41+
/**
42+
* Set output raster file name
43+
*/
2744
void setRasterFileName( const QString& file );
45+
46+
/**
47+
* Returns list of selected options
48+
* @see setOptions()
49+
*/
2850
QStringList options() const;
51+
52+
/**
53+
* Populate widget with user-defined options. String should contain
54+
* key=value pairs separated by spaces, e.g. "TILED=YES TFW=YES"
55+
* @see options()
56+
* @note added in QGIS 3.0
57+
*/
58+
void setOptions( const QString& options );
59+
60+
/**
61+
* Set widget look and feel
62+
*/
2963
void setType( QgsRasterFormatSaveOptionsWidget::Type type = Default );
64+
65+
/**
66+
* Set pyramids format to use
67+
*/
3068
void setPyramidsFormat( QgsRaster::RasterPyramidsFormat format );
3169

3270
public slots:
3371

3472
void apply();
73+
74+
/**
75+
* Opens window with options desctiption for given provider
76+
* and output format
77+
*/
3578
void helpOptions();
79+
80+
/**
81+
* Validates options correctness
82+
*/
3683
QString validateOptions( bool gui = true, bool reportOk = true );
84+
85+
/**
86+
* Reloads profiles list from QGIS settings
87+
*/
3788
void updateProfiles();
3889

3990
private slots:
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
+ '"'

0 commit comments

Comments
 (0)