Skip to content

Commit

Permalink
Merge pull request #5092 from nyalldawson/algs
Browse files Browse the repository at this point in the history
Port some GDAL algs to new API
  • Loading branch information
nyalldawson committed Aug 30, 2017
2 parents 12e69d0 + d463178 commit 3b997c2
Show file tree
Hide file tree
Showing 6 changed files with 116 additions and 107 deletions.
15 changes: 8 additions & 7 deletions python/plugins/processing/algs/gdal/GdalAlgorithmProvider.py
Expand Up @@ -37,12 +37,13 @@
from .aspect import aspect from .aspect import aspect
from .buildvrt import buildvrt from .buildvrt import buildvrt
from .ColorRelief import ColorRelief from .ColorRelief import ColorRelief
from .information import information
from .rgb2pct import rgb2pct
from .translate import translate
from .tri import tri from .tri import tri
from .warp import warp from .warp import warp
from .nearblack import nearblack from .nearblack import nearblack
# from .information import information
# from .rgb2pct import rgb2pct
# from .translate import translate
# from .pct2rgb import pct2rgb # from .pct2rgb import pct2rgb
# from .merge import merge # from .merge import merge
# from .polygonize import polygonize # from .polygonize import polygonize
Expand Down Expand Up @@ -140,16 +141,16 @@ def svgIconPath(self):


