Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
[processing] restore contour algorithm
Also expose new parameters and use custom widget for additional
creation options
  • Loading branch information
alexbruy committed Oct 11, 2017
1 parent 6ec7b6e commit 90308f3
Show file tree
Hide file tree
Showing 3 changed files with 96 additions and 37 deletions.
4 changes: 2 additions & 2 deletions python/plugins/processing/algs/gdal/GdalAlgorithmProvider.py
Expand Up @@ -37,6 +37,7 @@
from .aspect import aspect
from .buildvrt import buildvrt
from .ColorRelief import ColorRelief
from .contour import contour
from .hillshade import hillshade
from .information import information
from .nearblack import nearblack
Expand All @@ -54,7 +55,6 @@
# from .gdaladdo import gdaladdo
# from .ClipByExtent import ClipByExtent
# from .ClipByMask import ClipByMask
# from .contour import contour
# from .rasterize import rasterize
# from .proximity import proximity
# from .sieve import sieve
Expand Down Expand Up @@ -138,6 +138,7 @@ def loadAlgorithms(self):
aspect(),
buildvrt(),
ColorRelief(),
contour(),
hillshade(),
information(),
nearblack(),
Expand All @@ -154,7 +155,6 @@ def loadAlgorithms(self):
# gdaladdo(),
# ClipByExtent(),
# ClipByMask(),
# contour(),
# rasterize(),
# proximity(),
# sieve(),
Expand Down
127 changes: 93 additions & 34 deletions python/plugins/processing/algs/gdal/contour.py
Expand Up @@ -30,44 +30,87 @@

from qgis.PyQt.QtGui import QIcon

from qgis.core import (QgsProcessing,
QgsProcessingParameterDefinition,
QgsProcessingParameterRasterLayer,
QgsProcessingParameterBand,
QgsProcessingParameterString,
QgsProcessingParameterNumber,
QgsProcessingParameterBoolean,
QgsProcessingParameterVectorDestination)
from processing.algs.gdal.GdalAlgorithm import GdalAlgorithm

from processing.core.parameters import ParameterRaster
from processing.core.parameters import ParameterNumber
from processing.core.parameters import ParameterString

from processing.core.outputs import OutputVector

from processing.tools.system import isWindows
from processing.algs.gdal.GdalUtils import GdalUtils

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


class contour(GdalAlgorithm):

INPUT_RASTER = 'INPUT_RASTER'
OUTPUT_VECTOR = 'OUTPUT_VECTOR'
INPUT = 'INPUT'
BAND = 'BAND'
INTERVAL = 'INTERVAL'
FIELD_NAME = 'FIELD_NAME'
CREATE_3D = 'CREATE_3D'
IGNORE_NODATA = 'IGNORE_NODATA'
NODATA = 'NODATA'
OFFSET = 'OFFSET'
EXTRA = 'EXTRA'
OUTPUT = 'OUTPUT'

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

def initAlgorithm(self, config=None):
self.addParameter(ParameterRaster(self.INPUT_RASTER,
self.tr('Input layer'), False))
self.addParameter(ParameterNumber(self.INTERVAL,
self.tr('Interval between contour lines'), 0.0,
99999999.999999, 10.0))
self.addParameter(ParameterString(self.FIELD_NAME,
self.tr('Attribute name (if not set, no elevation attribute is attached)'),
'ELEV', optional=True))
self.addParameter(ParameterString(self.EXTRA,
self.tr('Additional creation parameters'), '', optional=True))

self.addOutput(OutputVector(self.OUTPUT_VECTOR,
self.tr('Contours')))
self.addParameter(QgsProcessingParameterRasterLayer(self.INPUT, self.tr('Input layer')))
self.addParameter(QgsProcessingParameterBand(
self.BAND, self.tr('Band number'), parentLayerParameterName=self.INPUT))
self.addParameter(QgsProcessingParameterNumber(
self.INTERVAL, self.tr('Interval between contour lines'),
type=QgsProcessingParameterNumber.Double,
minValue=0.0, maxValue=99999999.999999, defaultValue=10.0))
self.addParameter(QgsProcessingParameterString(
self.FIELD_NAME, self.tr('Attribute name (if not set, no elevation attribute is attached)'),
defaultValue='ELEV', optional=True))

