Skip to content

Commit 000c86e

Browse files
committedAug 18, 2017
Restore TIN interpolation algorithm
1 parent 4bba95f commit 000c86e

File tree

3 files changed

+132
-152
lines changed

3 files changed

+132
-152
lines changed
 

‎python/plugins/processing/algs/qgis/QGISAlgorithmProvider.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,7 @@
151151
from .SumLines import SumLines
152152
from .SymmetricalDifference import SymmetricalDifference
153153
from .TextToFloat import TextToFloat
154+
from .TinInterpolation import TinInterpolation
154155
from .TopoColors import TopoColor
155156
from .Translate import Translate
156157
from .TruncateTable import TruncateTable
@@ -169,7 +170,6 @@
169170
# from .FieldPyculator import FieldsPyculator
170171
# from .SelectByAttributeSum import SelectByAttributeSum
171172
# from .DefineProjection import DefineProjection
172-
# from .TinInterpolation import TinInterpolation
173173
# from .RasterCalculator import RasterCalculator
174174
# from .ExecuteSQL import ExecuteSQL
175175
# from .FindProjection import FindProjection
@@ -194,7 +194,6 @@ def getAlgs(self):
194194
# FieldsPyculator(),
195195
# FieldsMapper(), SelectByAttributeSum()
196196
# DefineProjection(),
197-
# TinInterpolation(),
198197
# RasterCalculator(),
199198
# ExecuteSQL(), FindProjection(),
200199
# ]
@@ -309,6 +308,7 @@ def getAlgs(self):
309308
SumLines(),
310309
SymmetricalDifference(),
311310
TextToFloat(),
311+
TinInterpolation(),
312312
TopoColor(),
313313
Translate(),
314314
TruncateTable(),

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

Lines changed: 91 additions & 111 deletions
Original file line numberDiff line numberDiff line change
@@ -29,29 +29,61 @@
2929

3030
from 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)
3540
from qgis.analysis import (QgsInterpolator,
3641
QgsTINInterpolator,
37-
QgsGridFileWriter
38-
)
42+
QgsGridFileWriter)
3943

4044
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-
)
5145

5246
pluginPath = 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+
5587
class 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}

‎python/plugins/processing/tests/testdata/qgis_algorithm_tests.yaml

Lines changed: 39 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1528,45 +1528,45 @@ tests:
15281528
hash: 56d2671d50444f8571affba3f9e585830b82af5e380394178f521065
15291529
type: rasterhash
15301530

1531-
# - algorithm: qgis:tininterpolation
1532-
# name: TIN interpolation using attribute
1533-
# params:
1534-
# CELLSIZE_X: 0.02667
1535-
# CELLSIZE_Y: 0.02667
1536-
# COLUMNS: 300
1537-
# EXTENT: 0, 8, -5, 3
1538-
# INTERPOLATION_DATA:
1539-
# name: pointsz.gml,False,1,0
1540-
# type: interpolation
1541-
# METHOD: '0'
1542-
# ROWS: 300
1543-
# results:
1544-
# OUTPUT_LAYER:
1545-
# hash: 87f40be6ec08f3fcbb5707762de71f6be35bb265c61f594335562a26
1546-
# type: rasterhash
1547-
# #TRIANULATION_FILE:
1548-
# # name: expected/triangulation.gml
1549-
# # type: vector
1550-
#
1551-
# - algorithm: qgis:tininterpolation
1552-
# name: TIN interpolation using Z value
1553-
# params:
1554-
# CELLSIZE_X: 0.02667
1555-
# CELLSIZE_Y: 0.02667
1556-
# COLUMNS: 300
1557-
# EXTENT: 0, 8, -5, 3
1558-
# INTERPOLATION_DATA:
1559-
# name: pointsz.gml,True,-1,0
1560-
# type: interpolation
1561-
# METHOD: '1'
1562-
# ROWS: 300
1563-
# results:
1564-
# OUTPUT_LAYER:
1565-
# hash: 5e14dd0b879884b8b8da56c082947dad681feb4e9f1137f5cda126f8
1566-
# type: rasterhash
1567-
# #TRIANULATION_FILE:
1568-
# # name: expected/triangulation.gml
1569-
# # type: vector
1531+
- algorithm: qgis:tininterpolation
1532+
name: TIN interpolation using attribute
1533+
params:
1534+
CELLSIZE_X: 0.02667
1535+
CELLSIZE_Y: 0.02667
1536+
COLUMNS: 300
1537+
EXTENT: 0, 8, -5, 3
1538+
INTERPOLATION_DATA:
1539+
name: pointsz.gml,False,1,0
1540+
type: interpolation
1541+
METHOD: '0'
1542+
ROWS: 300
1543+
results:
1544+
OUTPUT:
1545+
hash: 87f40be6ec08f3fcbb5707762de71f6be35bb265c61f594335562a26
1546+
type: rasterhash
1547+
#TRIANGULATION_FILE:
1548+
# name: expected/triangulation.gml
1549+
# type: vector
1550+
1551+
- algorithm: qgis:tininterpolation
1552+
name: TIN interpolation using Z value
1553+
params:
1554+
CELLSIZE_X: 0.02667
1555+
CELLSIZE_Y: 0.02667
1556+
COLUMNS: 300
1557+
EXTENT: 0, 8, -5, 3
1558+
INTERPOLATION_DATA:
1559+
name: pointsz.gml,True,-1,0
1560+
type: interpolation
1561+
METHOD: '1'
1562+
ROWS: 300
1563+
results:
1564+
OUTPUT:
1565+
hash: 5e14dd0b879884b8b8da56c082947dad681feb4e9f1137f5cda126f8
1566+
type: rasterhash
1567+
#TRIANULATION_FILE:
1568+
# name: expected/triangulation.gml
1569+
# type: vector
15701570

15711571
- algorithm: native:removenullgeometries
15721572
name: Remove null geometries

0 commit comments

Comments
 (0)
Please sign in to comment.