2929
3030from qgis .PyQt .QtGui import QIcon
3131
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 )
3540from qgis .analysis import (QgsInterpolator ,
3641 QgsTINInterpolator ,
37- QgsGridFileWriter
38- )
42+ QgsGridFileWriter )
3943
4044from 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- )
5145
5246pluginPath = os .path .split (os .path .split (os .path .dirname (__file__ ))[0 ])[0 ]
5347
5448
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+
5587class TinInterpolation (QgisAlgorithm ):
5688
5789 INTERPOLATION_DATA = 'INTERPOLATION_DATA'
@@ -61,8 +93,8 @@ class TinInterpolation(QgisAlgorithm):
6193 CELLSIZE_X = 'CELLSIZE_X'
6294 CELLSIZE_Y = 'CELLSIZE_Y'
6395 EXTENT = 'EXTENT'
64- OUTPUT_LAYER = 'OUTPUT_LAYER '
65- TRIANULATION_FILE = 'TRIANULATION_FILE '
96+ OUTPUT = 'OUTPUT '
97+ TRIANGULATION_FILE = 'TRIANGULATION_FILE '
6698
6799 def icon (self ):
68100 return QIcon (os .path .join (pluginPath , 'images' , 'interpolation.png' ))
@@ -78,82 +110,34 @@ def initAlgorithm(self, config=None):
78110 self .tr ('Clough-Toucher (cubic)' )
79111 ]
80112
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-
131113 self .addParameter (ParameterInterpolationData (self .INTERPOLATION_DATA ,
132114 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 ))
157141
158142 def name (self ):
159143 return 'tininterpolation'
@@ -162,30 +146,24 @@ def displayName(self):
162146 return self .tr ('TIN interpolation' )
163147
164148 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 )
174158
175159 if interpolationData is None :
176- raise GeoAlgorithmExecutionException (
160+ raise QgsProcessingException (
177161 self .tr ('You need to specify at least one input layer.' ))
178162
179163 if cellsizeX == 0.0 or cellsizeY == 0.0 :
180- raise GeoAlgorithmExecutionException (
164+ raise QgsProcessingException (
181165 self .tr ('Cellsize should be greater than 0.' ))
182166
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-
189167 layerData = []
190168 layers = []
191169 for row in interpolationData .split (';' ):
@@ -213,8 +191,9 @@ def processAlgorithm(self, parameters, context, feedback):
213191 interpolationMethod = QgsTINInterpolator .CloughTocher
214192
215193 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 )
218197
219198 writer = QgsGridFileWriter (interpolator ,
220199 output ,
@@ -224,4 +203,5 @@ def processAlgorithm(self, parameters, context, feedback):
224203 cellsizeX ,
225204 cellsizeY )
226205
227- writer .writeFile ()
206+ writer .writeFile (feedback )
207+ return {self .OUTPUT : output }
0 commit comments