8
8
copyright : (C) 2016 by OPENGIS.ch
9
9
email : matthias@opengis.ch
10
10
***************************************************************************/
11
-
12
11
/***************************************************************************
13
12
* *
14
13
* This program is free software; you can redistribute it and/or modify *
32
31
QgsProcessingParameterExtent ,
33
32
QgsProcessingParameterString ,
34
33
QgsProcessingParameterNumber ,
34
+ QgsProcessingParameterBoolean ,
35
35
QgsProcessingParameterMapLayer ,
36
36
QgsProcessingParameterRasterDestination ,
37
37
QgsRasterFileWriter
@@ -75,6 +75,7 @@ class RasterizeAlgorithm(QgisAlgorithm):
75
75
EXTENT = 'EXTENT'
76
76
TILE_SIZE = 'TILE_SIZE'
77
77
MAP_UNITS_PER_PIXEL = 'MAP_UNITS_PER_PIXEL'
78
+ MAKE_BACKGROUND_TRANSPARENT = 'MAKE_BACKGROUND_TRANSPARENT'
78
79
79
80
def __init__ (self ):
80
81
super ().__init__ ()
@@ -104,6 +105,12 @@ def initAlgorithm(self, config=None):
104
105
type = QgsProcessingParameterNumber .Double
105
106
))
106
107
108
+ self .addParameter (
109
+ QgsProcessingParameterBoolean (
110
+ self .MAKE_BACKGROUND_TRANSPARENT ,
111
+ self .tr ('Make background transparent' ),
112
+ defaultValue = False ))
113
+
107
114
map_theme_param = QgsProcessingParameterString (
108
115
self .MAP_THEME ,
109
116
description = self .tr (
@@ -129,6 +136,7 @@ def initAlgorithm(self, config=None):
129
136
self .tr (
130
137
'Output layer' )))
131
138
139
+
132
140
def name (self ):
133
141
# Unique (non-user visible) name of algorithm
134
142
return 'rasterize'
@@ -172,6 +180,11 @@ def processAlgorithm(self, parameters, context, feedback):
172
180
self .TILE_SIZE ,
173
181
context )
174
182
183
+ make_trans = self .parameterAsBool (
184
+ parameters ,
185
+ self .MAKE_BACKGROUND_TRANSPARENT ,
186
+ context )
187
+
175
188
mupp = self .parameterAsDouble (
176
189
parameters ,
177
190
self .MAP_UNITS_PER_PIXEL ,
@@ -183,9 +196,9 @@ def processAlgorithm(self, parameters, context, feedback):
183
196
context )
184
197
185
198
tile_set = TileSet (map_theme , layer , extent , tile_size , mupp ,
186
- output_layer ,
199
+ output_layer , make_trans ,
187
200
qgis .utils .iface .mapCanvas ().mapSettings ())
188
- tile_set .render (feedback )
201
+ tile_set .render (feedback , make_trans )
189
202
190
203
return {self .OUTPUT : output_layer }
191
204
@@ -197,9 +210,8 @@ class TileSet():
197
210
"""
198
211
199
212
def __init__ (self , map_theme , layer , extent , tile_size , mupp , output ,
200
- map_settings ):
213
+ make_trans , map_settings ):
201
214
"""
202
-
203
215
:param map_theme:
204
216
:param extent:
205
217
:param layer:
@@ -228,22 +240,32 @@ def __init__(self, map_theme, layer, extent, tile_size, mupp, output,
228
240
xsize = self .x_tile_count * tile_size
229
241
ysize = self .y_tile_count * tile_size
230
242
231
- self .dataset = driver .Create (output , xsize , ysize , 4 ) # 4 bands
243
+ if make_trans :
244
+ no_bands = 4
245
+ else :
246
+ no_bands = 3
247
+
248
+ self .dataset = driver .Create (output , xsize , ysize , no_bands )
232
249
self .dataset .SetProjection (str (crs .toWkt ()))
233
250
self .dataset .SetGeoTransform (
234
251
[extent .xMinimum (), mupp , 0 , extent .yMaximum (), 0 , - mupp ])
235
-
252
+
236
253
self .image = QImage (QSize (tile_size , tile_size ), QImage .Format_ARGB32 )
237
254
238
255
self .settings = QgsMapSettings ()
239
256
self .settings .setOutputDpi (self .image .logicalDpiX ())
240
257
self .settings .setOutputImageFormat (QImage .Format_ARGB32 )
241
258
self .settings .setDestinationCrs (crs )
242
259
self .settings .setOutputSize (self .image .size ())
243
- self .settings .setBackgroundColor (QColor (255 ,255 ,255 ,0 ))
244
260
self .settings .setFlag (QgsMapSettings .Antialiasing , True )
245
261
self .settings .setFlag (QgsMapSettings .RenderMapTile , True )
262
+ self .settings .setFlag (QgsMapSettings .UseAdvancedEffects , True )
246
263
264
+ if make_trans :
265
+ self .settings .setBackgroundColor (QColor (255 , 255 , 255 , 0 ))
266
+ else :
267
+ self .settings .setBackgroundColor (QColor (255 , 255 , 255 ))
268
+
247
269
if QgsProject .instance ().mapThemeCollection ().hasMapTheme (map_theme ):
248
270
self .settings .setLayers (
249
271
QgsProject .instance ().mapThemeCollection (
@@ -260,28 +282,31 @@ def __init__(self, map_theme, layer, extent, tile_size, mupp, output,
260
282
else :
261
283
self .settings .setLayers (map_settings .layers ())
262
284
263
- def render (self , feedback ):
285
+ def render (self , feedback , make_trans ):
264
286
for x in range (self .x_tile_count ):
265
287
for y in range (self .y_tile_count ):
266
288
if feedback .isCanceled ():
267
289
return
268
290
cur_tile = x * self .y_tile_count + y
269
291
num_tiles = self .x_tile_count * self .y_tile_count
270
- self .renderTile (x , y , feedback )
292
+ self .renderTile (x , y , feedback , make_trans )
271
293
272
294
feedback .setProgress (int ((cur_tile / num_tiles ) * 100 ))
273
295
274
- def renderTile (self , x , y , feedback ):
296
+ def renderTile (self , x , y , feedback , make_trans ):
275
297
"""
276
298
Render one tile
277
-
278
299
:param x: The x index of the current tile
279
300
:param y: The y index of the current tile
280
301
"""
281
302
282
- background_colour = QColor (255 ,255 ,255 ,0 )
283
- self .image .fill (background_colour .rgba ())
284
-
303
+ if make_trans :
304
+ background_color = QColor (255 , 255 , 255 , 0 )
305
+ self .image .fill (background_color .rgba ())
306
+ else :
307
+ background_color = QColor (255 , 255 , 255 )
308
+ self .image .fill (background_color .rgb ())
309
+
285
310
painter = QPainter (self .image )
286
311
287
312
self .settings .setExtent (QgsRectangle (
@@ -293,7 +318,7 @@ def renderTile(self, x, y, feedback):
293
318
job = QgsMapRendererCustomPainterJob (self .settings , painter )
294
319
job .renderSynchronously ()
295
320
painter .end ()
296
-
321
+
297
322
# Needs not to be deleted or Windows will kill it too early...
298
323
tmpfile = tempfile .NamedTemporaryFile (suffix = '.png' , delete = False )
299
324
try :
0 commit comments