3434 QgsProcessingException ,
3535 QgsProcessingParameterDefinition ,
3636 QgsProcessingParameterFeatureSource ,
37- QgsProcessingParameterCrs ,
3837 QgsProcessingParameterRasterLayer ,
38+ QgsProcessingParameterCrs ,
3939 QgsProcessingParameterEnum ,
4040 QgsProcessingParameterString ,
4141 QgsProcessingParameterNumber ,
42- QgsProcessingParameterExtent ,
4342 QgsProcessingParameterBoolean ,
4443 QgsProcessingParameterRasterDestination )
4544from 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