create_3d_param = QgsProcessingParameterBoolean(self.CREATE_3D,
self.tr('Produce 3D vector'),
defaultValue=False)
create_3d_param.setFlags(create_3d_param.flags() | QgsProcessingParameterDefinition.FlagAdvanced)
self.addParameter(create_3d_param)

ignore_nodata_param = QgsProcessingParameterBoolean(self.IGNORE_NODATA,
self.tr('Treat all raster values as valid'),
defaultValue=False)
ignore_nodata_param.setFlags(ignore_nodata_param.flags() | QgsProcessingParameterDefinition.FlagAdvanced)
self.addParameter(ignore_nodata_param)

nodata_param = QgsProcessingParameterNumber(
self.NODATA, self.tr('Input pixel value to treat as "nodata"'),
type=QgsProcessingParameterNumber.Double,
minValue=-99999999.999999, maxValue=99999999.999999, defaultValue=0.0, optional=True)
nodata_param.setFlags(nodata_param.flags() | QgsProcessingParameterDefinition.FlagAdvanced)
self.addParameter(nodata_param)

offset_param = QgsProcessingParameterNumber(
self.OFFSET, self.tr('Offset from zero relative to which to interpret intervals'),
type=QgsProcessingParameterNumber.Double,
minValue=0.0, maxValue=99999999.999999, defaultValue=0.0, optional=True)
nodata_param.setFlags(offset_param.flags() | QgsProcessingParameterDefinition.FlagAdvanced)
self.addParameter(offset_param)

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

self.addParameter(QgsProcessingParameterVectorDestination(
self.OUTPUT, self.tr('Contours'), QgsProcessing.TypeVectorLine))

def name(self):
return 'contour'
Expand All @@ -82,28 +125,44 @@ def group(self):
return self.tr('Raster extraction')

def getConsoleCommands(self, parameters, context, feedback):
output = self.getOutputValue(self.OUTPUT_VECTOR)
interval = str(self.getParameterValue(self.INTERVAL))
fieldName = str(self.getParameterValue(self.FIELD_NAME))
extra = self.getParameterValue(self.EXTRA)
if extra is not None:
extra = str(extra)
inLayer = self.parameterAsRasterLayer(parameters, self.INPUT, context)
band = str(self.parameterAsInt(parameters, self.BAND, context))
interval = str(self.parameterAsDouble(parameters, self.INTERVAL, context))
fieldName = self.parameterAsString(parameters, self.FIELD_NAME, context)
nodata = self.parameterAsDouble(parameters, self.NODATA, context)
offset = self.parameterAsDouble(parameters, self.OFFSET, context)
extra = self.parameterAsString(parameters, self.EXTRA, context)

outFile = self.parameterAsOutputLayer(parameters, self.OUTPUT, context)
output, format = GdalUtils.ogrConnectionStringAndFormat(outFile, context)

arguments = []
if len(fieldName) > 0:
if fieldName:
arguments.append('-a')
arguments.append(fieldName)

arguments.append('-i')
arguments.append(interval)

driver = GdalUtils.getVectorDriverFromFileName(output)
arguments.append('-f')
arguments.append(driver)
if self.parameterAsBool(parameters, self.CREATE_3D, context):
arguments.append('-3d')

if self.parameterAsBool(parameters, self.IGNORE_NODATA, context):
arguments.append('-inodata')

if nodata:
arguments.append('-snodata {}'.format(nodata))

if offset:
arguments.append('-off {}'.format(offset))

if format:
arguments.append('-f {}'.format(format))

if extra and len(extra) > 0:
if extra:
arguments.append(extra)

arguments.append(self.getParameterValue(self.INPUT_RASTER))
arguments.append(inLayer.source())
arguments.append(output)

return ['gdal_contour', GdalUtils.escapeAndJoin(arguments)]
Expand Up @@ -61,7 +61,7 @@ def setValue(self, value):
elif self.dialogType == DIALOG_BATCH:
self.widget.setText(value)
else:
self.widget.setValue(value)
self.widget.setOptions(value)

def value(self):
if self.dialogType == DIALOG_MODELER:
Expand Down

0 comments on commit 90308f3

Please sign in to comment.