Skip to content

Commit fa0bb2e

Browse files
committed
[processing] improve Create constant raster algorithm
1 parent 0328b7a commit fa0bb2e

File tree

4 files changed

+53
-42
lines changed

4 files changed

+53
-42
lines changed

python/plugins/processing/algs/qgis/CreateConstantRaster.py

+49-27
Original file line numberDiff line numberDiff line change
@@ -25,20 +25,27 @@
2525

2626
__revision__ = '$Format:%H$'
2727

28-
from osgeo import gdal
28+
import math
29+
import struct
2930

30-
from qgis.core import (QgsProcessingParameterRasterLayer,
31+
from qgis.core import (Qgis,
32+
QgsRasterBlock,
33+
QgsRasterFileWriter,
34+
QgsProcessingParameterExtent,
3135
QgsProcessingParameterNumber,
36+
QgsProcessingParameterCrs,
3237
QgsProcessingParameterRasterDestination)
3338
from processing.algs.qgis.QgisAlgorithm import QgisAlgorithm
34-
from processing.tools.raster import RasterWriter
39+
from processing.tools import raster
3540

3641

3742
class CreateConstantRaster(QgisAlgorithm):
3843

39-
INPUT = 'INPUT'
40-
OUTPUT = 'OUTPUT'
44+
EXTENT = 'EXTENT'
45+
TARGET_CRS = 'TARGET_CRS'
46+
PIXEL_SIZE = 'PIXEL_SIZE'
4147
NUMBER = 'NUMBER'
48+
OUTPUT = 'OUTPUT'
4249

4350
def group(self):
4451
return self.tr('Raster tools')
@@ -47,10 +54,18 @@ def __init__(self):
4754
super().__init__()
4855

4956
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))
5266
self.addParameter(QgsProcessingParameterNumber(self.NUMBER,
53-
self.tr('Constant value'), QgsProcessingParameterNumber.Double,
67+
self.tr('Constant value'),
68+
QgsProcessingParameterNumber.Double,
5469
defaultValue=1))
5570
self.addParameter(QgsProcessingParameterRasterDestination(self.OUTPUT, self.tr('Constant')))
5671

@@ -61,28 +76,35 @@ def displayName(self):
6176
return self.tr('Create constant raster layer')
6277

6378
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)
6581
value = self.parameterAsDouble(parameters, self.NUMBER, context)
82+
pixelSize = self.parameterAsDouble(parameters, self.PIXEL_SIZE, context)
6683

6784
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))
68107

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)
87109

88110
return {self.OUTPUT: outputFile}
Binary file not shown.

python/plugins/processing/tests/testdata/expected/constant_raster.tif.aux.xml

-10
This file was deleted.

python/plugins/processing/tests/testdata/qgis_algorithm_tests.yaml

+4-5
Original file line numberDiff line numberDiff line change
@@ -1223,16 +1223,15 @@ tests:
12231223
- algorithm: qgis:createconstantrasterlayer
12241224
name: Create constant raster
12251225
params:
1226-
INPUT:
1227-
name: raster.tif
1228-
type: raster
1226+
EXTENT: 270736.0673250682,270899.8544675339,4458899.000550019,4459029.574521748
1227+
TARGET_CRS: EPSG:23030
1228+
PIXEL_SIZE: 10.0
12291229
NUMBER: 3.0
12301230
results:
12311231
OUTPUT:
1232-
hash: 4cb3e82e8512cdbb75d9c39a10adc818dd6842c5dc6361fbc43dd9aa
1232+
hash: e453e9e36ce314d5197963ac27872a0cc3dfe43764ed586a334c66f0
12331233
type: rasterhash
12341234

1235-
12361235
# Case 1: Keep all fields
12371236
- algorithm: qgis:lineintersections
12381237
name: Line Intersection Keep All Fields from Both

0 commit comments

Comments
 (0)