3131
3232from qgis .core import (QgsRectangle ,
3333 QgsProcessingUtils ,
34- QgsProcessingParameterDefinition ,
3534 QgsProcessingParameterNumber ,
3635 QgsProcessingParameterExtent ,
36+ QgsProcessingParameterDefinition ,
3737 QgsProcessingParameterRasterDestination ,
3838 QgsProcessingException )
3939from qgis .analysis import (QgsInterpolator ,
4040 QgsIDWInterpolator ,
4141 QgsGridFileWriter )
4242
4343from processing .algs .qgis .QgisAlgorithm import QgisAlgorithm
44+ from processing .algs .qgis .ui .InterpolationWidgets import ParameterInterpolationData , ParameterPixelSize
4445
4546pluginPath = 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-
8649class 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.' ))
0 commit comments