Skip to content

Commit dc7b9e4

Browse files
committed
[processing] restore grid data metrics algorithm
1 parent 8c09860 commit dc7b9e4

File tree

4 files changed

+116
-81
lines changed

4 files changed

+116
-81
lines changed

python/plugins/processing/algs/gdal/GdalAlgorithmProvider.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
from .fillnodata import fillnodata
4242
from .gdaltindex import gdaltindex
4343
from .GridAverage import GridAverage
44+
from .GridDataMetrics import GridDataMetrics
4445
from .hillshade import hillshade
4546
from .information import information
4647
from .nearblack import nearblack
@@ -65,7 +66,6 @@
6566
# from .gdal2xyz import gdal2xyz
6667
# from .GridInvDist import GridInvDist
6768
# from .GridNearest import GridNearest
68-
# from .GridDataMetrics import GridDataMetrics
6969
# from .gdalcalc import gdalcalc
7070
# from .rasterize_over import rasterize_over
7171
# from .retile import retile
@@ -142,6 +142,7 @@ def loadAlgorithms(self):
142142
fillnodata(),
143143
gdaltindex(),
144144
GridAverage(),
145+
GridDataMetrics(),
145146
hillshade(),
146147
information(),
147148
nearblack(),
@@ -165,7 +166,6 @@ def loadAlgorithms(self):
165166
# gdal2xyz(),
166167
# GridInvDist(),
167168
# GridNearest(),
168-
# GridDataMetrics(),
169169
# gdalcalc(),
170170
# rasterize_over(),
171171
# retile(),

python/plugins/processing/algs/gdal/GdalUtils.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -324,6 +324,7 @@ def ogrConnectionStringAndFormat(uri, context):
324324

325325
@staticmethod
326326
def ogrLayerName(uri):
327+
uri = uri.strip('"')
327328
if os.path.isfile(uri):
328329
return os.path.basename(os.path.splitext(uri)[0])
329330

python/plugins/processing/algs/gdal/GridDataMetrics.py

Lines changed: 94 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
* *
1717
***************************************************************************
1818
"""
19-
from builtins import str
2019

2120
__author__ = 'Alexander Bruy'
2221
__date__ = 'October 2013'
@@ -30,13 +29,15 @@
3029

3130
from qgis.PyQt.QtGui import QIcon
3231

32+
from qgis.core import (QgsRasterFileWriter,
33+
QgsProcessing,
34+
QgsProcessingParameterDefinition,
35+
QgsProcessingParameterVectorLayer,
36+
QgsProcessingParameterEnum,
37+
QgsProcessingParameterField,
38+
QgsProcessingParameterNumber,
39+
QgsProcessingParameterRasterDestination)
3340
from processing.algs.gdal.GdalAlgorithm import GdalAlgorithm
34-
from processing.core.parameters import ParameterVector
35-
from processing.core.parameters import ParameterTableField
36-
from processing.core.parameters import ParameterSelection
37-
from processing.core.parameters import ParameterNumber
38-
from processing.core.outputs import OutputRaster
39-
from processing.tools import dataobjects
4041
from processing.algs.gdal.GdalUtils import GdalUtils
4142

4243

@@ -53,39 +54,78 @@ class GridDataMetrics(GdalAlgorithm):
5354
MIN_POINTS = 'MIN_POINTS'
5455
ANGLE = 'ANGLE'
5556
NODATA = 'NODATA'
57+
DATA_TYPE = 'DATA_TYPE'
5658
OUTPUT = 'OUTPUT'
57-
RTYPE = 'RTYPE'
5859

59-
TYPE = ['Byte', 'Int16', 'UInt16', 'UInt32', 'Int32', 'Float32', 'Float64']
60-
61-
DATA_METRICS = ['Minimum', 'Maximum', 'Range', 'Count', 'Average distance',
62-
'Average distance between points']
60+
TYPE = ['Byte', 'Int16', 'UInt16', 'UInt32', 'Int32', 'Float32', 'Float64', 'CInt16', 'CInt32', 'CFloat32', 'CFloat64']
6361

6462
def __init__(self):
6563
super().__init__()
6664

6765
def initAlgorithm(self, config=None):
68-
self.addParameter(ParameterVector(self.INPUT,
69-
self.tr('Input layer'), [dataobjects.TYPE_VECTOR_POINT]))
70-
self.addParameter(ParameterTableField(self.Z_FIELD,
71-
self.tr('Z field'), self.INPUT,
72-
ParameterTableField.DATA_TYPE_NUMBER, True))
73-
self.addParameter(ParameterSelection(self.METRIC,
74-
self.tr('Metrics'), self.DATA_METRICS, 0))
75-
self.addParameter(ParameterNumber(self.RADIUS_1,
76-
self.tr('Radius 1'), 0.0, 99999999.999999, 0.0))
77-
self.addParameter(ParameterNumber(self.RADIUS_2,
78-
self.tr('Radius 2'), 0.0, 99999999.999999, 0.0))
79-
self.addParameter(ParameterNumber(self.MIN_POINTS,
80-
self.tr('Min points'), 0.0, 99999999.999999, 0.0))
81-
self.addParameter(ParameterNumber(self.ANGLE,
82-
self.tr('Angle'), 0.0, 359.0, 0.0))
83-
self.addParameter(ParameterNumber(self.NODATA,
84-
self.tr('Nodata'), 0.0, 99999999.999999, 0.0))
85-
self.addParameter(ParameterSelection(self.RTYPE,
86-
self.tr('Output raster type'), self.TYPE, 5))
87-
88-
self.addOutput(OutputRaster(self.OUTPUT, self.tr('Interpolated metrics')))
66+
self.metrics = ((self.tr('Minimum'), 'minimum'),
67+
(self.tr('Maximum'), 'maximum'),
68+
(self.tr('Range'), 'range'),
69+
(self.tr('Count'), 'count'),
70+
(self.tr('Average distance'), 'average_distance'),
71+
(self.tr('Average distance between points'), 'average_distance_pts'))
72+
73+
self.addParameter(QgsProcessingParameterVectorLayer(self.INPUT,
74+
self.tr('Point layer'),
75+
[QgsProcessing.TypeVectorPoint]))
76+
77+
z_field_param = QgsProcessingParameterField(self.Z_FIELD,
78+
self.tr('Z value from field'),
79+
None,
80+
self.INPUT,
81+
QgsProcessingParameterField.Numeric,
82+
optional=True)
83+
z_field_param.setFlags(z_field_param.flags() | QgsProcessingParameterDefinition.FlagAdvanced)
84+
self.addParameter(z_field_param)
85+
86+
self.addParameter(QgsProcessingParameterEnum(self.METRIC,
87+
self.tr('Data metric to use'),
88+
options=[i[0] for i in self.metrics],
89+
allowMultiple=False,
90+
defaultValue=0))
91+
self.addParameter(QgsProcessingParameterNumber(self.RADIUS_1,
92+
self.tr('The first radius of search ellipse'),
93+
type=QgsProcessingParameterNumber.Double,
94+
minValue=0.0,
95+
maxValue=99999999.999999,
96+
defaultValue=0.0))
97+
self.addParameter(QgsProcessingParameterNumber(self.RADIUS_2,
98+
self.tr('The second radius of search ellipse'),
99+
type=QgsProcessingParameterNumber.Double,
100+
minValue=0.0,
101+
maxValue=99999999.999999,
102+
defaultValue=0.0))
103+
self.addParameter(QgsProcessingParameterNumber(self.ANGLE,
104+
self.tr('Angle of search ellipse rotation in degrees (counter clockwise)'),
105+
type=QgsProcessingParameterNumber.Double,
106+
minValue=0.0,
107+
maxValue=360.0,
108+
defaultValue=0.0))
109+
self.addParameter(QgsProcessingParameterNumber(self.MIN_POINTS,
110+
self.tr('Minimum number of data points to use'),
111+
type=QgsProcessingParameterNumber.Integer,
112+
minValue=0,
113+
maxValue=99999999,
114+
defaultValue=0))
115+
self.addParameter(QgsProcessingParameterNumber(self.NODATA,
116+
self.tr('NODATA marker to fill empty points'),
117+
type=QgsProcessingParameterNumber.Double,
118+
minValue=-99999999.999999,
119+
maxValue=99999999.999999,
120+
defaultValue=0.0))
121+
self.addParameter(QgsProcessingParameterEnum(self.DATA_TYPE,
122+
self.tr('Output data type'),
123+
self.TYPE,
124+
allowMultiple=False,
125+
defaultValue=5))
126+
127+
self.addParameter(QgsProcessingParameterRasterDestination(self.OUTPUT,
128+
self.tr('Interpolated (data metrics)')))
89129

90130
def name(self):
91131
return 'griddatametrics'
@@ -100,41 +140,35 @@ def group(self):
100140
return self.tr('Raster analysis')
101141

102142
def getConsoleCommands(self, parameters, context, feedback):
143+
inLayer = self.parameterAsVectorLayer(parameters, self.INPUT, context)
144+
connectionString = GdalUtils.ogrConnectionString(inLayer.source(), context)
145+
print(connectionString)
146+
103147
arguments = ['-l']
104-
arguments.append(
105-
os.path.basename(os.path.splitext(
106-
str(self.getParameterValue(self.INPUT)))[0]))
148+
arguments.append(GdalUtils.ogrLayerName(connectionString))
107149

108-
fieldName = self.getParameterValue(self.Z_FIELD)
109-
if fieldName is not None and fieldName != '':
150+
fieldName = self.parameterAsString(parameters, self.Z_FIELD, context)
151+
if fieldName:
110152
arguments.append('-zfield')
111153
arguments.append(fieldName)
112154

113-
metric = self.getParameterValue(self.METRIC)
114-
if metric == 0:
115-
params = 'minimum'
116-
elif metric == 1:
117-
params = 'maximum'
118-
elif metric == 2:
119-
params = 'range'
120-
elif metric == 3:
121-
params = 'count'
122-
elif metric == 4:
123-
params = 'average_distance'
124-
elif metric == 5:
125-
params = 'average_distance_pts'
126-
127-
params += ':radius1=%s' % self.getParameterValue(self.RADIUS_1)
128-
params += ':radius2=%s' % self.getParameterValue(self.RADIUS_2)
129-
params += ':angle=%s' % self.getParameterValue(self.ANGLE)
130-
params += ':min_points=%s' % self.getParameterValue(self.MIN_POINTS)
131-
params += ':nodata=%s' % self.getParameterValue(self.NODATA)
155+
params = self.metrics[self.parameterAsEnum(parameters, self.METRIC, context)][1]
156+
params += ':radius1={}'.format(self.parameterAsDouble(parameters, self.RADIUS_1, context))
157+
params += ':radius2={}'.format(self.parameterAsDouble(parameters, self.RADIUS_2, context))
158+
params += ':angle={}'.format(self.parameterAsDouble(parameters, self.ANGLE, context))
159+
params += ':min_points={}'.format(self.parameterAsInt(parameters, self.MIN_POINTS, context))
160+
params += ':nodata={}'.format(self.parameterAsDouble(parameters, self.NODATA, context))
132161

133162
arguments.append('-a')
134163
arguments.append(params)
135164
arguments.append('-ot')
136-
arguments.append(self.TYPE[self.getParameterValue(self.RTYPE)])
137-
arguments.append(str(self.getParameterValue(self.INPUT)))
138-
arguments.append(str(self.getOutputValue(self.OUTPUT)))
165+
arguments.append(self.TYPE[self.parameterAsEnum(parameters, self.DATA_TYPE, context)])
166+
167+
out = self.parameterAsOutputLayer(parameters, self.OUTPUT, context)
168+
arguments.append('-of')
169+
arguments.append(QgsRasterFileWriter.driverForExtension(os.path.splitext(out)[1]))
170+
171+
arguments.append(connectionString)
172+
arguments.append(out)
139173

140174
return ['gdal_grid', GdalUtils.escapeAndJoin(arguments)]

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

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -395,6 +395,25 @@ tests:
395395
hash: 3542d928bccee955b1c426cac7b698c603c9a385429ca529758083bf
396396
type: rasterhash
397397

398+
- algorithm: gdal:griddatametrics
399+
name: Data Metrics interpolation
400+
params:
401+
ANGLE: 0.0
402+
INPUT:
403+
name: custom/points_values.gml
404+
type: vector
405+
METRIC: '1'
406+
MIN_POINTS: 0.0
407+
NODATA: 0.0
408+
RADIUS_1: 0.01
409+
RADIUS_2: 0.02
410+
RTYPE: '5'
411+
Z_FIELD: EC
412+
results:
413+
OUTPUT:
414+
hash: 220953299b18286b57ce093a054323e59add7c78c0429a02e51b4ad4
415+
type: rasterhash
416+
398417
# - algorithm: gdal:merge
399418
# name: Merge 2 raster layers
400419
# params:
@@ -483,25 +502,6 @@ tests:
483502
# hash: 2033731d6fd653da391a2633158f0ea755d96e1b2b2c60a9100332b1
484503
# type: rasterhash
485504
#
486-
# - algorithm: gdal:griddatametrics
487-
# name: Data Metrics interpolation
488-
# params:
489-
# ANGLE: 0.0
490-
# INPUT:
491-
# name: custom/points_values.gml
492-
# type: vector
493-
# METRIC: '1'
494-
# MIN_POINTS: 0.0
495-
# NODATA: 0.0
496-
# RADIUS_1: 0.01
497-
# RADIUS_2: 0.02
498-
# RTYPE: '5'
499-
# Z_FIELD: EC
500-
# results:
501-
# OUTPUT:
502-
# hash: 220953299b18286b57ce093a054323e59add7c78c0429a02e51b4ad4
503-
# type: rasterhash
504-
#
505505
# - algorithm: gdal:gridnearestneighbor
506506
# name: Nearest Neighbor interpolation
507507
# params:

0 commit comments

Comments
 (0)