Skip to content

Commit 19d8605

Browse files
authored
Merge pull request #8770 from alexbruy/processing-backports
[processing] Add cell size parameter to native interpolation algorithms (fix #18556, #20114)
2 parents d5029f4 + 580ff83 commit 19d8605

File tree

7 files changed

+549
-270
lines changed

7 files changed

+549
-270
lines changed

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

Lines changed: 33 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -31,62 +31,26 @@
3131

3232
from qgis.core import (QgsRectangle,
3333
QgsProcessingUtils,
34-
QgsProcessingParameterDefinition,
3534
QgsProcessingParameterNumber,
3635
QgsProcessingParameterExtent,
36+
QgsProcessingParameterDefinition,
3737
QgsProcessingParameterRasterDestination,
3838
QgsProcessingException)
3939
from qgis.analysis import (QgsInterpolator,
4040
QgsIDWInterpolator,
4141
QgsGridFileWriter)
4242

4343
from processing.algs.qgis.QgisAlgorithm import QgisAlgorithm
44+
from processing.algs.qgis.ui.InterpolationWidgets import ParameterInterpolationData, ParameterPixelSize
4445

4546
pluginPath = os.path.split(os.path.split(os.path.dirname(__file__))[0])[0]
4647

4748

48-
class ParameterInterpolationData(QgsProcessingParameterDefinition):
49-
50-
def __init__(self, name='', description=''):
51-
super().__init__(name, description)
52-
self.setMetadata({
53-
'widget_wrapper': 'processing.algs.qgis.ui.InterpolationDataWidget.InterpolationDataWidgetWrapper'
54-
})
55-
56-
def type(self):
57-
return 'idw_interpolation_data'
58-
59-
def clone(self):
60-
return ParameterInterpolationData(self.name(), self.description())
61-
62-
@staticmethod
63-
def parseValue(value):
64-
if value is None:
65-
return None
66-
67-
if value == '':
68-
return None
69-
70-
if isinstance(value, str):
71-
return value if value != '' else None
72-
else:
73-
return ParameterInterpolationData.dataToString(value)
74-
75-
@staticmethod
76-
def dataToString(data):
77-
s = ''
78-
for c in data:
79-
s += '{}::~::{}::~::{:d}::~::{:d};'.format(c[0],
80-
c[1],
81-
c[2],
82-
c[3])
83-
return s[:-1]
84-
85-
8649
class IdwInterpolation(QgisAlgorithm):
8750

8851
INTERPOLATION_DATA = 'INTERPOLATION_DATA'
8952
DISTANCE_COEFFICIENT = 'DISTANCE_COEFFICIENT'
53+
PIXEL_SIZE = 'PIXEL_SIZE'
9054
COLUMNS = 'COLUMNS'
9155
ROWS = 'ROWS'
9256
EXTENT = 'EXTENT'
@@ -111,15 +75,31 @@ def initAlgorithm(self, config=None):
11175
self.addParameter(QgsProcessingParameterNumber(self.DISTANCE_COEFFICIENT,
11276
self.tr('Distance coefficient P'), type=QgsProcessingParameterNumber.Double,
11377
minValue=0.0, maxValue=99.99, defaultValue=2.0))
114-
self.addParameter(QgsProcessingParameterNumber(self.COLUMNS,
115-
self.tr('Number of columns'),
116-
minValue=0, maxValue=10000000, defaultValue=300))
117-
self.addParameter(QgsProcessingParameterNumber(self.ROWS,
118-
self.tr('Number of rows'),
119-
minValue=0, maxValue=10000000, defaultValue=300))
12078
self.addParameter(QgsProcessingParameterExtent(self.EXTENT,
12179
self.tr('Extent'),
12280
optional=False))
81+
pixel_size_param = ParameterPixelSize(self.PIXEL_SIZE,
82+
self.tr('Output raster size'),
83+
layersData=self.INTERPOLATION_DATA,
84+
extent=self.EXTENT,
85+
minValue=0.0,
86+
default=0.1)
87+
self.addParameter(pixel_size_param)
88+
89+
cols_param = QgsProcessingParameterNumber(self.COLUMNS,
90+
self.tr('Number of columns'),
91+
optional=True,
92+
minValue=0, maxValue=10000000)
93+
cols_param.setFlags(cols_param.flags() | QgsProcessingParameterDefinition.FlagHidden)
94+
self.addParameter(cols_param)
95+
96+
rows_param = QgsProcessingParameterNumber(self.ROWS,
97+
self.tr('Number of rows'),
98+
optional=True,
99+
minValue=0, maxValue=10000000)
100+
rows_param.setFlags(rows_param.flags() | QgsProcessingParameterDefinition.FlagHidden)
101+
self.addParameter(rows_param)
102+
123103
self.addParameter(QgsProcessingParameterRasterDestination(self.OUTPUT,
124104
self.tr('Interpolated')))
125105

@@ -132,11 +112,17 @@ def displayName(self):
132112
def processAlgorithm(self, parameters, context, feedback):
133113
interpolationData = ParameterInterpolationData.parseValue(parameters[self.INTERPOLATION_DATA])
134114
coefficient = self.parameterAsDouble(parameters, self.DISTANCE_COEFFICIENT, context)
135-
columns = self.parameterAsInt(parameters, self.COLUMNS, context)
136-
rows = self.parameterAsInt(parameters, self.ROWS, context)
137115
bbox = self.parameterAsExtent(parameters, self.EXTENT, context)
116+
pixel_size = self.parameterAsDouble(parameters, self.PIXEL_SIZE, context)
138117
output = self.parameterAsOutputLayer(parameters, self.OUTPUT, context)
139118

119+
columns = self.parameterAsInt(parameters, self.COLUMNS, context)
120+
rows = self.parameterAsInt(parameters, self.ROWS, context)
121+
if columns == 0:
122+
columns = max(round(bbox.width() / pixel_size) + 1, 1)
123+
if rows == 0:
124+
rows = max(round(bbox.height() / pixel_size) + 1, 1)
125+
140126
if interpolationData is None:
141127
raise QgsProcessingException(
142128
self.tr('You need to specify at least one input layer.'))

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

Lines changed: 33 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,10 @@
3131

3232
from qgis.core import (QgsProcessingUtils,
3333
QgsProcessing,
34-
QgsProcessingParameterDefinition,
3534
QgsProcessingParameterEnum,
3635
QgsProcessingParameterNumber,
3736
QgsProcessingParameterExtent,
37+
QgsProcessingParameterDefinition,
3838
QgsProcessingParameterRasterDestination,
3939
QgsWkbTypes,
4040
QgsProcessingParameterFeatureSink,
@@ -45,51 +45,15 @@
4545
QgsGridFileWriter)
4646

4747
from processing.algs.qgis.QgisAlgorithm import QgisAlgorithm
48+
from processing.algs.qgis.ui.InterpolationWidgets import ParameterInterpolationData, ParameterPixelSize
4849

4950
pluginPath = os.path.split(os.path.split(os.path.dirname(__file__))[0])[0]
5051

5152

52-
class ParameterInterpolationData(QgsProcessingParameterDefinition):
53-
54-
def __init__(self, name='', description=''):
55-
super().__init__(name, description)
56-
self.setMetadata({
57-
'widget_wrapper': 'processing.algs.qgis.ui.InterpolationDataWidget.InterpolationDataWidgetWrapper'
58-
})
59-
60-
def type(self):
61-
return 'tin_interpolation_data'
62-
63-
def clone(self):
64-
return ParameterInterpolationData(self.name(), self.description())
65-
66-
@staticmethod
67-
def parseValue(value):
68-
if value is None:
69-
return None
70-
71-
if value == '':
72-
return None
73-
74-
if isinstance(value, str):
75-
return value if value != '' else None
76-
else:
77-
return ParameterInterpolationData.dataToString(value)
78-
79-
@staticmethod
80-
def dataToString(data):
81-
s = ''
82-
for c in data:
83-
s += '{}::~:: {}::~:: {:d}::~:: {:d};'.format(c[0],
84-
c[1],
85-
c[2],
86-
c[3])
87-
return s[:-1]
88-
89-
9053
class TinInterpolation(QgisAlgorithm):
9154
INTERPOLATION_DATA = 'INTERPOLATION_DATA'
9255
METHOD = 'METHOD'
56+
PIXEL_SIZE = 'PIXEL_SIZE'
9357
COLUMNS = 'COLUMNS'
9458
ROWS = 'ROWS'
9559
EXTENT = 'EXTENT'
@@ -119,15 +83,31 @@ def initAlgorithm(self, config=None):
11983
self.tr('Interpolation method'),
12084
options=self.METHODS,
12185
defaultValue=0))
122-
self.addParameter(QgsProcessingParameterNumber(self.COLUMNS,
123-
self.tr('Number of columns'),
124-
minValue=0, maxValue=10000000, defaultValue=300))
125-
self.addParameter(QgsProcessingParameterNumber(self.ROWS,
126-
self.tr('Number of rows'),
127-
minValue=0, maxValue=10000000, defaultValue=300))
12886
self.addParameter(QgsProcessingParameterExtent(self.EXTENT,
12987
self.tr('Extent'),
13088
optional=False))
89+
pixel_size_param = ParameterPixelSize(self.PIXEL_SIZE,
90+
self.tr('Output raster size'),
91+
layersData=self.INTERPOLATION_DATA,
92+
extent=self.EXTENT,
93+
minValue=0.0,
94+
default=0.1)
95+
self.addParameter(pixel_size_param)
96+
97+
cols_param = QgsProcessingParameterNumber(self.COLUMNS,
98+
self.tr('Number of columns'),
99+
optional=True,
100+
minValue=0, maxValue=10000000)
101+
cols_param.setFlags(cols_param.flags() | QgsProcessingParameterDefinition.FlagHidden)
102+
self.addParameter(cols_param)
103+
104+
rows_param = QgsProcessingParameterNumber(self.ROWS,
105+
self.tr('Number of rows'),
106+
optional=True,
107+
minValue=0, maxValue=10000000)
108+
rows_param.setFlags(rows_param.flags() | QgsProcessingParameterDefinition.FlagHidden)
109+
self.addParameter(rows_param)
110+
131111
self.addParameter(QgsProcessingParameterRasterDestination(self.OUTPUT,
132112
self.tr('Interpolated')))
133113

