Skip to content

Commit 3749867

Browse files
author
Giovanni Manghi
committed
fixes processing gdal rasterize and add compression options for tiff outputs
1 parent 421dfb2 commit 3749867

File tree

3 files changed

+166
-18
lines changed

3 files changed

+166
-18
lines changed

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

+65-9
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,14 @@
3333
from processing.core.parameters import ParameterSelection
3434
from processing.core.parameters import ParameterNumber
3535
from processing.core.parameters import ParameterBoolean
36+
from processing.core.parameters import ParameterString
3637
from processing.core.outputs import OutputRaster
38+
from processing.algs.gdal.OgrAlgorithm import OgrAlgorithm
3739
from processing.algs.gdal.GdalUtils import GdalUtils
40+
from processing.tools.system import isWindows
3841

3942

40-
class rasterize(GdalAlgorithm):
43+
class rasterize(OgrAlgorithm):
4144

4245
INPUT = 'INPUT'
4346
FIELD = 'FIELD'
@@ -47,8 +50,17 @@ class rasterize(GdalAlgorithm):
4750
WRITEOVER = 'WRITEOVER'
4851
RTYPE = 'RTYPE'
4952
OUTPUT = 'OUTPUT'
50-
5153
TYPE = ['Byte', 'Int16', 'UInt16', 'UInt32', 'Int32', 'Float32', 'Float64']
54+
NO_DATA = 'NO_DATA'
55+
TILED = 'TILED'
56+
COMPRESS = 'COMPRESS'
57+
JPEGCOMPRESSION = 'JPEGCOMPRESSION'
58+
PREDICTOR = 'PREDICTOR'
59+
ZLEVEL = 'ZLEVEL'
60+
BIGTIFF = 'BIGTIFF'
61+
BIGTIFFTYPE = ['', 'YES', 'NO', 'IF_NEEDED', 'IF_SAFER']
62+
COMPRESSTYPE = ['NONE', 'JPEG', 'LZW', 'PACKBITS', 'DEFLATE']
63+
TFW = 'TFW'
5264

5365
def commandLineName(self):
5466
return "gdalogr:rasterize"
@@ -70,13 +82,43 @@ def defineCharacteristics(self):
7082
self.tr('Vertical'), 0.0, 99999999.999999, 100.0))
7183
self.addParameter(ParameterSelection(self.RTYPE, self.tr('Raster type'),
7284
self.TYPE, 0))
73-
85+
self.addParameter(ParameterString(self.NO_DATA,
86+
self.tr("Nodata value"),
87+
'-9999'))
88+
self.addParameter(ParameterSelection(self.COMPRESS,
89+
self.tr('GeoTIFF options. Compression type:'), self.COMPRESSTYPE, 0))
90+
self.addParameter(ParameterNumber(self.JPEGCOMPRESSION,
91+
self.tr('Set the JPEG compression level'),
92+
1, 100, 75))
93+
self.addParameter(ParameterNumber(self.ZLEVEL,
94+
self.tr('Set the DEFLATE compression level'),
95+
1, 9, 6))
96+
self.addParameter(ParameterNumber(self.PREDICTOR,
97+
self.tr('Set the predictor for LZW or DEFLATE compression'),
98+
1, 3, 1))
99+
self.addParameter(ParameterBoolean(self.TILED,
100+
self.tr('Create tiled output (only used for the GTiff format)'), False))
101+
self.addParameter(ParameterSelection(self.BIGTIFF,
102+
self.tr('Control whether the created file is a BigTIFF or a classic TIFF'), self.BIGTIFFTYPE, 0))
103+
self.addParameter(ParameterBoolean(self.TFW,
104+
self.tr('Force the generation of an associated ESRI world file (.tfw))'), False))
74105
self.addOutput(OutputRaster(self.OUTPUT,
75106
self.tr('Output layer: mandatory to choose an existing raster layer if the (*) option is selected')))
76107

