31
31
32
32
from qgis .core import (QgsRectangle ,
33
33
QgsProcessingUtils ,
34
- QgsProcessingParameterDefinition ,
35
34
QgsProcessingParameterNumber ,
36
35
QgsProcessingParameterExtent ,
36
+ QgsProcessingParameterDefinition ,
37
37
QgsProcessingParameterRasterDestination ,
38
38
QgsProcessingException )
39
39
from qgis .analysis import (QgsInterpolator ,
40
40
QgsIDWInterpolator ,
41
41
QgsGridFileWriter )
42
42
43
43
from processing .algs .qgis .QgisAlgorithm import QgisAlgorithm
44
+ from processing .algs .qgis .ui .InterpolationWidgets import ParameterInterpolationData , ParameterPixelSize
44
45
45
46
pluginPath = os .path .split (os .path .split (os .path .dirname (__file__ ))[0 ])[0 ]
46
47
47
48
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
-
86
49
class IdwInterpolation (QgisAlgorithm ):
87
50
88
51
INTERPOLATION_DATA = 'INTERPOLATION_DATA'
89
52
DISTANCE_COEFFICIENT = 'DISTANCE_COEFFICIENT'
53
+ PIXEL_SIZE = 'PIXEL_SIZE'
90
54
COLUMNS = 'COLUMNS'
91
55
ROWS = 'ROWS'
92
56
EXTENT = 'EXTENT'
@@ -111,15 +75,31 @@ def initAlgorithm(self, config=None):
111
75
self .addParameter (QgsProcessingParameterNumber (self .DISTANCE_COEFFICIENT ,
112
76
self .tr ('Distance coefficient P' ), type = QgsProcessingParameterNumber .Double ,
113
77
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 ))
120
78
self .addParameter (QgsProcessingParameterExtent (self .EXTENT ,
121
79
self .tr ('Extent' ),
122
80
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
+
123
103
self .addParameter (QgsProcessingParameterRasterDestination (self .OUTPUT ,
124
104
self .tr ('Interpolated' )))
125
105
@@ -132,11 +112,17 @@ def displayName(self):
132
112
def processAlgorithm (self , parameters , context , feedback ):
133
113
interpolationData = ParameterInterpolationData .parseValue (parameters [self .INTERPOLATION_DATA ])
134
114
coefficient = self .parameterAsDouble (parameters , self .DISTANCE_COEFFICIENT , context )
135
- columns = self .parameterAsInt (parameters , self .COLUMNS , context )
136
- rows = self .parameterAsInt (parameters , self .ROWS , context )
137
115
bbox = self .parameterAsExtent (parameters , self .EXTENT , context )
116
+ pixel_size = self .parameterAsDouble (parameters , self .PIXEL_SIZE , context )
138
117
output = self .parameterAsOutputLayer (parameters , self .OUTPUT , context )
139
118
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
+
140
126
if interpolationData is None :
141
127
raise QgsProcessingException (
142
128
self .tr ('You need to specify at least one input layer.' ))
0 commit comments