Skip to content

Commit ea0ad5d

Browse files
authored
Merge pull request #3592 from alexbruy/processing-interpolation
[processing] add interpolation tools
2 parents 2d4e3da + 58f31f1 commit ea0ad5d

13 files changed

+834
-4
lines changed
Lines changed: 147 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,147 @@
1+
# -*- coding: utf-8 -*-
2+
3+
"""
4+
***************************************************************************
5+
IdwInterpolationAttribute.py
6+
---------------------
7+
Date : October 2016
8+
Copyright : (C) 2016 by Alexander Bruy
9+
Email : alexander dot bruy at gmail dot com
10+
***************************************************************************
11+
* *
12+
* This program is free software; you can redistribute it and/or modify *
13+
* it under the terms of the GNU General Public License as published by *
14+
* the Free Software Foundation; either version 2 of the License, or *
15+
* (at your option) any later version. *
16+
* *
17+
***************************************************************************
18+
"""
19+
20+
__author__ = 'Alexander Bruy'
21+
__date__ = 'October 2016'
22+
__copyright__ = '(C) 2016, Alexander Bruy'
23+
24+
# This will get replaced with a git SHA1 when you do a git archive
25+
26+
__revision__ = '$Format:%H$'
27+
28+
import os
29+
30+
from qgis.PyQt.QtGui import QIcon
31+
32+
from qgis.core import QgsRectangle
33+
from qgis.analysis import (QgsInterpolator,
34+
QgsIDWInterpolator,
35+
QgsGridFileWriter
36+
)
37+
38+
from processing.core.GeoAlgorithm import GeoAlgorithm
39+
from processing.core.parameters import ParameterVector
40+
from processing.core.parameters import ParameterTableField
41+
from processing.core.parameters import ParameterSelection
42+
from processing.core.parameters import ParameterNumber
43+
from processing.core.parameters import ParameterExtent
44+
from processing.core.outputs import OutputRaster
45+
from processing.tools import dataobjects
46+
47+
pluginPath = os.path.split(os.path.split(os.path.dirname(__file__))[0])[0]
48+
49+
50+
class IdwInterpolationAttribute(GeoAlgorithm):
51+
52+
INPUT_LAYER = 'INPUT_LAYER'
53+
ATTRIBUTE = 'ATTRIBUTE'
54+
LAYER_TYPE = 'LAYER_TYPE'
55+
DISTANCE_COEFFICIENT = 'DISTANCE_COEFFICIENT'
56+
COLUMNS = 'COLUMNS'
57+
ROWS = 'ROWS'
58+
CELLSIZE_X = 'CELLSIZE_X'
59+
CELLSIZE_Y = 'CELLSIZE_Y'
60+
EXTENT = 'EXTENT'
61+
OUTPUT_LAYER = 'OUTPUT_LAYER'
62+
63+
def getIcon(self):
64+
return QIcon(os.path.join(pluginPath, 'images', 'interpolation.png'))
65+
66+
def defineCharacteristics(self):
67+
self.name, self.i18n_name = self.trAlgorithm('IDW interpolation (using attribute)')
68+
self.group, self.i18n_group = self.trAlgorithm('Interpolation')
69+
70+
self.TYPES = [self.tr('Points'),
71+
self.tr('Structure lines'),
72+
self.tr('Break lines')
73+
]
74+
75+
self.addParameter(ParameterVector(self.INPUT_LAYER,
76+
self.tr('Vector layer')))
77+
self.addParameter(ParameterTableField(self.ATTRIBUTE,
78+
self.tr('Interpolation attribute'),
79+
self.INPUT_LAYER,
80+
ParameterTableField.DATA_TYPE_NUMBER))
81+
self.addParameter(ParameterSelection(self.LAYER_TYPE,
82+
self.tr('Type'),
83+
self.TYPES,
84+
0))
85+
self.addParameter(ParameterNumber(self.DISTANCE_COEFFICIENT,
86+
self.tr('Distance coefficient P'),
87+
0.0, 99.99, 2.0))
88+
self.addParameter(ParameterNumber(self.COLUMNS,
89+
self.tr('Number of columns'),
90+
0, 10000000, 300))
91+
self.addParameter(ParameterNumber(self.ROWS,
92+
self.tr('Number of rows'),
93+
0, 10000000, 300))
94+
self.addParameter(ParameterNumber(self.CELLSIZE_X,
95+
self.tr('Cellsize X'),
96+
0.0, 999999.000000, 0.0))
97+
self.addParameter(ParameterNumber(self.CELLSIZE_Y,
98+
self.tr('Cellsize Y'),
99+
0.0, 999999.000000, 0.0))
100+
self.addParameter(ParameterExtent(self.EXTENT,
101+
self.tr('Extent')))
102+
self.addOutput(OutputRaster(self.OUTPUT_LAYER,
103+
self.tr('Interpolated')))
104+
105+
def processAlgorithm(self, progress):
106+
layer = dataobjects.getObjectFromUri(
107+
self.getParameterValue(self.INPUT_LAYER))
108+
fieldName = self.getParameterValue(self.ATTRIBUTE)
109+
layerType = self.getParameterValue(self.LAYER_TYPE)
110+
coefficient = self.getParameterValue(self.DISTANCE_COEFFICIENT)
111+
columns = self.getParameterValue(self.COLUMNS)
112+
rows = self.getParameterValue(self.ROWS)
113+
cellsizeX = self.getParameterValue(self.CELLSIZE_X)
114+
cellsizeY = self.getParameterValue(self.CELLSIZE_Y)
115+
extent = self.getParameterValue(self.EXTENT).split(',')
116+
output = self.getOutputValue(self.OUTPUT_LAYER)
117+
118+
xMin = float(extent[0])
119+
xMax = float(extent[1])
120+
yMin = float(extent[2])
121+
yMax = float(extent[3])
122+
bbox = QgsRectangle(xMin, yMin, xMax, yMax)
123+
124+
layerData = QgsInterpolator.LayerData()
125+
layerData.vectorLayer = layer
126+
layerData.zCoordInterpolation = False
127+
layerData.interpolationAttribute = layer.dataProvider().fieldNameIndex(fieldName)
128+
129+
if layerType == 0:
130+
layerData.mInputType = QgsInterpolator.POINTS
131+
elif layerType == 1:
132+
layerData.mInputType = QgsInterpolator.STRUCTURE_LINES
133+
else:
134+
layerData.mInputType = QgsInterpolator.BREAK_LINES
135+
136+
interpolator = QgsIDWInterpolator([layerData])
137+
interpolator.setDistanceCoefficient(coefficient)
138+
139+
writer = QgsGridFileWriter(interpolator,
140+
output,
141+
bbox,
142+
columns,
143+
rows,
144+
cellsizeX,
145+
cellsizeY)
146+
147+
writer.writeFile()
Lines changed: 144 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,144 @@
1+
# -*- coding: utf-8 -*-
2+
3+
"""
4+
***************************************************************************
5+
IdwInterpolationZValue.py
6+
---------------------
7+
Date : October 2016
8+
Copyright : (C) 2016 by Alexander Bruy
9+
Email : alexander dot bruy at gmail dot com
10+
***************************************************************************
11+
* *
12+
* This program is free software; you can redistribute it and/or modify *
13+
* it under the terms of the GNU General Public License as published by *
14+
* the Free Software Foundation; either version 2 of the License, or *
15+
* (at your option) any later version. *
16+
* *
17+
***************************************************************************
18+
"""
19+
20+
__author__ = 'Alexander Bruy'
21+
__date__ = 'October 2016'
22+
__copyright__ = '(C) 2016, Alexander Bruy'
23+
24+
# This will get replaced with a git SHA1 when you do a git archive
25+
26+
__revision__ = '$Format:%H$'
27+
28+
import os
29+
30+
from qgis.PyQt.QtGui import QIcon
31+
32+
from qgis.core import QgsRectangle, QgsWkbTypes
33+
from qgis.analysis import (QgsInterpolator,
34+
QgsIDWInterpolator,
35+
QgsGridFileWriter
36+
)
37+
38+
from processing.core.GeoAlgorithm import GeoAlgorithm
39+
from processing.core.parameters import ParameterVector
40+
from processing.core.parameters import ParameterSelection
41+
from processing.core.parameters import ParameterNumber
42+
from processing.core.parameters import ParameterExtent
43+
from processing.core.outputs import OutputRaster
44+
from processing.tools import dataobjects
45+
46+
pluginPath = os.path.split(os.path.split(os.path.dirname(__file__))[0])[0]
47+
48+
49+
class IdwInterpolationZValue(GeoAlgorithm):
50+
51+
INPUT_LAYER = 'INPUT_LAYER'
52+
LAYER_TYPE = 'LAYER_TYPE'
53+
DISTANCE_COEFFICIENT = 'DISTANCE_COEFFICIENT'
54+
COLUMNS = 'COLUMNS'
55+
ROWS = 'ROWS'
56+
CELLSIZE_X = 'CELLSIZE_X'
57+
CELLSIZE_Y = 'CELLSIZE_Y'
58+
EXTENT = 'EXTENT'
59+
OUTPUT_LAYER = 'OUTPUT_LAYER'
60+
61+
def getIcon(self):
62+
return QIcon(os.path.join(pluginPath, 'images', 'interpolation.png'))
63+
64+
def defineCharacteristics(self):
65+
self.name, self.i18n_name = self.trAlgorithm('IDW interpolation (using Z-values)')
66+
self.group, self.i18n_group = self.trAlgorithm('Interpolation')
67+
68+
self.TYPES = [self.tr('Points'),
69+
self.tr('Structure lines'),
70+
self.tr('Break lines')
71+
]
72+
73+
self.addParameter(ParameterVector(self.INPUT_LAYER,
74+
self.tr('Vector layer')))
75+
self.addParameter(ParameterSelection(self.LAYER_TYPE,
76+
self.tr('Type'),
77+
self.TYPES,
78+
0))
79+
self.addParameter(ParameterNumber(self.DISTANCE_COEFFICIENT,
80+
self.tr('Distance coefficient P'),
81+
0.0, 99.99, 2.0))
82+
self.addParameter(ParameterNumber(self.COLUMNS,
83+
self.tr('Number of columns'),
84+
0, 10000000, 300))
85+
self.addParameter(ParameterNumber(self.ROWS,
86+
self.tr('Number of rows'),
87+
0, 10000000, 300))
88+
self.addParameter(ParameterNumber(self.CELLSIZE_X,
89+
self.tr('Cellsize X'),
90+
0.0, 999999.000000, 0.0))
91+
self.addParameter(ParameterNumber(self.CELLSIZE_Y,
92+
self.tr('Cellsize Y'),
93+
0.0, 999999.000000, 0.0))
94+
self.addParameter(ParameterExtent(self.EXTENT,
95+
self.tr('Extent')))
96+
self.addOutput(OutputRaster(self.OUTPUT_LAYER,
97+
self.tr('Interpolated')))
98+
99+
def processAlgorithm(self, progress):
100+
layer = dataobjects.getObjectFromUri(
101+
self.getParameterValue(self.INPUT_LAYER))
102+
layerType = self.getParameterValue(self.LAYER_TYPE)
103+
coefficient = self.getParameterValue(self.DISTANCE_COEFFICIENT)
104+
columns = self.getParameterValue(self.COLUMNS)
105+
rows = self.getParameterValue(self.ROWS)
106+
cellsizeX = self.getParameterValue(self.CELLSIZE_X)
107+
cellsizeY = self.getParameterValue(self.CELLSIZE_Y)
108+
extent = self.getParameterValue(self.EXTENT).split(',')
109+
output = self.getOutputValue(self.OUTPUT_LAYER)
110+
111+
if not QgsWkbTypes.hasZ(layer.wkbType()):
112+
raise GeoAlgorithmExecutionException(
113+
self.tr('Geometries in input layer does not have Z coordinates.'))
114+
115+
xMin = float(extent[0])
116+
xMax = float(extent[1])
117+
yMin = float(extent[2])
118+
yMax = float(extent[3])
119+
bbox = QgsRectangle(xMin, yMin, xMax, yMax)
120+
121+
layerData = QgsInterpolator.LayerData()
122+
layerData.vectorLayer = layer
123+
layerData.zCoordInterpolation = True
124+
layerData.interpolationAttribute = -1
125+
126+
if layerType == 0:
127+
layerData.mInputType = QgsInterpolator.POINTS
128+
elif layerType == 1:
129+
layerData.mInputType = QgsInterpolator.STRUCTURE_LINES
130+
else:
131+
layerData.mInputType = QgsInterpolator.BREAK_LINES
132+
133+
interpolator = QgsIDWInterpolator([layerData])
134+
interpolator.setDistanceCoefficient(coefficient)
135+
136+
writer = QgsGridFileWriter(interpolator,
137+
output,
138+
bbox,
139+
columns,
140+
rows,
141+
cellsizeX,
142+
cellsizeY)
143+
144+
writer.writeFile()

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

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,11 @@
163163
from .Ruggedness import Ruggedness
164164
from .Hillshade import Hillshade
165165
from .ReliefAuto import ReliefAuto
166+
from .IdwInterpolationZValue import IdwInterpolationZValue
167+
from .IdwInterpolationAttribute import IdwInterpolationAttribute
168+
from .TinInterpolationZValue import TinInterpolationZValue
169+
from .TinInterpolationAttribute import TinInterpolationAttribute
170+
166171

167172
pluginPath = os.path.normpath(os.path.join(
168173
os.path.split(os.path.dirname(__file__))[0], os.pardir))
@@ -220,7 +225,9 @@ def __init__(self):
220225
OffsetLine(), PolygonCentroids(), Translate(),
221226
SingleSidedBuffer(), PointsAlongGeometry(),
222227
Aspect(), Slope(), Ruggedness(), Hillshade(),
223-
ReliefAuto(),
228+
ReliefAuto(), IdwInterpolationZValue(),
229+
IdwInterpolationAttribute(), TinInterpolationZValue(),
230+
TinInterpolationAttribute()
224231
]
225232

226233
if hasMatplotlib:

0 commit comments

Comments
 (0)