77108
def processAlgorithm(self, progress):
78109
writeOver = self.getParameterValue(self.WRITEOVER)
79-
110+
inLayer = self.getParameterValue(self.INPUT)
111+
ogrLayer = self.ogrConnectionString(inLayer)[1:-1]
112+
noData = str(self.getParameterValue(self.NO_DATA))
113+
jpegcompression = str(self.getParameterValue(self.JPEGCOMPRESSION))
114+
predictor = str(self.getParameterValue(self.PREDICTOR))
115+
zlevel = str(self.getParameterValue(self.ZLEVEL))
116+
tiled = str(self.getParameterValue(self.TILED))
117+
compress = self.COMPRESSTYPE[self.getParameterValue(self.COMPRESS)]
118+
bigtiff = self.BIGTIFFTYPE[self.getParameterValue(self.BIGTIFF)]
119+
tfw = str(self.getParameterValue(self.TFW))
120+
out = self.getOutputValue(self.OUTPUT)
121+
80122
arguments = []
81123
arguments.append('-a')
82124
arguments.append(str(self.getParameterValue(self.FIELD)))
@@ -95,13 +137,27 @@ def processAlgorithm(self, progress):
95137
arguments.append('-tr')
96138
arguments.append(str(self.getParameterValue(self.WIDTH)))
97139
arguments.append(str(self.getParameterValue(self.HEIGHT)))
98-
140+
if len(noData) > 0:
141+
arguments.append('-a_nodata')
142+
arguments.append(noData)
143+
if (GdalUtils.getFormatShortNameFromFilename(out) == "GTiff") and (writeOver is False):
144+
arguments.append("-co COMPRESS="+compress)
145+
if compress == 'JPEG':
146+
arguments.append("-co JPEG_QUALITY="+jpegcompression)
147+
elif (compress == 'LZW') or (compress == 'DEFLATE'):
148+
arguments.append("-co PREDICTOR="+predictor)
149+
if compress == 'DEFLATE':
150+
arguments.append("-co ZLEVEL="+zlevel)
151+
if tiled == "True":
152+
arguments.append("-co TILED=YES")
153+
if tfw == "True":
154+
arguments.append("-co TFW=YES")
155+
if len(bigtiff) > 0:
156+
arguments.append("-co BIGTIFF="+bigtiff)
99157
arguments.append('-l')
100-
arguments.append(
101-
os.path.basename(os.path.splitext(unicode(self.getParameterValue(self.INPUT)))[0]))
102-
arguments.append(unicode(self.getParameterValue(self.INPUT)))
158+
arguments.append(self.ogrLayerName(inLayer))
159+
arguments.append(ogrLayer)
103160

104161
arguments.append(unicode(self.getOutputValue(self.OUTPUT)))
105-
106162
GdalUtils.runGdal(['gdal_rasterize',
107163
GdalUtils.escapeAndJoin(arguments)], progress)

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

+50-5
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,16 @@ class translate(GdalAlgorithm):
5151
SDS = 'SDS'
5252
EXTRA = 'EXTRA'
5353
RTYPE = 'RTYPE'
54-
5554
TYPE = ['Byte', 'Int16', 'UInt16', 'UInt32', 'Int32', 'Float32', 'Float64']
55+
TILED = 'TILED'
56+
COMPRESS = 'COMPRESS'
57+
JPEGCOMPRESSION = 'JPEGCOMPRESSION'
58+
PREDICTOR = 'PREDICTOR'
59+
ZLEVEL = 'ZLEVEL'
60+
BIGTIFF = 'BIGTIFF'
61+
BIGTIFFTYPE = ['', 'YES', 'NO', 'IF_NEEDED', 'IF_SAFER']
62+
COMPRESSTYPE = ['NONE', 'JPEG', 'LZW', 'PACKBITS', 'DEFLATE']
63+
TFW = 'TFW'
5664

