29
29
30
30
from qgis .PyQt .QtGui import QIcon
31
31
32
- from qgis .core import (QgsRectangle ,
33
- QgsProcessingUtils ,
34
- QgsProcessingParameterDefinition )
32
+ from qgis .core import (QgsProcessingUtils ,
33
+ QgsProcessingParameterDefinition ,
34
+ QgsProcessingParameterEnum ,
35
+ QgsProcessingParameterNumber ,
36
+ QgsProcessingParameterExtent ,
37
+ QgsProcessingParameterRasterDestination ,
38
+ QgsProcessingParameterFileDestination ,
39
+ QgsProcessingException )
35
40
from qgis .analysis import (QgsInterpolator ,
36
41
QgsTINInterpolator ,
37
- QgsGridFileWriter
38
- )
42
+ QgsGridFileWriter )
39
43
40
44
from processing .algs .qgis .QgisAlgorithm import QgisAlgorithm
41
- from processing .core .GeoAlgorithmExecutionException import GeoAlgorithmExecutionException
42
- from processing .core .parameters import (Parameter ,
43
- ParameterNumber ,
44
- ParameterExtent ,
45
- ParameterSelection ,
46
- _splitParameterOptions
47
- )
48
- from processing .core .outputs import (OutputRaster ,
49
- OutputVector
50
- )
51
45
52
46
pluginPath = os .path .split (os .path .split (os .path .dirname (__file__ ))[0 ])[0 ]
53
47
54
48
49
+ class ParameterInterpolationData (QgsProcessingParameterDefinition ):
50
+
51
+ def __init__ (self , name = '' , description = '' ):
52
+ super ().__init__ (name , description )
53
+ self .setMetadata ({
54
+ 'widget_wrapper' : 'processing.algs.qgis.ui.InterpolationDataWidget.InterpolationDataWidgetWrapper'
55
+ })
56
+
57
+ def type (self ):
58
+ return 'tin_interpolation_data'
59
+
60
+ def clone (self ):
61
+ return ParameterInterpolationData (self .name (), self .description ())
62
+
63
+ @staticmethod
64
+ def parseValue (value ):
65
+ if value is None :
66
+ return None
67
+
68
+ if value == '' :
69
+ return None
70
+
71
+ if isinstance (value , str ):
72
+ return value if value != '' else None
73
+ else :
74
+ return ParameterInterpolationData .dataToString (value )
75
+
76
+ @staticmethod
77
+ def dataToString (data ):
78
+ s = ''
79
+ for c in data :
80
+ s += '{}, {}, {:d}, {:d};' .format (c [0 ],
81
+ c [1 ],
82
+ c [2 ],
83
+ c [3 ])
84
+ return s [:- 1 ]
85
+
86
+
55
87
class TinInterpolation (QgisAlgorithm ):
56
88
57
89
INTERPOLATION_DATA = 'INTERPOLATION_DATA'
@@ -61,8 +93,8 @@ class TinInterpolation(QgisAlgorithm):
61
93
CELLSIZE_X = 'CELLSIZE_X'
62
94
CELLSIZE_Y = 'CELLSIZE_Y'
63
95
EXTENT = 'EXTENT'
64
- OUTPUT_LAYER = 'OUTPUT_LAYER '
65
- TRIANULATION_FILE = 'TRIANULATION_FILE '
96
+ OUTPUT = 'OUTPUT '
97
+ TRIANGULATION_FILE = 'TRIANGULATION_FILE '
66
98
67
99
def icon (self ):
68
100
return QIcon (os .path .join (pluginPath , 'images' , 'interpolation.png' ))
@@ -78,82 +110,34 @@ def initAlgorithm(self, config=None):
78
110
self .tr ('Clough-Toucher (cubic)' )
79
111
]
80
112
81
- class ParameterInterpolationData (Parameter ):
82
- default_metadata = {
83
- 'widget_wrapper' : 'processing.algs.qgis.ui.InterpolationDataWidget.InterpolationDataWidgetWrapper'
84
- }
85
-
86
- def __init__ (self , name = '' , description = '' ):
87
- Parameter .__init__ (self , name , description )
88
-
89
- def setValue (self , value ):
90
- if value is None :
91
- if not self .flags () & QgsProcessingParameterDefinition .FlagOptional :
92
- return False
93
- self .value = None
94
- return True
95
-
96
- if value == '' :
97
- if not self .flags () & QgsProcessingParameterDefinition .FlagOptional :
98
- return False
99
-
100
- if isinstance (value , str ):
101
- self .value = value if value != '' else None
102
- else :
103
- self .value = ParameterInterpolationData .dataToString (value )
104
- return True
105
-
106
- def getValueAsCommandLineParameter (self ):
107
- return '"{}"' .format (self .value )
108
-
109
- def getAsScriptCode (self ):
110
- param_type = ''
111
- param_type += 'interpolation data '
112
- return '##' + self .name + '=' + param_type
113
-
114
- @classmethod
115
- def fromScriptCode (self , line ):
116
- isOptional , name , definition = _splitParameterOptions (line )
117
- descName = QgsProcessingParameters .descriptionFromName (name )
118
- parent = definition .lower ().strip ()[len ('interpolation data' ) + 1 :]
119
- return ParameterInterpolationData (name , descName , parent )
120
-
121
- @staticmethod
122
- def dataToString (data ):
123
- s = ''
124
- for c in data :
125
- s += '{}, {}, {:d}, {:d};' .format (c [0 ],
126
- c [1 ],
127
- c [2 ],
128
- c [3 ])
129
- return s [:- 1 ]
130
-
131
113
self .addParameter (ParameterInterpolationData (self .INTERPOLATION_DATA ,
132
114
self .tr ('Input layer(s)' )))
133
- self .addParameter (ParameterSelection (self .METHOD ,
134
- self .tr ('Interpolation method' ),
135
- self .METHODS ,
136
- 0 ))
137
- self .addParameter (ParameterNumber (self .COLUMNS ,
138
- self .tr ('Number of columns' ),
139
- 0 , 10000000 , 300 ))
140
- self .addParameter (ParameterNumber (self .ROWS ,
141
- self .tr ('Number of rows' ),
142
- 0 , 10000000 , 300 ))
143
- self .addParameter (ParameterNumber (self .CELLSIZE_X ,
144
- self .tr ('Cell size X' ),
145
- 0.0 , 999999.000000 , 0.0 ))
146
- self .addParameter (ParameterNumber (self .CELLSIZE_Y ,
147
- self .tr ('Cell size Y' ),
148
- 0.0 , 999999.000000 , 0.0 ))
149
- self .addParameter (ParameterExtent (self .EXTENT ,
150
- self .tr ('Extent' ),
151
- optional = False ))
152
- self .addOutput (OutputRaster (self .OUTPUT_LAYER ,
153
- self .tr ('Interpolated' )))
154
- self .addOutput (OutputVector (self .TRIANULATION_FILE ,
155
- self .tr ('Triangulation' ),
156
- )) # datatype=dataobjects.TYPE_VECTOR_LINE))
115
+ self .addParameter (QgsProcessingParameterEnum (self .METHOD ,
116
+ self .tr ('Interpolation method' ),
117
+ options = self .METHODS ,
118
+ defaultValue = 0 ))
119
+ self .addParameter (QgsProcessingParameterNumber (self .COLUMNS ,
120
+ self .tr ('Number of columns' ),
121
+ minValue = 0 , maxValue = 10000000 , defaultValue = 300 ))
122
+ self .addParameter (QgsProcessingParameterNumber (self .ROWS ,
123
+ self .tr ('Number of rows' ),
124
+ minValue = 0 , maxValue = 10000000 , defaultValue = 300 ))
125
+ self .addParameter (QgsProcessingParameterNumber (self .CELLSIZE_X ,
126
+ self .tr ('Cell size X' ), type = QgsProcessingParameterNumber .Double ,
127
+ minValue = 0.0 , maxValue = 999999.000000 , defaultValue = 0.0 ))
128
+ self .addParameter (QgsProcessingParameterNumber (self .CELLSIZE_Y ,
129
+ self .tr ('Cell size Y' ), type = QgsProcessingParameterNumber .Double ,
130
+ minValue = 0.0 , maxValue = 999999.000000 , defaultValue = 0.0 ))
131
+ self .addParameter (QgsProcessingParameterExtent (self .EXTENT ,
132
+ self .tr ('Extent' ),
133
+ optional = False ))
134
+ self .addParameter (QgsProcessingParameterRasterDestination (self .OUTPUT ,
135
+ self .tr ('Interpolated' )))
136
+
137
+ self .addParameter (QgsProcessingParameterFileDestination (self .TRIANGULATION_FILE ,
138
+ self .tr ('Triangulation' ),
139
+ self .tr ('SHP files (*.shp)' ),
140
+ optional = True ))
157
141
158
142
def name (self ):
159
143
return 'tininterpolation'
@@ -162,30 +146,24 @@ def displayName(self):
162
146
return self .tr ('TIN interpolation' )
163
147
164
148
def processAlgorithm (self , parameters , context , feedback ):
165
- interpolationData = self . getParameterValue ( self .INTERPOLATION_DATA )
166
- method = self .getParameterValue ( self .METHOD )
167
- columns = self .getParameterValue ( self .COLUMNS )
168
- rows = self .getParameterValue ( self .ROWS )
169
- cellsizeX = self .getParameterValue ( self .CELLSIZE_X )
170
- cellsizeY = self .getParameterValue ( self .CELLSIZE_Y )
171
- extent = self .getParameterValue ( self .EXTENT ). split ( ',' )
172
- output = self .getOutputValue ( self .OUTPUT_LAYER )
173
- triangulation = self .getOutputValue ( self .TRIANULATION_FILE )
149
+ interpolationData = ParameterInterpolationData . parseValue ( parameters [ self .INTERPOLATION_DATA ] )
150
+ method = self .parameterAsEnum ( parameters , self .METHOD , context )
151
+ columns = self .parameterAsInt ( parameters , self .COLUMNS , context )
152
+ rows = self .parameterAsInt ( parameters , self .ROWS , context )
153
+ cellsizeX = self .parameterAsDouble ( parameters , self .CELLSIZE_X , context )
154
+ cellsizeY = self .parameterAsDouble ( parameters , self .CELLSIZE_Y , context )
155
+ bbox = self .parameterAsExtent ( parameters , self .EXTENT , context )
156
+ output = self .parameterAsOutputLayer ( parameters , self .OUTPUT , context )
157
+ triangulation = self .parameterAsFileOutput ( parameters , self .TRIANGULATION_FILE , context )
174
158
175
159
if interpolationData is None :
176
- raise GeoAlgorithmExecutionException (
160
+ raise QgsProcessingException (
177
161
self .tr ('You need to specify at least one input layer.' ))
178
162
179
163
if cellsizeX == 0.0 or cellsizeY == 0.0 :
180
- raise GeoAlgorithmExecutionException (
164
+ raise QgsProcessingException (
181
165
self .tr ('Cellsize should be greater than 0.' ))
182
166
183
- xMin = float (extent [0 ])
184
- xMax = float (extent [1 ])
185
- yMin = float (extent [2 ])
186
- yMax = float (extent [3 ])
187
- bbox = QgsRectangle (xMin , yMin , xMax , yMax )
188
-
189
167
layerData = []
190
168
layers = []
191
169
for row in interpolationData .split (';' ):
@@ -213,8 +191,9 @@ def processAlgorithm(self, parameters, context, feedback):
213
191
interpolationMethod = QgsTINInterpolator .CloughTocher
214
192
215
193
interpolator = QgsTINInterpolator (layerData , interpolationMethod )
216
- interpolator .setExportTriangulationToFile (True )
217
- interpolator .setTriangulationFilePath (triangulation )
194
+ if triangulation is not None and triangulation != '' :
195
+ interpolator .setExportTriangulationToFile (True )
196
+ interpolator .setTriangulationFilePath (triangulation )
218
197
219
198
writer = QgsGridFileWriter (interpolator ,
220
199
output ,
@@ -224,4 +203,5 @@ def processAlgorithm(self, parameters, context, feedback):
224
203
cellsizeX ,
225
204
cellsizeY )
226
205
227
- writer .writeFile ()
206
+ writer .writeFile (feedback )
207
+ return {self .OUTPUT : output }
0 commit comments