def loadAlgorithms(self): def loadAlgorithms(self):
self.algs = [ self.algs = [
nearblack(),
# information(),
AssignProjection(), AssignProjection(),
aspect(), aspect(),
buildvrt(), buildvrt(),
ColorRelief(), ColorRelief(),
information(),
nearblack(),
rgb2pct(),
translate(),
tri(), tri(),
warp(), warp(),
# translate(),
# rgb2pct(),
# pct2rgb(), # pct2rgb(),
# merge(), # merge(),
# polygonize(), # polygonize(),
Expand Down
2 changes: 2 additions & 0 deletions python/plugins/processing/algs/gdal/GdalUtils.py
Expand Up @@ -193,6 +193,8 @@ def getFormatShortNameFromFilename(filename):
def escapeAndJoin(strList): def escapeAndJoin(strList):
joined = '' joined = ''
for s in strList: for s in strList:
if not isinstance(s, str):
s = str(s)
if s and s[0] != '-' and ' ' in s: if s and s[0] != '-' and ' ' in s:
escaped = '"' + s.replace('\\', '\\\\').replace('"', '\\"') \ escaped = '"' + s.replace('\\', '\\\\').replace('"', '\\"') \
+ '"' + '"'
Expand Down
36 changes: 20 additions & 16 deletions python/plugins/processing/algs/gdal/information.py
Expand Up @@ -29,10 +29,11 @@
import os import os


from qgis.PyQt.QtGui import QIcon from qgis.PyQt.QtGui import QIcon

from qgis.core import (QgsProcessingParameterRasterLayer,
QgsProcessingParameterBoolean,
QgsProcessingParameterFileDestination,
QgsProcessingOutputHtml)
from processing.algs.gdal.GdalAlgorithm import GdalAlgorithm from processing.algs.gdal.GdalAlgorithm import GdalAlgorithm
from processing.core.parameters import ParameterRaster
from processing.core.parameters import ParameterBoolean
from processing.core.outputs import OutputHTML from processing.core.outputs import OutputHTML
from processing.algs.gdal.GdalUtils import GdalUtils from processing.algs.gdal.GdalUtils import GdalUtils


Expand All @@ -53,14 +54,15 @@ def __init__(self):
super().__init__() super().__init__()


def initAlgorithm(self, config=None): def initAlgorithm(self, config=None):
self.addParameter(ParameterRaster(information.INPUT, self.addParameter(QgsProcessingParameterRasterLayer(information.INPUT,
self.tr('Input layer'), False)) self.tr('Input layer'), optional=False))
self.addParameter(ParameterBoolean(information.NOGCP, self.addParameter(QgsProcessingParameterBoolean(information.NOGCP,
self.tr('Suppress GCP info'), False)) self.tr('Suppress GCP info'), defaultValue=False))
self.addParameter(ParameterBoolean(information.NOMETADATA, self.addParameter(QgsProcessingParameterBoolean(information.NOMETADATA,
self.tr('Suppress metadata info'), False)) self.tr('Suppress metadata info'), defaultValue=False))
self.addOutput(OutputHTML(information.OUTPUT,
self.tr('Layer information'))) self.addParameter(QgsProcessingParameterFileDestination(self.OUTPUT, self.tr('Layer information'), self.tr('HTML files (*.html)')))
self.addOutput(QgsProcessingOutputHtml(self.OUTPUT, self.tr('Layer information')))


def name(self): def name(self):
return 'gdalinfo' return 'gdalinfo'
Expand All @@ -73,18 +75,20 @@ def group(self):


def getConsoleCommands(self, parameters, context, feedback): def getConsoleCommands(self, parameters, context, feedback):
arguments = [] arguments = []
if self.getParameterValue(information.NOGCP): if self.parameterAsBool(parameters, information.NOGCP, context):
arguments.append('-nogcp') arguments.append('-nogcp')
if self.getParameterValue(information.NOMETADATA): if self.parameterAsBool(parameters, information.NOMETADATA, context):
arguments.append('-nomd') arguments.append('-nomd')
arguments.append(self.getParameterValue(information.INPUT)) arguments.append(self.parameterAsRasterLayer(parameters, information.INPUT, context).source())
return ['gdalinfo', GdalUtils.escapeAndJoin(arguments)] return ['gdalinfo', GdalUtils.escapeAndJoin(arguments)]


def processAlgorithm(self, parameters, context, feedback): def processAlgorithm(self, parameters, context, feedback):
GdalUtils.runGdal(self.getConsoleCommands(parameters), feedback) GdalUtils.runGdal(self.getConsoleCommands(parameters, context, feedback), feedback)
output = self.getOutputValue(information.OUTPUT) output = self.parameterAsFileOutput(parameters, self.OUTPUT, context)
with open(output, 'w') as f: with open(output, 'w') as f:
f.write('<pre>') f.write('<pre>')
for s in GdalUtils.getConsoleOutput()[1:]: for s in GdalUtils.getConsoleOutput()[1:]:
f.write(str(s)) f.write(str(s))
f.write('</pre>') f.write('</pre>')

return {self.OUTPUT: output}
22 changes: 11 additions & 11 deletions python/plugins/processing/algs/gdal/rgb2pct.py
Expand Up @@ -31,10 +31,10 @@


from qgis.PyQt.QtGui import QIcon from qgis.PyQt.QtGui import QIcon


from qgis.core import (QgsProcessingParameterRasterLayer,
QgsProcessingParameterNumber,
QgsProcessingParameterRasterDestination)
from processing.algs.gdal.GdalAlgorithm import GdalAlgorithm from processing.algs.gdal.GdalAlgorithm import GdalAlgorithm
from processing.core.parameters import ParameterRaster
from processing.core.parameters import ParameterNumber
from processing.core.outputs import OutputRaster
from processing.tools.system import isWindows from processing.tools.system import isWindows
from processing.algs.gdal.GdalUtils import GdalUtils from processing.algs.gdal.GdalUtils import GdalUtils


Expand All @@ -57,11 +57,11 @@ def __init__(self):
super().__init__() super().__init__()


def initAlgorithm(self, config=None): def initAlgorithm(self, config=None):
self.addParameter(ParameterRaster(rgb2pct.INPUT, self.addParameter(QgsProcessingParameterRasterLayer(rgb2pct.INPUT,
self.tr('Input layer'), False)) self.tr('Input layer'), optional=False))
self.addParameter(ParameterNumber(rgb2pct.NCOLORS, self.addParameter(QgsProcessingParameterNumber(rgb2pct.NCOLORS,
self.tr('Number of colors'), 1, None, 2)) self.tr('Number of colors'), minValue=1, defaultValue=2))
self.addOutput(OutputRaster(rgb2pct.OUTPUT, self.tr('RGB to PCT'))) self.addParameter(QgsProcessingParameterRasterDestination(self.OUTPUT, self.tr('RGB to PCT')))


def name(self): def name(self):
return 'rgbtopct' return 'rgbtopct'
Expand All @@ -72,11 +72,11 @@ def displayName(self):
def getConsoleCommands(self, parameters, context, feedback): def getConsoleCommands(self, parameters, context, feedback):
arguments = [] arguments = []
arguments.append('-n') arguments.append('-n')
arguments.append(str(self.getParameterValue(rgb2pct.NCOLORS))) arguments.append(str(self.parameterAsInt(parameters, rgb2pct.NCOLORS, context)))
arguments.append('-of') arguments.append('-of')
out = self.getOutputValue(rgb2pct.OUTPUT) out = self.parameterAsOutputLayer(parameters, self.OUTPUT, context)
arguments.append(GdalUtils.getFormatShortNameFromFilename(out)) arguments.append(GdalUtils.getFormatShortNameFromFilename(out))
arguments.append(self.getParameterValue(rgb2pct.INPUT)) arguments.append(self.parameterAsRasterLayer(parameters, self.INPUT, context).source())
arguments.append(out) arguments.append(out)


if isWindows(): if isWindows():
Expand Down
114 changes: 58 additions & 56 deletions python/plugins/processing/algs/gdal/translate.py
Expand Up @@ -30,15 +30,16 @@


from qgis.PyQt.QtGui import QIcon from qgis.PyQt.QtGui import QIcon


from qgis.core import (QgsProcessingParameterRasterLayer,
QgsProcessingParameterNumber,
QgsProcessingParameterBoolean,
QgsProcessingParameterString,
QgsProcessingParameterEnum,
QgsProcessingParameterCrs,
QgsProcessingParameterExtent,
QgsProcessingParameterRasterDestination,
QgsProcessingUtils)
from processing.algs.gdal.GdalAlgorithm import GdalAlgorithm from processing.algs.gdal.GdalAlgorithm import GdalAlgorithm
from processing.core.parameters import (ParameterRaster,
ParameterString,
ParameterNumber,
ParameterBoolean,
ParameterSelection,
ParameterExtent,
ParameterCrs)
from processing.core.outputs import OutputRaster


from processing.algs.gdal.GdalUtils import GdalUtils from processing.algs.gdal.GdalUtils import GdalUtils


Expand Down Expand Up @@ -67,34 +68,35 @@ def __init__(self):
super().__init__() super().__init__()


def initAlgorithm(self, config=None): def initAlgorithm(self, config=None):
self.addParameter(ParameterRaster(self.INPUT, self.tr('Input layer'))) self.addParameter(QgsProcessingParameterRasterLayer(self.INPUT, self.tr('Input layer')))
self.addParameter(ParameterNumber(self.OUTSIZE, self.addParameter(QgsProcessingParameterNumber(self.OUTSIZE,
self.tr('Set the size of the output file (In pixels or %)'), self.tr('Set the size of the output file (In pixels or %)'),
1, None, 100)) minValue=1, defaultValue=100))
self.addParameter(ParameterBoolean(self.OUTSIZE_PERC, self.addParameter(QgsProcessingParameterBoolean(self.OUTSIZE_PERC,
self.tr('Output size is a percentage of input size'), True)) self.tr('Output size is a percentage of input size'), defaultValue=True))
self.addParameter(ParameterString(self.NO_DATA, self.addParameter(QgsProcessingParameterString(self.NO_DATA,
self.tr("Nodata value, leave blank to take the nodata value from input"), self.tr("Nodata value, leave blank to take the nodata value from input"),
'', optional=True)) defaultValue='', optional=True))
self.addParameter(ParameterSelection(self.EXPAND, self.addParameter(QgsProcessingParameterEnum(self.EXPAND,
self.tr('Expand'), ['none', 'gray', 'rgb', 'rgba'], default=0)) self.tr('Expand'), options=['none', 'gray', 'rgb', 'rgba'], defaultValue=0))
self.addParameter(ParameterCrs(self.SRS, self.addParameter(QgsProcessingParameterCrs(self.SRS,
self.tr('Output projection for output file [leave blank to use input projection]'), None, optional=True)) self.tr('Output projection for output file [leave blank to use input projection]'), defaultValue=None, optional=True))
self.addParameter(ParameterExtent(self.PROJWIN, self.addParameter(QgsProcessingParameterExtent(self.PROJWIN,
self.tr('Subset based on georeferenced coordinates'), optional=True)) self.tr('Subset based on georeferenced coordinates'), optional=True))
self.addParameter(ParameterBoolean(self.SDS, self.addParameter(QgsProcessingParameterBoolean(self.SDS,
self.tr('Copy all subdatasets of this file to individual output files'), self.tr('Copy all subdatasets of this file to individual output files'),
False)) defaultValue=False))


self.addParameter(ParameterString(self.OPTIONS, create_options_param = QgsProcessingParameterString(self.OPTIONS,
self.tr('Additional creation options'), self.tr('Additional creation options'),
optional=True, optional=True)
metadata={'widget_wrapper': 'processing.algs.gdal.ui.RasterOptionsWidget.RasterOptionsWidgetWrapper'})) create_options_param.setMetadata({'widget_wrapper': 'processing.algs.gdal.ui.RasterOptionsWidget.RasterOptionsWidgetWrapper'})
self.addParameter(ParameterSelection(self.RTYPE, self.addParameter(create_options_param)
self.tr('Output raster type'), self.addParameter(QgsProcessingParameterEnum(self.RTYPE,
self.TYPE, 5)) self.tr('Output raster type'),

options=self.TYPE, defaultValue=5))
self.addOutput(OutputRaster(self.OUTPUT, self.tr('Converted')))
self.addParameter(QgsProcessingParameterRasterDestination(self.OUTPUT, self.tr('Converted')))


def name(self): def name(self):
return 'translate' return 'translate'
Expand All @@ -106,18 +108,19 @@ def group(self):
return self.tr('Raster conversion') return self.tr('Raster conversion')


def getConsoleCommands(self, parameters, context, feedback): def getConsoleCommands(self, parameters, context, feedback):
inLayer = self.getParameterValue(self.INPUT) inLayer = self.parameterAsRasterLayer(parameters, self.INPUT, context)
out = self.getOutputValue(translate.OUTPUT) out = self.parameterAsOutputLayer(parameters, self.OUTPUT, context)
outsize = str(self.getParameterValue(self.OUTSIZE)) outsize = str(self.parameterAsInt(parameters, self.OUTSIZE, context))
outsizePerc = str(self.getParameterValue(self.OUTSIZE_PERC)) outsizePerc = self.parameterAsBool(parameters, self.OUTSIZE_PERC, context)
noData = self.getParameterValue(self.NO_DATA) noData = self.parameterAsString(parameters, self.NO_DATA, context)
expand = parameters[self.EXPAND].options[self.getParameterValue(self.EXPAND)][1] expand = self.parameterDefinition(self.EXPAND).options()[self.parameterAsEnum(parameters, self.EXPAND, context)]
projwin = str(self.getParameterValue(self.PROJWIN))
if not projwin: proj_extent = self.parameterAsExtent(parameters, self.PROJWIN, context)
projwin = QgsProcessingUtils.combineLayerExtents([inLayer]) if proj_extent.isNull():
crsId = self.getParameterValue(self.SRS) proj_extent = QgsProcessingUtils.combineLayerExtents([inLayer])
sds = self.getParameterValue(self.SDS) crsId = self.parameterAsCrs(parameters, self.SRS, context).authid()
opts = self.getParameterValue(self.OPTIONS) sds = self.parameterAsBool(parameters, self.SDS, context)
opts = self.parameterAsString(parameters, self.OPTIONS, context)


if noData is not None: if noData is not None:
noData = str(noData) noData = str(noData)
Expand All @@ -126,8 +129,8 @@ def getConsoleCommands(self, parameters, context, feedback):
arguments.append('-of') arguments.append('-of')
arguments.append(GdalUtils.getFormatShortNameFromFilename(out)) arguments.append(GdalUtils.getFormatShortNameFromFilename(out))
arguments.append('-ot') arguments.append('-ot')
arguments.append(self.TYPE[self.getParameterValue(self.RTYPE)]) arguments.append(self.TYPE[self.parameterAsEnum(parameters, self.RTYPE, context)])
if outsizePerc == 'True': if outsizePerc:
arguments.append('-outsize') arguments.append('-outsize')
arguments.append(outsize + '%') arguments.append(outsize + '%')
arguments.append(outsize + '%') arguments.append(outsize + '%')
Expand All @@ -141,14 +144,13 @@ def getConsoleCommands(self, parameters, context, feedback):
if expand != 'none': if expand != 'none':
arguments.append('-expand') arguments.append('-expand')
arguments.append(expand) arguments.append(expand)
regionCoords = projwin.split(',')
try: try:
projwin = [] projwin = []
projwin.append('-projwin') projwin.append('-projwin')
projwin.append(regionCoords[0]) projwin.append(proj_extent.xMinimum())
projwin.append(regionCoords[3]) projwin.append(proj_extent.yMaximum())
projwin.append(regionCoords[1]) projwin.append(proj_extent.xMaximum())
projwin.append(regionCoords[2]) projwin.append(proj_extent.yMinimum())
except IndexError: except IndexError:
projwin = [] projwin = []
if projwin: if projwin:
Expand All @@ -163,7 +165,7 @@ def getConsoleCommands(self, parameters, context, feedback):
arguments.append('-co') arguments.append('-co')
arguments.append(opts) arguments.append(opts)


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


return ['gdal_translate', GdalUtils.escapeAndJoin(arguments)] return ['gdal_translate', GdalUtils.escapeAndJoin(arguments)]
34 changes: 17 additions & 17 deletions python/plugins/processing/tests/testdata/gdal_algorithm_tests.yaml
@@ -1,23 +1,23 @@
# See ../README.md for a description of the file format # See ../README.md for a description of the file format


tests: tests:
# - algorithm: gdal:gdalinfo - algorithm: gdal:gdalinfo
# name: gdalinfo name: gdalinfo
# params: params:
# INPUT: INPUT:
# name: raster.tif name: raster.tif
# type: raster type: raster
# NOGCP: false NOGCP: false
# NOMETADATA: false NOMETADATA: false
# results: results:
# OUTPUT: OUTPUT:
# name: expected/gdal/raster_info.html name: expected/gdal/raster_info.html
# type: regex type: regex
# rules: rules:
# - 'Origin = \(270736.067325068172067,4459029.574521748349071\)' - 'Origin = \(270736.067325068172067,4459029.574521748349071\)'
# - 'Band 1 Block=16x14 Type=Float32, ColorInterp=Gray' - 'Band 1 Block=16x14 Type=Float32, ColorInterp=Gray'
# - ' NoData Value=-32768' - ' NoData Value=-32768'
#
# - algorithm: gdal:ogrinfo # - algorithm: gdal:ogrinfo
# name: ogrinfo # name: ogrinfo
# params: # params:
Expand Down

0 comments on commit 3b997c2

Please sign in to comment.