5765
def commandLineName(self):
5866
return "gdalogr:translate"
@@ -79,11 +87,27 @@ def defineCharacteristics(self):
7987
self.addParameter(ParameterBoolean(self.SDS,
8088
self.tr('Copy all subdatasets of this file to individual output files'),
8189
False))
82-
self.addParameter(ParameterString(self.EXTRA,
83-
self.tr('Additional creation parameters'), '', optional=True))
8490
self.addParameter(ParameterSelection(self.RTYPE,
8591
self.tr('Output raster type'), self.TYPE, 5))
86-
92+
self.addParameter(ParameterSelection(self.COMPRESS,
93+
self.tr('GeoTIFF options. Compression type:'), self.COMPRESSTYPE, 0))
94+
self.addParameter(ParameterNumber(self.JPEGCOMPRESSION,
95+
self.tr('Set the JPEG compression level'),
96+
1, 100, 75))
97+
self.addParameter(ParameterNumber(self.ZLEVEL,
98+
self.tr('Set the DEFLATE compression level'),
99+
1, 9, 6))
100+
self.addParameter(ParameterNumber(self.PREDICTOR,
101+
self.tr('Set the predictor for LZW or DEFLATE compression'),
102+
1, 3, 1))
103+
self.addParameter(ParameterBoolean(self.TILED,
104+
self.tr('Create tiled output (only used for the GTiff format)'), False))
105+
self.addParameter(ParameterSelection(self.BIGTIFF,
106+
self.tr('Control whether the created file is a BigTIFF or a classic TIFF'), self.BIGTIFFTYPE, 0))
107+
self.addParameter(ParameterBoolean(self.TFW,
108+
self.tr('Force the generation of an associated ESRI world file (.tfw))'), False))
109+
self.addParameter(ParameterString(self.EXTRA,
110+
self.tr('Additional creation parameters'), '', optional=True))
87111
self.addOutput(OutputRaster(self.OUTPUT, self.tr('Output layer')))
88112

89113
def processAlgorithm(self, progress):
@@ -97,7 +121,14 @@ def processAlgorithm(self, progress):
97121
crsId = self.getParameterValue(self.SRS)
98122
sds = self.getParameterValue(self.SDS)
99123
extra = str(self.getParameterValue(self.EXTRA))
100-
124+
jpegcompression = str(self.getParameterValue(self.JPEGCOMPRESSION))
125+
predictor = str(self.getParameterValue(self.PREDICTOR))
126+
zlevel = str(self.getParameterValue(self.ZLEVEL))
127+
tiled = str(self.getParameterValue(self.TILED))
128+
compress = self.COMPRESSTYPE[self.getParameterValue(self.COMPRESS)]
129+
bigtiff = self.BIGTIFFTYPE[self.getParameterValue(self.BIGTIFF)]
130+
tfw = str(self.getParameterValue(self.TFW))
131+
101132
arguments = []
102133
arguments.append('-of')
103134
arguments.append(GdalUtils.getFormatShortNameFromFilename(out))
@@ -130,6 +161,20 @@ def processAlgorithm(self, progress):
130161
arguments.append('-sds')
131162
if len(extra) > 0:
132163
arguments.append(extra)
164+
if GdalUtils.getFormatShortNameFromFilename(out) == "GTiff":
165+
arguments.append("-co COMPRESS="+compress)
166+
if compress == 'JPEG':
167+
arguments.append("-co JPEG_QUALITY="+jpegcompression)
168+
elif (compress == 'LZW') or (compress == 'DEFLATE'):
169+
arguments.append("-co PREDICTOR="+predictor)
170+
if compress == 'DEFLATE':
171+
arguments.append("-co ZLEVEL="+zlevel)
172+
if tiled == "True":
173+
arguments.append("-co TILED=YES")
174+
if tfw == "True":
175+
arguments.append("-co TFW=YES")
176+
if len(bigtiff) > 0:
177+
arguments.append("-co BIGTIFF="+bigtiff)
133178
arguments.append(self.getParameterValue(self.INPUT))
134179
arguments.append(out)
135180

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

+51-4
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
from processing.core.parameters import ParameterCrs
3232
from processing.core.parameters import ParameterNumber
3333
from processing.core.parameters import ParameterString
34+
from processing.core.parameters import ParameterBoolean
3435
from processing.core.outputs import OutputRaster
3536
from processing.algs.gdal.GdalUtils import GdalUtils
3637

@@ -47,8 +48,16 @@ class warp(GdalAlgorithm):
4748
NO_DATA = 'NO_DATA'
4849
EXTRA = 'EXTRA'
4950
RTYPE = 'RTYPE'
50-
5151
TYPE = ['Byte', 'Int16', 'UInt16', 'UInt32', 'Int32', 'Float32', 'Float64']
52+
TILED = 'TILED'
53+
COMPRESS = 'COMPRESS'
54+
JPEGCOMPRESSION = 'JPEGCOMPRESSION'
55+
PREDICTOR = 'PREDICTOR'
56+
ZLEVEL = 'ZLEVEL'
57+
BIGTIFF = 'BIGTIFF'
58+
BIGTIFFTYPE = ['', 'YES', 'NO', 'IF_NEEDED', 'IF_SAFER']
59+
COMPRESSTYPE = ['NONE', 'JPEG', 'LZW', 'PACKBITS', 'DEFLATE']
60+
TFW = 'TFW'
5261

