Skip to content

Commit

Permalink
[processing] restore clip raster by extent algorithm
Browse files Browse the repository at this point in the history
  • Loading branch information
alexbruy committed Oct 11, 2017
1 parent 4272b8b commit 1744ad7
Show file tree
Hide file tree
Showing 3 changed files with 92 additions and 80 deletions.
128 changes: 70 additions & 58 deletions python/plugins/processing/algs/gdal/ClipByExtent.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@
* *
***************************************************************************
"""
from builtins import str

__author__ = 'Alexander Bruy'
__date__ = 'September 2013'
Expand All @@ -30,97 +29,110 @@

from qgis.PyQt.QtGui import QIcon

from qgis.core import (QgsRasterFileWriter,
QgsProcessingParameterDefinition,
QgsProcessingParameterRasterLayer,
QgsProcessingParameterEnum,
QgsProcessingParameterExtent,
QgsProcessingParameterString,
QgsProcessingParameterNumber,
QgsProcessingParameterRasterDestination)
from processing.algs.gdal.GdalAlgorithm import GdalAlgorithm

from processing.core.parameters import (ParameterRaster,
ParameterExtent,
ParameterString,
ParameterSelection)
from processing.core.outputs import OutputRaster

from processing.algs.gdal.GdalUtils import GdalUtils


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


class ClipByExtent(GdalAlgorithm):

INPUT = 'INPUT'
OUTPUT = 'OUTPUT'
NO_DATA = 'NO_DATA'
PROJWIN = 'PROJWIN'
EXTENT = 'PROJWIN'
NODATA = 'NODATA'
OPTIONS = 'OPTIONS'
RTYPE = 'RTYPE'
TYPE = ['Byte', 'Int16', 'UInt16', 'UInt32', 'Int32', 'Float32', 'Float64']
DATA_TYPE = 'DATA_TYPE'
OUTPUT = 'OUTPUT'

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

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

def initAlgorithm(self, config=None):
self.addParameter(ParameterRaster(self.INPUT, self.tr('Input layer')))
self.addParameter(ParameterString(self.NO_DATA,
self.tr("Nodata value, leave blank to take the nodata value from input"),
'',
optional=True))
self.addParameter(ParameterExtent(self.PROJWIN, self.tr('Clipping extent')))
self.addParameter(ParameterString(self.OPTIONS,
self.tr('Additional creation options'),
optional=True,
metadata={'widget_wrapper': 'processing.algs.gdal.ui.RasterOptionsWidget.RasterOptionsWidgetWrapper'}))
self.addParameter(ParameterSelection(self.RTYPE,
self.tr('Output raster type'),
self.TYPE, 5))

self.addOutput(OutputRaster(self.OUTPUT, self.tr('Clipped (extent)')))
self.addParameter(QgsProcessingParameterRasterLayer(self.INPUT,
self.tr('Input layer')))
self.addParameter(QgsProcessingParameterNumber(self.NODATA,
self.tr('Assign a specified nodata value to output bands'),
type=QgsProcessingParameterNumber.Double,
minValue=-99999999.999999,
maxValue=99999999.999999,
defaultValue=0.0,
optional=True))
self.addParameter(QgsProcessingParameterExtent(self.EXTENT,
self.tr('Clipping extent')))

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('Clipped (extent)')))

def name(self):
return 'cliprasterbyextent'

def displayName(self):
return self.tr('Clip raster by extent')

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

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

def group(self):
return self.tr('Raster extraction')
def commandName(self):
return "gdal_translate"

def getConsoleCommands(self, parameters, context, feedback):
out = self.getOutputValue(self.OUTPUT)
noData = self.getParameterValue(self.NO_DATA)
opts = self.getParameterValue(self.OPTIONS)
projwin = self.getParameterValue(self.PROJWIN)
layer = self.getParameterValue(self.INPUT)
if not projwin:
projwin = QgsProcessingUtils.combineLayerExtents([layer])

if noData is not None:
noData = str(noData)
inLayer = self.parameterAsRasterLayer(parameters, self.INPUT, context)
bbox = self.parameterAsExtent(parameters, self.EXTENT, 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('-of')
arguments.append(GdalUtils.getFormatShortNameFromFilename(out))
arguments.append('-projwin')
arguments.append(str(bbox.xMinimum()))
arguments.append(str(bbox.yMaximum()))
arguments.append(str(bbox.xMaximum()))
arguments.append(str(bbox.yMinimum()))

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

arguments.append('-ot')
arguments.append(self.TYPE[self.getParameterValue(self.RTYPE)])
if noData and len(noData) > 0:
arguments.append('-a_nodata')
arguments.append(noData)
arguments.append(self.TYPES[self.parameterAsEnum(parameters, self.DATA_TYPE, context)])

regionCoords = projwin.split(',')
arguments.append('-projwin')
arguments.append(regionCoords[0])
arguments.append(regionCoords[3])
arguments.append(regionCoords[1])
arguments.append(regionCoords[2])
arguments.append('-of')
arguments.append(QgsRasterFileWriter.driverForExtension(os.path.splitext(out)[1]))

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

arguments.append(self.getParameterValue(self.INPUT))
arguments.append(inLayer.source())
arguments.append(out)

return ['gdal_translate', GdalUtils.escapeAndJoin(arguments)]

def commandName(self):
return "gdal_translate"
4 changes: 2 additions & 2 deletions python/plugins/processing/algs/gdal/GdalAlgorithmProvider.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@
from .AssignProjection import AssignProjection
from .aspect import aspect
from .buildvrt import buildvrt
from .ClipByExtent import ClipByExtent
from .ColorRelief import ColorRelief
from .contour import contour
from .fillnodata import fillnodata
Expand All @@ -62,7 +63,6 @@

# from .merge import merge
# from .gdaladdo import gdaladdo
# from .ClipByExtent import ClipByExtent
# from .ClipByMask import ClipByMask
# from .rasterize import rasterize
# from .proximity import proximity
Expand Down Expand Up @@ -139,6 +139,7 @@ def loadAlgorithms(self):
AssignProjection(),
aspect(),
buildvrt(),
ClipByExtent(),
ColorRelief(),
contour(),
fillnodata(),
Expand All @@ -164,7 +165,6 @@ def loadAlgorithms(self):
warp(),
# merge(),
# gdaladdo(),
# ClipByExtent(),
# ClipByMask(),
# rasterize(),
# proximity(),
Expand Down
40 changes: 20 additions & 20 deletions python/plugins/processing/tests/testdata/gdal_algorithm_tests.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -140,26 +140,6 @@ tests:
# precision: 7
#
# - algorithm: gdal:cliprasterbyextent
# name: Clip raster by extent
# params:
# BIGTIFF: '0'
# COMPRESS: '4'
# INPUT:
# name: dem.tif
# type: raster
# JPEGCOMPRESSION: 75
# PREDICTOR: 1
# PROJWIN: 18.67551824296977,18.697800756150787,45.78984181545589,45.804309302274866
# RTYPE: '5'
# TFW: false
# TILED: false
# ZLEVEL: 6
# results:
# OUTPUT:
# hash: 9913a7c0e1ced2c2ce1cd8f0e8103475bc2b0dd4d1d0adafe4920f93
# type: rasterhash
#
# - algorithm: gdal:cliprasterbyextent
# name: Clip raster by extent and change no data values
# params:
# BIGTIFF: '0'
Expand Down Expand Up @@ -452,6 +432,26 @@ tests:
hash: 6ee933d53e1a2ffadfd88333919255e68bb945e833e50d112124bfd5
type: rasterhash

- algorithm: gdal:cliprasterbyextent
name: Clip raster by extent
params:
BIGTIFF: '0'
COMPRESS: '4'
INPUT:
name: dem.tif
type: raster
JPEGCOMPRESSION: 75
PREDICTOR: 1
PROJWIN: 18.67551824296977,18.697800756150787,45.78984181545589,45.804309302274866
RTYPE: '5'
TFW: false
TILED: false
ZLEVEL: 6
results:
OUTPUT:
hash: 9913a7c0e1ced2c2ce1cd8f0e8103475bc2b0dd4d1d0adafe4920f93
type: rasterhash

# - algorithm: gdal:merge
# name: Merge 2 raster layers
# params:
Expand Down

0 comments on commit 1744ad7

Please sign in to comment.