35
35
QgsProcessingParameterString ,
36
36
QgsProcessingParameterNumber ,
37
37
QgsProcessingParameterRasterLayer ,
38
- QgsProcessingOutputRasterLayer ,
38
+ QgsProcessingParameterMapLayer ,
39
39
QgsProcessingParameterRasterDestination
40
40
)
41
41
@@ -70,7 +70,7 @@ class RasterizeAlgorithm(QgisAlgorithm):
70
70
# used when calling the algorithm from another algorithm, or when
71
71
# calling from the QGIS console.
72
72
73
- OUTPUT_LAYER = 'OUTPUT_LAYER '
73
+ OUTPUT = 'OUTPUT '
74
74
MAP_THEME = 'MAP_THEME'
75
75
LAYER = 'LAYER'
76
76
EXTENT = 'EXTENT'
@@ -84,38 +84,54 @@ def initAlgorithm(self, config=None):
84
84
"""Here we define the inputs and output of the algorithm, along
85
85
with some other properties.
86
86
"""
87
-
88
87
# The parameters
89
- self .addParameter (
90
- QgsProcessingParameterString (self .MAP_THEME ,
91
- description = self .tr (
92
- 'Map theme to render.' ),
93
- defaultValue = None , optional = True ))
88
+ map_theme_param = QgsProcessingParameterString (
89
+ self .MAP_THEME ,
90
+ description = self .tr (
91
+ 'Map theme to render.' ),
92
+ defaultValue = None , optional = True )
93
+
94
+ map_theme_param .setMetadata (
95
+ {'widget_wrapper' : {
96
+ 'class' :
97
+ 'processing.gui.wrappers_map_theme.MapThemeWrapper' }})
98
+ self .addParameter (map_theme_param )
94
99
95
100
self .addParameter (
96
- QgsProcessingParameterRasterLayer (self .LAYER , description = self .tr (
97
- 'Layer to render. Will only be used if the map theme is not '
98
- 'set. '
99
- 'If both, map theme and layer are not '
100
- 'set, the current map content will be rendered.' ),
101
+ # TODO Why is this restricted to raster layers only? I think
102
+ # QgsProcessingParameterMapLayer makes more sense here so that
103
+ # users can choose to render single vector layers if desired.
104
+ QgsProcessingParameterRasterLayer (
105
+ self .LAYER ,
106
+ description = self .tr (
107
+ 'Layer to render. Will only be used if the map theme '
108
+ 'is not set. '
109
+ 'If both, map theme and layer are not '
110
+ 'set, the current map content will be rendered.' ),
101
111
optional = True ))
102
112
self .addParameter (
103
113
QgsProcessingParameterExtent (self .EXTENT , description = self .tr (
104
114
'The minimum extent to render. Will internally be extended to '
105
- 'be '
106
- 'a multiple of the tile sizes.' )))
115
+ 'be a multiple of the tile sizes.' )))
107
116
self .addParameter (
108
- QgsProcessingParameterNumber (self .TILE_SIZE , self .tr ('Tile size' ),
109
- defaultValue = 1024 ))
110
- self .addParameter (QgsProcessingParameterNumber (self .MAP_UNITS_PER_PIXEL ,
111
- self .tr (
112
- 'Map units per '
113
- 'pixel' ),
114
- defaultValue = 100 ))
117
+ QgsProcessingParameterNumber (
118
+ self .TILE_SIZE ,
119
+ self .tr ('Tile size' ),
120
+ defaultValue = 1024 ))
121
+
122
+ self .addParameter (QgsProcessingParameterNumber (
123
+ self .MAP_UNITS_PER_PIXEL ,
124
+ self .tr (
125
+ 'Map units per '
126
+ 'pixel' ),
127
+ defaultValue = 100 ,
128
+ minValue = 0 ,
129
+ type = QgsProcessingParameterNumber .Double
130
+ ))
115
131
116
132
# We add a raster layer as output
117
133
self .addParameter (QgsProcessingParameterRasterDestination (
118
- self .OUTPUT_LAYER ,
134
+ self .OUTPUT ,
119
135
self .tr (
120
136
'Output layer' )))
121
137
@@ -130,30 +146,64 @@ def displayName(self):
130
146
def group (self ):
131
147
return self .tr ('Raster tools' )
132
148
149
+ def tags (self ):
150
+ return self .tr ('layer,raster,convert,file,map themes,tiles' ).split (',' )
151
+
133
152
# def processAlgorithm(self, progress):
134
153
def processAlgorithm (self , parameters , context , feedback ):
135
154
"""Here is where the processing itself takes place."""
136
155
137
156
# The first thing to do is retrieve the values of the parameters
138
157
# entered by the user
139
- map_theme = self .parameterAsString (parameters , self .MAP_THEME , context )
140
- layer = self .parameterAsString (parameters , self .LAYER , context )
141
- extent = self .parameterAsExtent (parameters , self .EXTENT ,
142
- context )
143
- tile_size = self .parameterAsInt (parameters , self .TILE_SIZE , context )
144
- mupp = self .parameterAsInt (parameters , self .MAP_UNITS_PER_PIXEL , context )
145
-
146
- output_layer = self .parameterAsOutputLayer (parameters , self .OUTPUT_LAYER ,
147
- context )
158
+ map_theme = self .parameterAsString (
159
+ parameters ,
160
+ self .MAP_THEME ,
161
+ context )
162
+
163
+ layer = self .parameterAsLayer (
164
+ parameters ,
165
+ self .LAYER ,
166
+ context )
167
+
168
+ extent = self .parameterAsExtent (
169
+ parameters ,
170
+ self .EXTENT ,
171
+ context )
172
+
173
+ tile_size = self .parameterAsInt (
174
+ parameters ,
175
+ self .TILE_SIZE ,
176
+ context )
177
+
178
+ mupp = self .parameterAsDouble (
179
+ parameters ,
180
+ self .MAP_UNITS_PER_PIXEL ,
181
+ context )
182
+
183
+ output_layer = self .parameterAsOutputLayer (
184
+ parameters ,
185
+ self .OUTPUT ,
186
+ context )
187
+
188
+ print ('map_theme {}' .format (map_theme ))
189
+ print ('layer {}' .format (layer ))
190
+ print ('extent {}' .format (extent ))
191
+ print ('tile_size {}' .format (tile_size ))
192
+ print ('mupp {}' .format (mupp ))
193
+ print ('output_layer {}' .format (output_layer ))
148
194
149
195
# This probably affects the whole system but it's a lot nicer
150
196
osgeo .gdal .UseExceptions ()
151
197
152
- tile_set = TileSet (map_theme , layer , extent , tile_size , mupp , output_layer ,
198
+ tile_set = TileSet (map_theme , layer , extent , tile_size , mupp ,
199
+ output_layer ,
153
200
qgis .utils .iface .mapCanvas ().mapSettings ())
201
+ # TODO Can you add feedback as a parameter to render and add
202
+ # appropriate hooks within render to check for feedback.isCanceled()
203
+ # and abort the render early?
154
204
tile_set .render ()
155
205
156
- return {self .OUTPUT_LAYER : output_layer }
206
+ return {self .OUTPUT : output_layer }
157
207
158
208
159
209
class TileSet ():
@@ -268,14 +318,17 @@ def renderTile(self, x, y):
268
318
269
319
def getDriverForFile (self , filename ):
270
320
"""
271
- Get the GDAL driver for a filename, based on its extension. (.gpkg, .mbtiles...)
321
+ Get the GDAL driver for a filename, based on its extension. (.gpkg,
322
+ .mbtiles...)
272
323
"""
273
324
_ , extension = os .path .splitext (filename )
274
325
275
326
# If no extension is set, use .tif as default
276
327
if extension == '' :
277
328
extension = '.tif'
278
329
330
+ # TODO It should be removed and
331
+ # QgsRasterFileWriter::driverForExtension used instead.
279
332
for i in range (osgeo .gdal .GetDriverCount ()):
280
333
driver = osgeo .gdal .GetDriver (i )
281
334
if driver .GetMetadataItem ('DMD_EXTENSION' ) == extension [1 :]:
0 commit comments