Skip to content

Commit c373c8b

Browse files
authored
Merge pull request #4948 from alexbruy/processing-raster
[processing] restore and improve some raster algorithms
2 parents 0328b7a + 79adad7 commit c373c8b

File tree

18 files changed

+224
-215
lines changed

18 files changed

+224
-215
lines changed

python/core/raster/qgsrasterfilewriter.sip

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,15 @@ class QgsRasterFileWriter
156156
:rtype: list of str
157157
%End
158158

159+
static QString driverForExtension( const QString &extension );
160+
%Docstring
161+
Returns the GDAL driver name for a specified file ``extension``. E.g. the
162+
driver name for the ".tif" extension is "GTiff".
163+
If no suitable drivers are found then an empty string is returned.
164+
.. versionadded:: 3.0
165+
:rtype: str
166+
%End
167+
159168
};
160169

161170
/************************************************************************

python/plugins/processing/algs/help/qgis.yaml

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -467,9 +467,7 @@ qgis:rasterlayerhistogram: >
467467
The raster layer must have a single band.
468468

469469
qgis:rasterlayerstatistics: >
470-
This algorithm computes basic statistics from the values in a raster layer.
471-
472-
The raster layer must have a single band.
470+
This algorithm computes basic statistics from the values in a given band of the raster layer.
473471

474472
qgis:refactorfields: >
475473
This algorithm allows editing the structure of the attributes table of a vector layer. Fields can be modified in their type and name, using a fields mapping.

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,11 @@
3030
from qgis.PyQt.QtGui import QIcon
3131

3232
from qgis.analysis import QgsAspectFilter
33-
from qgis.core import (QgsProcessingParameterRasterLayer,
33+
from qgis.core import (QgsRasterFileWriter,
34+
QgsProcessingParameterRasterLayer,
3435
QgsProcessingParameterNumber,
3536
QgsProcessingParameterRasterDestination)
3637
from processing.algs.qgis.QgisAlgorithm import QgisAlgorithm
37-
from processing.tools import raster
3838
from processing.tools.dataobjects import exportRasterLayer
3939

4040
pluginPath = os.path.split(os.path.split(os.path.dirname(__file__))[0])[0]
@@ -75,7 +75,7 @@ def processAlgorithm(self, parameters, context, feedback):
7575

7676
outputFile = self.parameterAsOutputLayer(parameters, self.OUTPUT, context)
7777

78-
outputFormat = raster.formatShortNameFromFileName(outputFile)
78+
outputFormat = QgsRasterFileWriter.driverForExtension(os.path.splitext(outputFile)[1])
7979

8080
aspect = QgsAspectFilter(inputFile, outputFile, outputFormat)
8181
aspect.setZFactor(zFactor)

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

Lines changed: 50 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -25,20 +25,27 @@
2525

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

28-
from osgeo import gdal
29-
30-
from qgis.core import (QgsProcessingParameterRasterLayer,
28+
import os
29+
import math
30+
import struct
31+
32+
from qgis.core import (Qgis,
33+
QgsRasterBlock,
34+
QgsRasterFileWriter,
35+
QgsProcessingParameterExtent,
3136
QgsProcessingParameterNumber,
37+
QgsProcessingParameterCrs,
3238
QgsProcessingParameterRasterDestination)
3339
from processing.algs.qgis.QgisAlgorithm import QgisAlgorithm
34-
from processing.tools.raster import RasterWriter
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+
0.1, False, 0.01, 999))
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 = QgsRasterFileWriter.driverForExtension(os.path.splitext(outputFile)[1])
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}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
from qgis.PyQt.QtGui import QIcon
3232

3333
from qgis.core import (QgsFeatureRequest,
34+
QgsRasterFileWriter,
3435
QgsProcessing,
3536
QgsProcessingException,
3637
QgsProcessingParameterFeatureSource,
@@ -43,7 +44,6 @@
4344
from qgis.analysis import QgsKernelDensityEstimation
4445

4546
from processing.algs.qgis.QgisAlgorithm import QgisAlgorithm
46-
from processing.tools import raster
4747

4848
pluginPath = os.path.split(os.path.split(os.path.dirname(__file__))[0])[0]
4949

@@ -175,7 +175,7 @@ def processAlgorithm(self, parameters, context, feedback):
175175
decay = self.parameterAsDouble(parameters, self.DECAY, context)
176176
output_values = self.parameterAsEnum(parameters, self.OUTPUT_VALUE, context)
177177
outputFile = self.parameterAsOutputLayer(parameters, self.OUTPUT, context)
178-
output_format = raster.formatShortNameFromFileName(outputFile)
178+
output_format = QgsRasterFileWriter.driverForExtension(os.path.splitext(outputFile)[1])
179179
weight_field = self.parameterAsString(parameters, self.WEIGHT_FIELD, context)
180180
radius_field = self.parameterAsString(parameters, self.RADIUS_FIELD, context)
181181

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

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,11 @@
3030
from qgis.PyQt.QtGui import QIcon
3131

3232
from qgis.analysis import QgsHillshadeFilter
33-
from qgis.core import (QgsProcessingParameterRasterLayer,
33+
from qgis.core import (QgsRasterFileWriter,
34+
QgsProcessingParameterRasterLayer,
3435
QgsProcessingParameterNumber,
3536
QgsProcessingParameterRasterDestination)
3637
from processing.algs.qgis.QgisAlgorithm import QgisAlgorithm
37-
from processing.tools import raster
3838
from processing.tools.dataobjects import exportRasterLayer
3939

4040
pluginPath = os.path.split(os.path.split(os.path.dirname(__file__))[0])[0]
@@ -84,8 +84,7 @@ def processAlgorithm(self, parameters, context, feedback):
8484
vAngle = self.parameterAsDouble(parameters, self.V_ANGLE, context)
8585

8686
outputFile = self.parameterAsOutputLayer(parameters, self.OUTPUT, context)
87-
88-
outputFormat = raster.formatShortNameFromFileName(outputFile)
87+
outputFormat = QgsRasterFileWriter.driverForExtension(os.path.splitext(outputFile)[1])
8988

9089
hillshade = QgsHillshadeFilter(inputFile, outputFile, outputFormat, azimuth, vAngle)
9190
hillshade.setZFactor(zFactor)

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,7 @@
9999
from .RandomPointsExtent import RandomPointsExtent
100100
from .RandomPointsLayer import RandomPointsLayer
101101
from .RandomPointsPolygons import RandomPointsPolygons
102+
from .RasterLayerStatistics import RasterLayerStatistics
102103
from .RegularPoints import RegularPoints
103104
from .ReverseLineDirection import ReverseLineDirection
104105
from .Ruggedness import Ruggedness
@@ -144,7 +145,6 @@
144145
# from .HubDistanceLines import HubDistanceLines
145146
# from .HubLines import HubLines
146147
# from .GeometryConvert import GeometryConvert
147-
# from .RasterLayerStatistics import RasterLayerStatistics
148148
# from .StatisticsByCategories import StatisticsByCategories
149149
# from .FieldsCalculator import FieldsCalculator
150150
# from .FieldPyculator import FieldsPyculator
@@ -270,6 +270,7 @@ def getAlgs(self):
270270
RandomPointsExtent(),
271271
RandomPointsLayer(),
272272
RandomPointsPolygons(),
273+
RasterLayerStatistics(),
273274
RegularPoints(),
274275
ReverseLineDirection(),
275276
Ruggedness(),

0 commit comments

Comments
 (0)