Skip to content

Commit

Permalink
[processing] restore proximity algorithm
Browse files Browse the repository at this point in the history
  • Loading branch information
alexbruy committed Oct 11, 2017
1 parent 587907e commit 10baf9a
Show file tree
Hide file tree
Showing 3 changed files with 120 additions and 67 deletions.
4 changes: 2 additions & 2 deletions python/plugins/processing/algs/gdal/GdalAlgorithmProvider.py
Expand Up @@ -53,6 +53,7 @@
from .nearblack import nearblack
from .pct2rgb import pct2rgb
from .polygonize import polygonize
from .proximity import proximity
from .rgb2pct import rgb2pct
from .roughness import roughness
from .sieve import sieve
Expand All @@ -65,7 +66,6 @@
# from .merge import merge
# from .gdaladdo import gdaladdo
# from .rasterize import rasterize
# from .proximity import proximity
# from .extractprojection import ExtractProjection
# from .gdal2xyz import gdal2xyz
# from .gdalcalc import gdalcalc
Expand Down Expand Up @@ -156,6 +156,7 @@ def loadAlgorithms(self):
nearblack(),
pct2rgb(),
polygonize(),
proximity(),
rgb2pct(),
roughness(),
sieve(),
Expand All @@ -167,7 +168,6 @@ def loadAlgorithms(self):
# merge(),
# gdaladdo(),
# rasterize(),
# proximity(),
# ExtractProjection(),
# gdal2xyz(),
# gdalcalc(),
Expand Down
149 changes: 101 additions & 48 deletions python/plugins/processing/algs/gdal/proximity.py
Expand Up @@ -16,7 +16,6 @@
* *
***************************************************************************
"""
from builtins import str

__author__ = 'Victor Olaya'
__date__ = 'August 2012'
Expand All @@ -30,32 +29,36 @@

from qgis.PyQt.QtGui import QIcon

from qgis.core import (QgsRasterFileWriter,
QgsProcessingParameterDefinition,
QgsProcessingParameterRasterLayer,
QgsProcessingParameterBand,
QgsProcessingParameterEnum,
QgsProcessingParameterString,
QgsProcessingParameterNumber,
QgsProcessingParameterRasterDestination)
from processing.algs.gdal.GdalAlgorithm import GdalAlgorithm
from processing.core.parameters import ParameterRaster
from processing.core.parameters import ParameterString
from processing.core.parameters import ParameterSelection
from processing.core.parameters import ParameterNumber
from processing.core.outputs import OutputRaster
from processing.tools.system import isWindows
from processing.algs.gdal.GdalUtils import GdalUtils

from processing.tools.system import isWindows

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


class proximity(GdalAlgorithm):

INPUT = 'INPUT'
BAND = 'BAND'
VALUES = 'VALUES'
MAX_DISTANCE = 'MAX_DISTANCE'
REPLACE = 'REPLACE'
UNITS = 'UNITS'
MAX_DIST = 'MAX_DIST'
NODATA = 'NODATA'
BUF_VAL = 'BUF_VAL'
OPTIONS = 'OPTIONS'
DATA_TYPE = 'DATA_TYPE'
OUTPUT = 'OUTPUT'
RTYPE = 'RTYPE'

TYPE = ['Byte', 'Int16', 'UInt16', 'UInt32', 'Int32', 'Float32', 'Float64']

DISTUNITS = ['GEO', 'PIXEL']
TYPES = ['Byte', 'Int16', 'UInt16', 'UInt32', 'Int32', 'Float32', 'Float64', 'CInt16', 'CInt32', 'CFloat32', 'CFloat64']

def icon(self):
return QIcon(os.path.join(pluginPath, 'images', 'gdaltools', 'proximity.png'))
Expand All @@ -64,22 +67,62 @@ def __init__(self):
super().__init__()

def initAlgorithm(self, config=None):
self.addParameter(ParameterRaster(self.INPUT,
self.tr('Input layer'), False))
self.addParameter(ParameterString(self.VALUES,
self.tr('Values'), ''))
self.addParameter(ParameterSelection(self.UNITS,
self.tr('Distance units'), self.DISTUNITS, 0))
self.addParameter(ParameterNumber(self.MAX_DIST,
self.tr('Max distance (negative value to ignore)'), -1, 9999, -1))
self.addParameter(ParameterNumber(self.NODATA,
self.tr('Nodata (negative value to ignore)'), -1, 9999, -1))
self.addParameter(ParameterNumber(self.BUF_VAL,
self.tr('Fixed buf value (negative value to ignore)'),
-1, 9999, -1))
self.addParameter(ParameterSelection(self.RTYPE,
self.tr('Output raster type'), self.TYPE, 5))
self.addOutput(OutputRaster(self.OUTPUT, self.tr('Distance')))
self.distanceUnits = ((self.tr('Georeferenced coordinates'), 'GEO'),
(self.tr('Pixel coordinates'), 'PIXEL'))

self.addParameter(QgsProcessingParameterRasterLayer(self.INPUT,
self.tr('Input layer')))
self.addParameter(QgsProcessingParameterBand(self.BAND,
self.tr('Band number'),
parentLayerParameterName=self.INPUT))
self.addParameter(QgsProcessingParameterString(self.VALUES,
self.tr('A list of pixel values in the source image to be considered target pixels'),
optional=True))
self.addParameter(QgsProcessingParameterEnum(self.UNITS,
self.tr('Distance units'),
options=[i[0] for i in self.distanceUnits],
allowMultiple=False,
defaultValue=1))
self.addParameter(QgsProcessingParameterNumber(self.MAX_DISTANCE,
self.tr('The maximum distance to be generated'),
type=QgsProcessingParameterNumber.Double,
minValue=0.0,
maxValue=99999999.999999,
defaultValue=0.0,
optional=True))
self.addParameter(QgsProcessingParameterNumber(self.REPLACE,
self.tr('Value to be applied to all pixels that are within the -maxdist of target pixels'),
type=QgsProcessingParameterNumber.Double,
minValue=0.0,
maxValue=99999999.999999,
defaultValue=0.0,
optional=True))
self.addParameter(QgsProcessingParameterNumber(self.NODATA,
self.tr('Nodata value to use for the destination proximity raster'),
type=QgsProcessingParameterNumber.Double,
minValue=-99999999.999999,
maxValue=99999999.999999,
defaultValue=0.0,
optional=True))

options_param = QgsProcessingParameterString(self.OPTIONS,
self.tr('Additional creation parameters'),
defaultValue='',
optional=True)
options_param.setFlags(options_param.flags() | QgsProcessingParameterDefinition.FlagAdvanced)
options_param.setMetadata({
'widget_wrapper': {
'class': 'processing.algs.gdal.ui.RasterOptionsWidget.RasterOptionsWidgetWrapper'}})
self.addParameter(options_param)

self.addParameter(QgsProcessingParameterEnum(self.DATA_TYPE,
self.tr('Output data type'),
self.TYPES,
allowMultiple=False,
defaultValue=5))

self.addParameter(QgsProcessingParameterRasterDestination(self.OUTPUT,
self.tr('Proximity map')))

def name(self):
return 'proximity'
Expand All @@ -91,39 +134,49 @@ def group(self):
return self.tr('Raster analysis')

def getConsoleCommands(self, parameters, context, feedback):
output = self.getOutputValue(self.OUTPUT)
inLayer = self.parameterAsRasterLayer(parameters, self.INPUT, context)
distance = self.parameterAsDouble(parameters, self.MAX_DISTANCE, context)
replaceValue = self.parameterAsDouble(parameters, self.REPLACE, context)
nodata = self.parameterAsDouble(parameters, self.NODATA, context)
options = self.parameterAsString(parameters, self.OPTIONS, context)
out = self.parameterAsOutputLayer(parameters, self.OUTPUT, context)

arguments = []
arguments.append('-ot')
arguments.append(self.TYPE[self.getParameterValue(self.RTYPE)])
arguments.append(self.getParameterValue(self.INPUT))
arguments.append(output)

arguments.append('-of')
arguments.append(GdalUtils.getFormatShortNameFromFilename(output))
arguments.append('-srcband')
arguments.append(str(self.parameterAsInt(parameters, self.BAND, context)))

arguments.append('-distunits')
arguments.append(self.DISTUNITS[self.getParameterValue(self.UNITS)])
arguments.append(self.distanceUnits[self.parameterAsEnum(parameters, self.UNITS, context)][1])

values = self.getParameterValue(self.VALUES)
if len(values) > 0:
values = self.parameterAsString(parameters, self.VALUES, context)
if values:
arguments.append('-values')
arguments.append(values)

dist = self.getParameterValue(self.MAX_DIST)
if dist > 0:
if distance:
arguments.append('-maxdist')
arguments.append(str(dist))
arguments.append(str(distance))

nodata = self.getParameterValue(self.NODATA)
if nodata > 0:
if nodata:
arguments.append('-nodata')
arguments.append(str(nodata))

buf = self.getParameterValue(self.BUF_VAL)
if buf > 0:
if replaceValue:
arguments.append('-fixed-buf-val')
arguments.append(str(buf))
arguments.append(str(replaceValue))

arguments.append('-ot')
arguments.append(self.TYPES[self.parameterAsEnum(parameters, self.DATA_TYPE, context)])

arguments.append('-of')
arguments.append(QgsRasterFileWriter.driverForExtension(os.path.splitext(out)[1]))

if options:
arguments.append('-co')
arguments.append(options)

arguments.append(inLayer.source())
arguments.append(out)

commands = []
if isWindows():
Expand Down
34 changes: 17 additions & 17 deletions python/plugins/processing/tests/testdata/gdal_algorithm_tests.yaml
Expand Up @@ -256,6 +256,23 @@ tests:
hash: 4f4720e4efe59a7f238f622659917bbeb5262369d15d5e2917dbcf8b
type: rasterhash

- algorithm: gdal:proximity
name: Proximity raster
params:
BUF_VAL: -1
INPUT:
name: custom/dem_boolean.tif
type: raster
MAX_DIST: -1
NODATA: -1
RTYPE: '5'
UNITS: '0'
VALUES: '1'
results:
OUTPUT:
hash: a497763f44380ec33acab572a926a6516e875f2284fc55e702abbdfc
type: rasterhash

# - algorithm: gdal:ogrinfo
# name: ogrinfo
# params:
Expand Down Expand Up @@ -415,23 +432,6 @@ tests:
# hash: cbf7b8ca91e7d6cab5ef76eeed6ce80e5dbe173afb7b8eb4aed2e969
# type: rasterhash
#
# - algorithm: gdal:proximity
# name: Proximity raster
# params:
# BUF_VAL: -1
# INPUT:
# name: custom/dem_boolean.tif
# type: raster
# MAX_DIST: -1
# NODATA: -1
# RTYPE: '5'
# UNITS: '0'
# VALUES: '1'
# results:
# OUTPUT:
# hash: a497763f44380ec33acab572a926a6516e875f2284fc55e702abbdfc
# type: rasterhash
#
# - algorithm: gdal:rastercalculator
# name: Simple Raster Calculator test with only 1 raster
# params:
Expand Down

0 comments on commit 10baf9a

Please sign in to comment.