5362
def defineCharacteristics(self):
5463
self.name = 'Warp (reproject)'
@@ -66,17 +75,41 @@ def defineCharacteristics(self):
6675
0.0, None, 0.0))
6776
self.addParameter(ParameterSelection(self.METHOD,
6877
self.tr('Resampling method'), self.METHOD_OPTIONS))
69-
self.addParameter(ParameterString(self.EXTRA,
70-
self.tr('Additional creation parameters'), '', optional=True))
7178
self.addParameter(ParameterSelection(self.RTYPE,
7279
self.tr('Output raster type'), self.TYPE, 5))
73-
80+
self.addParameter(ParameterSelection(self.COMPRESS,
81+
self.tr('GeoTIFF options. Compression type:'), self.COMPRESSTYPE, 0))
82+
self.addParameter(ParameterNumber(self.JPEGCOMPRESSION,
83+
self.tr('Set the JPEG compression level'),
84+
1, 100, 75))
85+
self.addParameter(ParameterNumber(self.ZLEVEL,
86+
self.tr('Set the DEFLATE compression level'),
87+
1, 9, 6))
88+
self.addParameter(ParameterNumber(self.PREDICTOR,
89+
self.tr('Set the predictor for LZW or DEFLATE compression'),
90+
1, 3, 1))
91+
self.addParameter(ParameterBoolean(self.TILED,
92+
self.tr('Create tiled output (only used for the GTiff format)'), False))
93+
self.addParameter(ParameterSelection(self.BIGTIFF,
94+
self.tr('Control whether the created file is a BigTIFF or a classic TIFF'), self.BIGTIFFTYPE, 0))
95+
self.addParameter(ParameterBoolean(self.TFW,
96+
self.tr('Force the generation of an associated ESRI world file (.tfw))'), False))
97+
self.addParameter(ParameterString(self.EXTRA,
98+
self.tr('Additional creation parameters'), '', optional=True))
7499
self.addOutput(OutputRaster(self.OUTPUT, self.tr('Output layer')))
75100

76101
def processAlgorithm(self, progress):
77102
noData = str(self.getParameterValue(self.NO_DATA))
78103
srccrs = self.getParameterValue(self.SOURCE_SRS)
79104
dstcrs = self.getParameterValue(self.DEST_SRS)
105+
jpegcompression = str(self.getParameterValue(self.JPEGCOMPRESSION))
106+
predictor = str(self.getParameterValue(self.PREDICTOR))
107+
zlevel = str(self.getParameterValue(self.ZLEVEL))
108+
tiled = str(self.getParameterValue(self.TILED))
109+
compress = self.COMPRESSTYPE[self.getParameterValue(self.COMPRESS)]
110+
bigtiff = self.BIGTIFFTYPE[self.getParameterValue(self.BIGTIFF)]
111+
tfw = str(self.getParameterValue(self.TFW))
112+
80113
arguments = []
81114
arguments.append('-ot')
82115
arguments.append(self.TYPE[self.getParameterValue(self.RTYPE)])
@@ -102,6 +135,20 @@ def processAlgorithm(self, progress):
102135
extra = str(self.getParameterValue(self.EXTRA))
103136
if len(extra) > 0:
104137
arguments.append(extra)
138+
if GdalUtils.getFormatShortNameFromFilename(out) == "GTiff":
139+
arguments.append("-co COMPRESS="+compress)
140+
if compress == 'JPEG':
141+
arguments.append("-co JPEG_QUALITY="+jpegcompression)
142+
elif (compress == 'LZW') or (compress == 'DEFLATE'):
143+
arguments.append("-co PREDICTOR="+predictor)
144+
if compress == 'DEFLATE':
145+
arguments.append("-co ZLEVEL="+zlevel)
146+
if tiled == "True":
147+
arguments.append("-co TILED=YES")
148+
if tfw == "True":
149+
arguments.append("-co TFW=YES")
150+
if len(bigtiff) > 0:
151+
arguments.append("-co BIGTIFF="+bigtiff)
105152
arguments.append(self.getParameterValue(self.INPUT))
106153
arguments.append(out)
107154

0 commit comments

Comments
 (0)