34
34
QgsProcessingException ,
35
35
QgsProcessingParameterDefinition ,
36
36
QgsProcessingParameterFeatureSource ,
37
- QgsProcessingParameterCrs ,
38
37
QgsProcessingParameterRasterLayer ,
38
+ QgsProcessingParameterCrs ,
39
39
QgsProcessingParameterEnum ,
40
40
QgsProcessingParameterString ,
41
41
QgsProcessingParameterNumber ,
42
- QgsProcessingParameterExtent ,
43
42
QgsProcessingParameterBoolean ,
44
43
QgsProcessingParameterRasterDestination )
45
44
from processing .algs .gdal .GdalAlgorithm import GdalAlgorithm
@@ -52,14 +51,17 @@ class ClipRasterByMask(GdalAlgorithm):
52
51
53
52
INPUT = 'INPUT'
54
53
MASK = 'MASK'
54
+ SOURCE_CRS = 'SOURCE_CRS'
55
+ TARGET_CRS = 'TARGET_CRS'
55
56
NODATA = 'NODATA'
56
57
ALPHA_BAND = 'ALPHA_BAND'
57
58
CROP_TO_CUTLINE = 'CROP_TO_CUTLINE'
58
59
KEEP_RESOLUTION = 'KEEP_RESOLUTION'
60
+ SET_RESOLUTION = 'SET_RESOLUTION'
61
+ X_RESOLUTION = 'X_RESOLUTION'
62
+ Y_RESOLUTION = 'Y_RESOLUTION'
59
63
OPTIONS = 'OPTIONS'
60
64
DATA_TYPE = 'DATA_TYPE'
61
- TARGET_EXTENT = 'TARGET_EXTENT'
62
- TARGET_EXTENT_CRS = 'TARGET_EXTENT_CRS'
63
65
MULTITHREADING = 'MULTITHREADING'
64
66
OUTPUT = 'OUTPUT'
65
67
@@ -74,6 +76,12 @@ def initAlgorithm(self, config=None):
74
76
self .addParameter (QgsProcessingParameterFeatureSource (self .MASK ,
75
77
self .tr ('Mask layer' ),
76
78
[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 ))
77
85
self .addParameter (QgsProcessingParameterNumber (self .NODATA ,
78
86
self .tr ('Assign a specified nodata value to output bands' ),
79
87
type = QgsProcessingParameterNumber .Double ,
@@ -86,27 +94,26 @@ def initAlgorithm(self, config=None):
86
94
self .tr ('Match the extent of the clipped raster to the extent of the mask layer' ),
87
95
defaultValue = True ))
88
96
self .addParameter (QgsProcessingParameterBoolean (self .KEEP_RESOLUTION ,
89
- self .tr ('Keep resolution of output raster' ),
97
+ self .tr ('Keep resolution of input raster' ),
90
98
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 ))
104
112
multithreading_param = QgsProcessingParameterBoolean (self .MULTITHREADING ,
105
113
self .tr ('Use multithreaded warping implementation' ),
106
114
defaultValue = False )
107
115
multithreading_param .setFlags (multithreading_param .flags () | QgsProcessingParameterDefinition .FlagAdvanced )
108
116
self .addParameter (multithreading_param )
109
-
110
117
options_param = QgsProcessingParameterString (self .OPTIONS ,
111
118
self .tr ('Additional creation options' ),
112
119
defaultValue = '' ,
@@ -153,6 +160,9 @@ def getConsoleCommands(self, parameters, context, feedback, executing=True):
153
160
154
161
maskLayer , maskLayerName = self .getOgrCompatibleSource (self .MASK , parameters , context , feedback , executing )
155
162
163
+ sourceCrs = self .parameterAsCrs (parameters , self .SOURCE_CRS , context )
164
+ targetCrs = self .parameterAsCrs (parameters , self .TARGET_CRS , context )
165
+
156
166
if self .NODATA in parameters and parameters [self .NODATA ] is not None :
157
167
nodata = self .parameterAsDouble (parameters , self .NODATA , context )
158
168
else :
@@ -163,6 +173,14 @@ def getConsoleCommands(self, parameters, context, feedback, executing=True):
163
173
164
174
arguments = []
165
175
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
+
166
184
data_type = self .parameterAsEnum (parameters , self .DATA_TYPE , context )
167
185
if data_type :
168
186
arguments .append ('-ot ' + self .TYPES [data_type ])
@@ -176,6 +194,20 @@ def getConsoleCommands(self, parameters, context, feedback, executing=True):
176
194
arguments .append (str (- inLayer .rasterUnitsPerPixelY ()))
177
195
arguments .append ('-tap' )
178
196
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
+
179
211
arguments .append ('-cutline' )
180
212
arguments .append (maskLayer )
181
213
@@ -188,19 +220,6 @@ def getConsoleCommands(self, parameters, context, feedback, executing=True):
188
220
if nodata is not None :
189
221
arguments .append ('-dstnodata {}' .format (nodata ))
190
222
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
-
204
223
if self .parameterAsBool (parameters , self .MULTITHREADING , context ):
205
224
arguments .append ('-multi' )
206
225
0 commit comments