[processing] restore moving average interpolation

This commit is contained in:
Alexander Bruy 2017-09-01 14:30:52 +03:00
parent 232fd47485
commit 8c09860dd7
3 changed files with 105 additions and 65 deletions

View File

@ -40,6 +40,7 @@ from .ColorRelief import ColorRelief
from .contour import contour
from .fillnodata import fillnodata
from .gdaltindex import gdaltindex
from .GridAverage import GridAverage
from .hillshade import hillshade
from .information import information
from .nearblack import nearblack
@ -63,7 +64,6 @@ from .warp import warp
# from .extractprojection import ExtractProjection
# from .gdal2xyz import gdal2xyz
# from .GridInvDist import GridInvDist
# from .GridAverage import GridAverage
# from .GridNearest import GridNearest
# from .GridDataMetrics import GridDataMetrics
# from .gdalcalc import gdalcalc
@ -141,6 +141,7 @@ class GdalAlgorithmProvider(QgsProcessingProvider):
contour(),
fillnodata(),
gdaltindex(),
GridAverage(),
hillshade(),
information(),
nearblack(),
@ -163,7 +164,6 @@ class GdalAlgorithmProvider(QgsProcessingProvider):
# ExtractProjection(),
# gdal2xyz(),
# GridInvDist(),
# GridAverage(),
# GridNearest(),
# GridDataMetrics(),
# gdalcalc(),

View File

