Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
[processing][FEATURE] add IDW with neareast neighbor search
  • Loading branch information
alexbruy committed Oct 11, 2017
1 parent 26f8035 commit 4666244
Show file tree
Hide file tree
Showing 2 changed files with 170 additions and 0 deletions.
2 changes: 2 additions & 0 deletions python/plugins/processing/algs/gdal/GdalAlgorithmProvider.py
Expand Up @@ -43,6 +43,7 @@
from .GridAverage import GridAverage
from .GridDataMetrics import GridDataMetrics
from .GridInverseDistance import GridInverseDistance
from .GridInverseDistanceNearestNeighbor import GridInverseDistanceNearestNeighbor
from .GridNearestNeighbor import GridNearestNeighbor
from .hillshade import hillshade
from .information import information
Expand Down Expand Up @@ -144,6 +145,7 @@ def loadAlgorithms(self):
GridAverage(),
GridDataMetrics(),
GridInverseDistance(),
GridInverseDistanceNearestNeighbor(),
GridNearestNeighbor(),
hillshade(),
information(),
Expand Down
@@ -0,0 +1,168 @@
# -*- coding: utf-8 -*-

"""
***************************************************************************
GridInverseDistanceNearestNeighbor.py
---------------------
Date : September 2017
Copyright : (C) 2017 by Alexander Bruy
Email : alexander dot bruy at gmail dot com
***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************
"""

__author__ = 'Alexander Bruy'
__date__ = 'September 2017'
__copyright__ = '(C) 2017, Alexander Bruy'

# This will get replaced with a git SHA1 when you do a git archive

__revision__ = '$Format:%H$'


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.algs.gdal.GdalUtils import GdalUtils

pluginPath = os.path.split(os.path.split(os.path.dirname(__file__))[0])[0]


class GridInverseDistanceNearestNeighbor(GdalAlgorithm):

INPUT = 'INPUT'
Z_FIELD = 'Z_FIELD'
POWER = 'POWER'
SMOOTHING = 'SMOOTHING'
RADIUS = 'RADIUS'
MAX_POINTS = 'MAX_POINTS'
MIN_POINTS = 'MIN_POINTS'
NODATA = 'NODATA'
DATA_TYPE = 'DATA_TYPE'
OUTPUT = 'OUTPUT'

TYPE = ['Byte', 'Int16', 'UInt16', 'UInt32', 'Int32', 'Float32', 'Float64', 'CInt16', 'CInt32', 'CFloat32', 'CFloat64']

def __init__(self):
super().__init__()

def initAlgorithm(self, config=None):
self.addParameter(QgsProcessingParameterVectorLayer(self.INPUT,
self.tr('Point layer'),
[QgsProcessing.TypeVectorPoint]))

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.POWER,
self.tr('Weighting power'),
type=QgsProcessingParameterNumber.Double,
minValue=0.0,
maxValue=100.0,
defaultValue=2.0))
self.addParameter(QgsProcessingParameterNumber(self.SMOOTHING,
self.tr('Smoothing'),
type=QgsProcessingParameterNumber.Double,
minValue=0.0,
maxValue=99999999.999999,
defaultValue=0.0))
self.addParameter(QgsProcessingParameterNumber(self.RADIUS,
self.tr('The radius of the search circle'),
type=QgsProcessingParameterNumber.Double,
minValue=0.0,
maxValue=99999999.999999,
defaultValue=1.0))
self.addParameter(QgsProcessingParameterNumber(self.MAX_POINTS,
self.tr('Maximum number of data points to use'),
type=QgsProcessingParameterNumber.Integer,
minValue=0,
maxValue=99999999,
defaultValue=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 (IDW)')))

def name(self):
return 'gridinversedistancenearestneighbor'

def displayName(self):
return self.tr('Grid (IDW with nearest neighbor searching)')

def group(self):
return self.tr('Raster analysis')

def icon(self):
return QIcon(os.path.join(pluginPath, 'images', 'gdaltools', 'grid.png'))

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 = 'invdistnn'
params += ':power={}'.format(self.parameterAsDouble(parameters, self.POWER, context))
params += ':smothing={}'.format(self.parameterAsDouble(parameters, self.SMOOTHING, context))
params += ':radius={}'.format(self.parameterAsDouble(parameters, self.RADIUS, context))
params += ':max_points={}'.format(self.parameterAsInt(parameters, self.MAX_POINTS, 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.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)]

0 comments on commit 4666244

Please sign in to comment.