@@ -147,11 +127,17 @@ def displayName(self):
147127
def processAlgorithm(self, parameters, context, feedback):
148128
interpolationData = ParameterInterpolationData.parseValue(parameters[self.INTERPOLATION_DATA])
149129
method = self.parameterAsEnum(parameters, self.METHOD, context)
150-
columns = self.parameterAsInt(parameters, self.COLUMNS, context)
151-
rows = self.parameterAsInt(parameters, self.ROWS, context)
152130
bbox = self.parameterAsExtent(parameters, self.EXTENT, context)
131+
pixel_size = self.parameterAsDouble(parameters, self.PIXEL_SIZE, context)
153132
output = self.parameterAsOutputLayer(parameters, self.OUTPUT, context)
154133

134+
columns = self.parameterAsInt(parameters, self.COLUMNS, context)
135+
rows = self.parameterAsInt(parameters, self.ROWS, context)
136+
if columns == 0:
137+
columns = max(round(bbox.width() / pixel_size) + 1, 1)
138+
if rows == 0:
139+
rows = max(round(bbox.height() / pixel_size) + 1, 1)
140+
155141
if interpolationData is None:
156142
raise QgsProcessingException(
157143
self.tr('You need to specify at least one input layer.'))

0 commit comments

Comments
 (0)