25
25
26
26
__revision__ = '$Format:%H$'
27
27
28
- from osgeo import gdal
28
+ import math
29
+ import struct
29
30
30
- from qgis .core import (QgsProcessingParameterRasterLayer ,
31
+ from qgis .core import (Qgis ,
32
+ QgsRasterBlock ,
33
+ QgsRasterFileWriter ,
34
+ QgsProcessingParameterExtent ,
31
35
QgsProcessingParameterNumber ,
36
+ QgsProcessingParameterCrs ,
32
37
QgsProcessingParameterRasterDestination )
33
38
from processing .algs .qgis .QgisAlgorithm import QgisAlgorithm
34
- from processing .tools . raster import RasterWriter
39
+ from processing .tools import raster
35
40
36
41
37
42
class CreateConstantRaster (QgisAlgorithm ):
38
43
39
- INPUT = 'INPUT'
40
- OUTPUT = 'OUTPUT'
44
+ EXTENT = 'EXTENT'
45
+ TARGET_CRS = 'TARGET_CRS'
46
+ PIXEL_SIZE = 'PIXEL_SIZE'
41
47
NUMBER = 'NUMBER'
48
+ OUTPUT = 'OUTPUT'
42
49
43
50
def group (self ):
44
51
return self .tr ('Raster tools' )
@@ -47,10 +54,18 @@ def __init__(self):
47
54
super ().__init__ ()
48
55
49
56
def initAlgorithm (self , config = None ):
50
- self .addParameter (QgsProcessingParameterRasterLayer (self .INPUT ,
51
- self .tr ('Reference layer' )))
57
+ self .addParameter (QgsProcessingParameterExtent (self .EXTENT ,
58
+ self .tr ('Desired extent' )))
59
+ self .addParameter (QgsProcessingParameterCrs (self .TARGET_CRS ,
60
+ self .tr ('Target CRS' ),
61
+ 'ProjectCrs' ))
62
+ self .addParameter (QgsProcessingParameterNumber (self .PIXEL_SIZE ,
63
+ self .tr ('Pixel size' ),
64
+ QgsProcessingParameterNumber .Double ,
65
+ defaultValue = 0.1 ))
52
66
self .addParameter (QgsProcessingParameterNumber (self .NUMBER ,
53
- self .tr ('Constant value' ), QgsProcessingParameterNumber .Double ,
67
+ self .tr ('Constant value' ),
68
+ QgsProcessingParameterNumber .Double ,
54
69
defaultValue = 1 ))
55
70
self .addParameter (QgsProcessingParameterRasterDestination (self .OUTPUT , self .tr ('Constant' )))
56
71
@@ -61,28 +76,35 @@ def displayName(self):
61
76
return self .tr ('Create constant raster layer' )
62
77
63
78
def processAlgorithm (self , parameters , context , feedback ):
64
- layer = self .parameterAsRasterLayer (parameters , self .INPUT , context )
79
+ extent = self .parameterAsExtent (parameters , self .EXTENT , context )
80
+ crs = self .parameterAsCrs (parameters , self .TARGET_CRS , context )
65
81
value = self .parameterAsDouble (parameters , self .NUMBER , context )
82
+ pixelSize = self .parameterAsDouble (parameters , self .PIXEL_SIZE , context )
66
83
67
84
outputFile = self .parameterAsOutputLayer (parameters , self .OUTPUT , context )
85
+ outputFormat = raster .formatShortNameFromFileName (outputFile )
86
+
87
+ rows = max ([math .ceil (extent .height () / pixelSize ) + 1 , 1.0 ])
88
+ cols = max ([math .ceil (extent .width () / pixelSize ) + 1 , 1.0 ])
89
+
90
+ writer = QgsRasterFileWriter (outputFile )
91
+ writer .setOutputProviderKey ('gdal' )
92
+ writer .setOutputFormat (outputFormat )
93
+ provider = writer .createOneBandRaster (Qgis .Float32 , cols , rows , extent , crs )
94
+ provider .setNoDataValue (1 , - 9999 )
95
+
96
+ data = [value ] * cols
97
+ block = QgsRasterBlock (Qgis .Float32 , cols , 1 )
98
+ block .setData (struct .pack ('{}f' .format (len (data )), * data ))
99
+
100
+ total = 100.0 / rows if rows else 0
101
+ for i in range (rows ):
102
+ if feedback .isCanceled ():
103
+ break
104
+
105
+ provider .writeBlock (block , 1 , 0 , i )
106
+ feedback .setProgress (int (i * rows ))
68
107
69
- raster = gdal .Open (layer .source (), gdal .GA_ReadOnly )
70
- geoTransform = raster .GetGeoTransform ()
71
-
72
- cellsize = (layer .extent ().xMaximum () - layer .extent ().xMinimum ()) \
73
- / layer .width ()
74
-
75
- w = RasterWriter (outputFile ,
76
- layer .extent ().xMinimum (),
77
- layer .extent ().yMinimum (),
78
- layer .extent ().xMaximum (),
79
- layer .extent ().yMaximum (),
80
- cellsize ,
81
- 1 ,
82
- layer .crs (),
83
- geoTransform
84
- )
85
- w .matrix .fill (value )
86
- w .close ()
108
+ provider .setEditable (False )
87
109
88
110
return {self .OUTPUT : outputFile }
0 commit comments