Skip to content

Commit 78cc5b2

Browse files
committed
Fixes/improves the GDAL clip by mask layer tool: removes a an option (-te) that does not make sense for the clip by mask, and adds the option to allow choose the output resolution
1 parent 4f1dd95 commit 78cc5b2

File tree

1 file changed

+51
-32
lines changed

1 file changed

+51
-32
lines changed

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

+51-32
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,11 @@
3434
QgsProcessingException,
3535
QgsProcessingParameterDefinition,
3636
QgsProcessingParameterFeatureSource,
37-
QgsProcessingParameterCrs,
3837
QgsProcessingParameterRasterLayer,
38+
QgsProcessingParameterCrs,
3939
QgsProcessingParameterEnum,
4040
QgsProcessingParameterString,
4141
QgsProcessingParameterNumber,
42-
QgsProcessingParameterExtent,
4342
QgsProcessingParameterBoolean,
4443
QgsProcessingParameterRasterDestination)
4544
from processing.algs.gdal.GdalAlgorithm import GdalAlgorithm
@@ -52,14 +51,17 @@ class ClipRasterByMask(GdalAlgorithm):
5251

5352
INPUT = 'INPUT'
5453
MASK = 'MASK'
54+
SOURCE_CRS = 'SOURCE_CRS'
55+
TARGET_CRS = 'TARGET_CRS'
5556
NODATA = 'NODATA'
5657
ALPHA_BAND = 'ALPHA_BAND'
5758
CROP_TO_CUTLINE = 'CROP_TO_CUTLINE'
5859
KEEP_RESOLUTION = 'KEEP_RESOLUTION'
60+
SET_RESOLUTION = 'SET_RESOLUTION'
61+
X_RESOLUTION = 'X_RESOLUTION'
62+
Y_RESOLUTION = 'Y_RESOLUTION'
5963
OPTIONS = 'OPTIONS'
6064
DATA_TYPE = 'DATA_TYPE'
61-
TARGET_EXTENT = 'TARGET_EXTENT'
62-
TARGET_EXTENT_CRS = 'TARGET_EXTENT_CRS'
6365
MULTITHREADING = 'MULTITHREADING'
6466
OUTPUT = 'OUTPUT'
6567

@@ -74,6 +76,12 @@ def initAlgorithm(self, config=None):
7476
self.addParameter(QgsProcessingParameterFeatureSource(self.MASK,
7577
self.tr('Mask layer'),
7678
[QgsProcessing.TypeVectorPolygon]))
79+
self.addParameter(QgsProcessingParameterCrs(self.SOURCE_CRS,
80+
self.tr('Source CRS'),
81+
optional=True))
82+
self.addParameter(QgsProcessingParameterCrs(self.TARGET_CRS,
83+
self.tr('Target CRS'),
84+
optional=True))
7785
self.addParameter(QgsProcessingParameterNumber(self.NODATA,
7886
self.tr('Assign a specified nodata value to output bands'),
7987
type=QgsProcessingParameterNumber.Double,
@@ -86,27 +94,26 @@ def initAlgorithm(self, config=None):
8694
self.tr('Match the extent of the clipped raster to the extent of the mask layer'),
8795
defaultValue=True))
8896
self.addParameter(QgsProcessingParameterBoolean(self.KEEP_RESOLUTION,
89-
self.tr('Keep resolution of output raster'),
97+
self.tr('Keep resolution of input raster'),
9098
defaultValue=False))
91-
92-
target_extent_param = QgsProcessingParameterExtent(self.TARGET_EXTENT,
93-
self.tr('Georeferenced extents of output file to be created'),
94-
optional=True)
95-
target_extent_param.setFlags(target_extent_param.flags() | QgsProcessingParameterDefinition.FlagAdvanced)
96-
self.addParameter(target_extent_param)
97-
98-
target_extent_crs_param = QgsProcessingParameterCrs(self.TARGET_EXTENT_CRS,
99-
self.tr('CRS of the target raster extent'),
100-
optional=True)
101-
target_extent_crs_param.setFlags(target_extent_crs_param.flags() | QgsProcessingParameterDefinition.FlagAdvanced)
102-
self.addParameter(target_extent_crs_param)
103-
99+
self.addParameter(QgsProcessingParameterBoolean(self.SET_RESOLUTION,
100+
self.tr('Set output file resolution'),
101+
defaultValue=False))
102+
self.addParameter(QgsProcessingParameterNumber(self.X_RESOLUTION,
103+
self.tr('X Resolution to output bands'),
104+
type=QgsProcessingParameterNumber.Double,
105+
defaultValue=None,
106+
optional=True))
107+
self.addParameter(QgsProcessingParameterNumber(self.Y_RESOLUTION,
108+
self.tr('Y Resolution to output bands'),
109+
type=QgsProcessingParameterNumber.Double,
110+
defaultValue=None,
111+
optional=True))
104112
multithreading_param = QgsProcessingParameterBoolean(self.MULTITHREADING,
105113
self.tr('Use multithreaded warping implementation'),
106114
defaultValue=False)
107115
multithreading_param.setFlags(multithreading_param.flags() | QgsProcessingParameterDefinition.FlagAdvanced)
108116
self.addParameter(multithreading_param)
109-
110117
options_param = QgsProcessingParameterString(self.OPTIONS,
111118
self.tr('Additional creation options'),
112119
defaultValue='',
@@ -153,6 +160,9 @@ def getConsoleCommands(self, parameters, context, feedback, executing=True):
153160

154161
maskLayer, maskLayerName = self.getOgrCompatibleSource(self.MASK, parameters, context, feedback, executing)
155162

163+
sourceCrs = self.parameterAsCrs(parameters, self.SOURCE_CRS, context)
164+
targetCrs = self.parameterAsCrs(parameters, self.TARGET_CRS, context)
165+
156166
if self.NODATA in parameters and parameters[self.NODATA] is not None:
157167
nodata = self.parameterAsDouble(parameters, self.NODATA, context)
158168
else:
@@ -163,6 +173,14 @@ def getConsoleCommands(self, parameters, context, feedback, executing=True):
163173

164174
arguments = []
165175

176+
if sourceCrs.isValid():
177+
arguments.append('-s_srs')
178+
arguments.append(GdalUtils.gdal_crs_string(sourceCrs))
179+
180+
if targetCrs.isValid():
181+
arguments.append('-t_srs')
182+
arguments.append(GdalUtils.gdal_crs_string(targetCrs))
183+
166184
data_type = self.parameterAsEnum(parameters, self.DATA_TYPE, context)
167185
if data_type:
168186
arguments.append('-ot ' + self.TYPES[data_type])
@@ -176,6 +194,20 @@ def getConsoleCommands(self, parameters, context, feedback, executing=True):
176194
arguments.append(str(-inLayer.rasterUnitsPerPixelY()))
177195
arguments.append('-tap')
178196

197+
if self.parameterAsBool(parameters, self.SET_RESOLUTION, context):
198+
arguments.append('-tr')
199+
if self.X_RESOLUTION in parameters and parameters[self.X_RESOLUTION] is not None:
200+
xres = self.parameterAsDouble(parameters, self.X_RESOLUTION, context)
201+
arguments.append('{}'.format(xres))
202+
else:
203+
arguments.append(str(inLayer.rasterUnitsPerPixelX()))
204+
if self.Y_RESOLUTION in parameters and parameters[self.Y_RESOLUTION] is not None:
205+
yres = self.parameterAsDouble(parameters, self.Y_RESOLUTION, context)
206+
arguments.append('{}'.format(yres))
207+
else:
208+
arguments.append(str(-inLayer.rasterUnitsPerPixelY()))
209+
arguments.append('-tap')
210+
179211
arguments.append('-cutline')
180212
arguments.append(maskLayer)
181213

@@ -188,19 +220,6 @@ def getConsoleCommands(self, parameters, context, feedback, executing=True):
188220
if nodata is not None:
189221
arguments.append('-dstnodata {}'.format(nodata))
190222

191-
extent = self.parameterAsExtent(parameters, self.TARGET_EXTENT, context)
192-
if not extent.isNull():
193-
arguments.append('-te')
194-
arguments.append(extent.xMinimum())
195-
arguments.append(extent.yMinimum())
196-
arguments.append(extent.xMaximum())
197-
arguments.append(extent.yMaximum())
198-
199-
extentCrs = self.parameterAsCrs(parameters, self.TARGET_EXTENT_CRS, context)
200-
if extentCrs:
201-
arguments.append('-te_srs')
202-
arguments.append(extentCrs.authid())
203-
204223
if self.parameterAsBool(parameters, self.MULTITHREADING, context):
205224
arguments.append('-multi')
206225

0 commit comments

Comments
 (0)