@ -16,7 +16,6 @@
* *
***************************************************************************
"""
from builtins import str
__author__ = 'Alexander Bruy'
__date__ = 'October 2013'
@ -30,13 +29,15 @@ import os
from qgis.PyQt.QtGui import QIcon
from qgis.core import (QgsRasterFileWriter,
QgsProcessing,
QgsProcessingParameterDefinition,
QgsProcessingParameterVectorLayer,
QgsProcessingParameterEnum,
QgsProcessingParameterField,
QgsProcessingParameterNumber,
QgsProcessingParameterRasterDestination)
from processing.algs.gdal.GdalAlgorithm import GdalAlgorithm
from processing.core.parameters import ParameterVector
from processing.core.parameters import ParameterTableField
from processing.core.parameters import ParameterNumber
from processing.core.parameters import ParameterSelection
from processing.core.outputs import OutputRaster
from processing.tools import dataobjects
from processing.algs.gdal.GdalUtils import GdalUtils
pluginPath = os.path.split(os.path.split(os.path.dirname(__file__))[0])[0]
@ -51,34 +52,67 @@ class GridAverage(GdalAlgorithm):
MIN_POINTS = 'MIN_POINTS'
ANGLE = 'ANGLE'
NODATA = 'NODATA'
DATA_TYPE = 'DATA_TYPE'
OUTPUT = 'OUTPUT'
RTYPE = 'RTYPE'
TYPE = ['Byte', 'Int16', 'UInt16', 'UInt32', 'Int32', 'Float32', 'Float64']
TYPE = ['Byte', 'Int16', 'UInt16', 'UInt32', 'Int32', 'Float32', 'Float64', 'CInt16', 'CInt32', 'CFloat32', 'CFloat64']
def __init__(self):
super().__init__()
def initAlgorithm(self, config=None):
self.addParameter(ParameterVector(self.INPUT,
self.tr('Input layer'), [dataobjects.TYPE_VECTOR_POINT]))
self.addParameter(ParameterTableField(self.Z_FIELD,
self.tr('Z field'), self.INPUT,
ParameterTableField.DATA_TYPE_NUMBER, True))
self.addParameter(ParameterNumber(self.RADIUS_1,
self.tr('Radius 1'), 0.0, 99999999.999999, 0.0))
self.addParameter(ParameterNumber(self.RADIUS_2,
self.tr('Radius 2'), 0.0, 99999999.999999, 0.0))
self.addParameter(ParameterNumber(self.MIN_POINTS,
self.tr('Min points'), 0.0, 99999999.999999, 0.0))
self.addParameter(ParameterNumber(self.ANGLE,
self.tr('Angle'), 0.0, 359.0, 0.0))
self.addParameter(ParameterNumber(self.NODATA,
self.tr('Nodata'), 0.0, 99999999.999999, 0.0))
self.addParameter(ParameterSelection(self.RTYPE,
self.tr('Output raster type'), self.TYPE, 5))
self.addParameter(QgsProcessingParameterVectorLayer(self.INPUT,
self.tr('Point layer'),
[QgsProcessing.TypeVectorPoint]))
self.addOutput(OutputRaster(self.OUTPUT, self.tr('Interpolated moving average')))
z_field_param = QgsProcessingParameterField(self.Z_FIELD,
self.tr('Z value from field'),
None,
self.INPUT,
QgsProcessingParameterField.Numeric,
optional=True)
z_field_param.setFlags(z_field_param.flags() | QgsProcessingParameterDefinition.FlagAdvanced)
self.addParameter(z_field_param)
self.addParameter(QgsProcessingParameterNumber(self.RADIUS_1,
self.tr('The first radius of search ellipse'),
type=QgsProcessingParameterNumber.Double,
minValue=0.0,
maxValue=99999999.999999,
defaultValue=0.0))
self.addParameter(QgsProcessingParameterNumber(self.RADIUS_2,
self.tr('The second radius of search ellipse'),
type=QgsProcessingParameterNumber.Double,
minValue=0.0,
maxValue=99999999.999999,
defaultValue=0.0))
self.addParameter(QgsProcessingParameterNumber(self.ANGLE,
self.tr('Angle of search ellipse rotation in degrees (counter clockwise)'),
type=QgsProcessingParameterNumber.Double,
minValue=0.0,
maxValue=360.0,
defaultValue=0.0))
self.addParameter(QgsProcessingParameterNumber(self.MIN_POINTS,
self.tr('Minimum number of data points to use'),
type=QgsProcessingParameterNumber.Integer,
minValue=0,
maxValue=99999999,
defaultValue=0))
self.addParameter(QgsProcessingParameterNumber(self.NODATA,
self.tr('NODATA marker to fill empty points'),
type=QgsProcessingParameterNumber.Double,
minValue=-99999999.999999,
maxValue=99999999.999999,
defaultValue=0.0))
self.addParameter(QgsProcessingParameterEnum(self.DATA_TYPE,
self.tr('Output data type'),
self.TYPE,
allowMultiple=False,
defaultValue=5))
self.addParameter(QgsProcessingParameterRasterDestination(self.OUTPUT,
self.tr('Interpolated (moving average)')))
def name(self):
return 'gridaverage'
@ -86,35 +120,41 @@ class GridAverage(GdalAlgorithm):
def displayName(self):
return self.tr('Grid (Moving average)')
def icon(self):
return QIcon(os.path.join(pluginPath, 'images', 'gdaltools', 'grid.png'))
def group(self):
return self.tr('Raster analysis')
def getConsoleCommands(self, parameters, context, feedback):
arguments = ['-l']
arguments.append(
os.path.basename(os.path.splitext(
str(self.getParameterValue(self.INPUT)))[0]))
def icon(self):
return QIcon(os.path.join(pluginPath, 'images', 'gdaltools', 'grid.png'))
fieldName = self.getParameterValue(self.Z_FIELD)
if fieldName is not None and fieldName != '':
def getConsoleCommands(self, parameters, context, feedback):
inLayer = self.parameterAsVectorLayer(parameters, self.INPUT, context)
connectionString = GdalUtils.ogrConnectionString(inLayer.source(), context)
arguments = ['-l']
arguments.append(GdalUtils.ogrLayerName(connectionString))
fieldName = self.parameterAsString(parameters, self.Z_FIELD, context)
if fieldName:
arguments.append('-zfield')
arguments.append(fieldName)
params = 'average'
params += ':radius1=%s' % self.getParameterValue(self.RADIUS_1)
params += ':radius2=%s' % self.getParameterValue(self.RADIUS_2)
params += ':angle=%s' % self.getParameterValue(self.ANGLE)
params += ':min_points=%s' % self.getParameterValue(self.MIN_POINTS)
params += ':nodata=%s' % self.getParameterValue(self.NODATA)
params += ':radius1={}'.format(self.parameterAsDouble(parameters, self.RADIUS_1, context))
params += ':radius2={}'.format(self.parameterAsDouble(parameters, self.RADIUS_2, context))
params += ':angle={}'.format(self.parameterAsDouble(parameters, self.ANGLE, context))
params += ':min_points={}'.format(self.parameterAsInt(parameters, self.MIN_POINTS, context))
params += ':nodata={}'.format(self.parameterAsDouble(parameters, self.NODATA, context))
arguments.append('-a')
arguments.append(params)
arguments.append('-ot')
arguments.append(self.TYPE[self.getParameterValue(self.RTYPE)])
arguments.append(str(self.getParameterValue(self.INPUT)))
arguments.append(str(self.getOutputValue(self.OUTPUT)))
arguments.append(self.TYPE[self.parameterAsEnum(parameters, self.DATA_TYPE, context)])
out = self.parameterAsOutputLayer(parameters, self.OUTPUT, context)
arguments.append('-of')
arguments.append(QgsRasterFileWriter.driverForExtension(os.path.splitext(out)[1]))
arguments.append(connectionString)
arguments.append(out)
return ['gdal_grid', GdalUtils.escapeAndJoin(arguments)]

View File

@ -377,6 +377,24 @@ tests:
hash: f714597fadc9cfc3f5263dc0e35f7c6ba285de238dce439e4988faac
type: rasterhash
- algorithm: gdal:gridaverage
name: Moving Average interpolation
params:
ANGLE: 0.0
INPUT:
name: custom/points_values.gml
type: vector
MIN_POINTS: 0.0
NODATA: 0.0
RADIUS_1: 0.01
RADIUS_2: 0.01
RTYPE: '5'
Z_FIELD: EC
results:
OUTPUT:
hash: 3542d928bccee955b1c426cac7b698c603c9a385429ca529758083bf
type: rasterhash
# - algorithm: gdal:merge
# name: Merge 2 raster layers
# params:
@ -484,24 +502,6 @@ tests:
# hash: 220953299b18286b57ce093a054323e59add7c78c0429a02e51b4ad4
# type: rasterhash
#
# - algorithm: gdal:gridaverage
# name: Moving Average interpolation
# params:
# ANGLE: 0.0
# INPUT:
# name: custom/points_values.gml
# type: vector
# MIN_POINTS: 0.0
# NODATA: 0.0
# RADIUS_1: 0.01
# RADIUS_2: 0.01
# RTYPE: '5'
# Z_FIELD: EC
# results:
# OUTPUT:
# hash: 3542d928bccee955b1c426cac7b698c603c9a385429ca529758083bf
# type: rasterhash
#
# - algorithm: gdal:gridnearestneighbor
# name: Nearest Neighbor interpolation
# params: