Merge pull request #6141 from alexbruy/processing-gdal

[processing] restore GDAL rasterize algorithm
This commit is contained in:
Alexander Bruy 2018-01-24 08:16:01 +02:00 committed by GitHub
commit 5dc8c3f0a2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 181 additions and 101 deletions

View File

@ -58,6 +58,7 @@ from .nearblack import nearblack
from .pct2rgb import pct2rgb
from .polygonize import polygonize
from .proximity import proximity
from .rasterize import rasterize
from .retile import retile
from .rgb2pct import rgb2pct
from .roughness import roughness
@ -68,7 +69,6 @@ from .tpi import tpi
from .tri import tri
from .warp import warp
# from .rasterize import rasterize
# from .extractprojection import ExtractProjection
# from .gdalcalc import gdalcalc
# from .rasterize_over import rasterize_over
@ -164,6 +164,7 @@ class GdalAlgorithmProvider(QgsProcessingProvider):
pct2rgb(),
polygonize(),
proximity(),
rasterize(),
retile(),
rgb2pct(),
roughness(),

View File

@ -17,7 +17,6 @@
***************************************************************************
"""
__author__ = 'Alexander Bruy'
__date__ = 'September 2013'
__copyright__ = '(C) 2013, Alexander Bruy'
@ -30,6 +29,17 @@ import os
from qgis.PyQt.QtGui import QIcon
from qgis.core import (QgsRasterFileWriter,
QgsProcessingParameterDefinition,
QgsProcessingParameterFeatureSource,
QgsProcessingParameterField,
QgsProcessingParameterRasterLayer,
QgsProcessingParameterNumber,
QgsProcessingParameterString,
QgsProcessingParameterEnum,
QgsProcessingParameterExtent,
QgsProcessingParameterBoolean,
QgsProcessingParameterRasterDestination)
from processing.algs.gdal.GdalAlgorithm import GdalAlgorithm
from processing.algs.gdal.GdalUtils import GdalUtils
@ -40,50 +50,96 @@ class rasterize(GdalAlgorithm):
INPUT = 'INPUT'
FIELD = 'FIELD'
DIMENSIONS = 'DIMENSIONS'
BURN = 'BURN'
WIDTH = 'WIDTH'
HEIGHT = 'HEIGHT'
NO_DATA = 'NO_DATA'
RTYPE = 'RTYPE'
UNITS = 'UNITS'
NODATA = 'NODATA'
EXTENT = 'EXTENT'
INIT = 'INIT'
INVERT = 'INVERT'
ALL_TOUCH = 'ALL_TOUCH'
OPTIONS = 'OPTIONS'
DATA_TYPE = 'DATA_TYPE'
OUTPUT = 'OUTPUT'
TYPE = ['Byte', 'Int16', 'UInt16', 'UInt32', 'Int32', 'Float32', 'Float64']
RAST_EXT = 'RAST_EXT'
def icon(self):
return QIcon(os.path.join(pluginPath, 'images', 'gdaltools', 'rasterize.png'))
TYPES = ['Byte', 'Int16', 'UInt16', 'UInt32', 'Int32', 'Float32', 'Float64', 'CInt16', 'CInt32', 'CFloat32', 'CFloat64']
def __init__(self):
super().__init__()
def initAlgorithm(self, config=None):
self.addParameter(ParameterVector(self.INPUT, self.tr('Input layer')))
self.addParameter(ParameterTableField(self.FIELD,
self.tr('Attribute field'), self.INPUT))
self.addParameter(ParameterSelection(self.DIMENSIONS,
self.tr('Set output raster size (ignored if above option is checked)'),
['Output size in pixels', 'Output resolution in map units per pixel'], 1))
self.addParameter(ParameterNumber(self.WIDTH,
self.tr('Horizontal'), 0.0, 99999999.999999, 100.0))
self.addParameter(ParameterNumber(self.HEIGHT,
self.tr('Vertical'), 0.0, 99999999.999999, 100.0))
self.addParameter(ParameterExtent(self.RAST_EXT, self.tr('Raster extent')))
self.addParameter(ParameterString(self.NO_DATA,
self.tr("Nodata value"),
'', optional=True))
self.units = [self.tr("Pixels"),
self.tr("Georeferenced units")]
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('Raster type'),
self.TYPE, 5))
self.addParameter(QgsProcessingParameterFeatureSource(self.INPUT,
self.tr('Input layer')))
self.addParameter(QgsProcessingParameterField(self.FIELD,
self.tr('Field to use for a burn-in value'),
None,
self.INPUT,
QgsProcessingParameterField.Numeric,
optional=True))
self.addParameter(QgsProcessingParameterNumber(self.BURN,
self.tr('A fixed value to burn'),
type=QgsProcessingParameterNumber.Double,
defaultValue=0.0,
optional=True))
self.addParameter(QgsProcessingParameterEnum(self.UNITS,
self.tr('Output raster size units'),
self.units))
self.addParameter(QgsProcessingParameterNumber(self.WIDTH,
self.tr('Width/Horizontal resolution'),
type=QgsProcessingParameterNumber.Double,
minValue=0.0,
defaultValue=0.0))
self.addParameter(QgsProcessingParameterNumber(self.HEIGHT,
self.tr('Height/Vertical resolution'),
type=QgsProcessingParameterNumber.Double,
minValue=0.0,
defaultValue=0.0))
self.addParameter(QgsProcessingParameterExtent(self.EXTENT,
self.tr('Output extent')))
self.addParameter(QgsProcessingParameterNumber(self.NODATA,
self.tr('Assign a specified nodata value to output bands'),
type=QgsProcessingParameterNumber.Double,
defaultValue=0.0,
optional=True))
self.addOutput(OutputRaster(self.OUTPUT,
self.tr('Rasterized')))
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)
dataType_param = QgsProcessingParameterEnum(self.DATA_TYPE,
self.tr('Output data type'),
self.TYPES,
allowMultiple=False,
defaultValue=5)
dataType_param.setFlags(dataType_param.flags() | QgsProcessingParameterDefinition.FlagAdvanced)
self.addParameter(dataType_param)
init_param = QgsProcessingParameterNumber(self.INIT,
self.tr('Pre-initialize the output image with value'),
type=QgsProcessingParameterNumber.Double,
defaultValue=0.0,
optional=True)
init_param.setFlags(init_param.flags() | QgsProcessingParameterDefinition.FlagAdvanced)
self.addParameter(init_param)
invert_param = QgsProcessingParameterBoolean(self.INVERT,
self.tr('Invert rasterization'),
defaultValue=False)
invert_param.setFlags(invert_param.flags() | QgsProcessingParameterDefinition.FlagAdvanced)
self.addParameter(invert_param)
self.addParameter(QgsProcessingParameterRasterDestination(self.OUTPUT,
self.tr('Rasterized')))
def name(self):
return 'rasterize'
@ -97,70 +153,71 @@ class rasterize(GdalAlgorithm):
def groupId(self):
return 'vectorconversion'
def getConsoleCommands(self, parameters, context, feedback, executing=True):
inLayer = self.getParameterValue(self.INPUT)
noData = self.getParameterValue(self.NO_DATA)
rastext = str(self.getParameterValue(self.RAST_EXT))
if not rastext:
rastext = QgsProcessingUtils.combineLayerExtents([inLayer])
opts = self.getParameterValue(self.OPTIONS)
out = self.getOutputValue(self.OUTPUT)
ogrLayer = GdalUtils.ogrConnectionString(inLayer, context)[1:-1]
if noData is not None:
noData = str(noData)
arguments = []
arguments.append('-a')
arguments.append(str(self.getParameterValue(self.FIELD)))
arguments.append('-ot')
arguments.append(self.TYPE[self.getParameterValue(self.RTYPE)])
dimType = self.getParameterValue(self.DIMENSIONS)
arguments.append('-of')
arguments.append(GdalUtils.getFormatShortNameFromFilename(out))
regionCoords = rastext.split(',')
try:
rastext = []
rastext.append('-te')
rastext.append(regionCoords[0])
rastext.append(regionCoords[2])
rastext.append(regionCoords[1])
rastext.append(regionCoords[3])
except IndexError:
rastext = []
if rastext:
arguments.extend(rastext)
if dimType == 0:
# size in pixels
arguments.append('-ts')
arguments.append(str(self.getParameterValue(self.WIDTH)))
arguments.append(str(self.getParameterValue(self.HEIGHT)))
else:
# resolution in map units per pixel
arguments.append('-tr')
arguments.append(str(self.getParameterValue(self.WIDTH)))
arguments.append(str(self.getParameterValue(self.HEIGHT)))
if noData and len(noData) > 0:
arguments.append('-a_nodata')
arguments.append(noData)
if opts:
arguments.append('-co')
arguments.append(opts)
arguments.append('-l')
print(GdalUtils.ogrLayerName(inLayer))
arguments.append(GdalUtils.ogrLayerName(inLayer))
arguments.append(ogrLayer)
arguments.append(out)
return ['gdal_rasterize', GdalUtils.escapeAndJoin(arguments)]
def icon(self):
return QIcon(os.path.join(pluginPath, 'images', 'gdaltools', 'rasterize.png'))
def commandName(self):
return "gdal_rasterize"
return 'gdal_rasterize'
def getConsoleCommands(self, parameters, context, feedback, executing=True):
ogrLayer, layerName = self.getOgrCompatibleSource(self.INPUT, parameters, context, feedback, executing)
arguments = ['-l']
arguments.append(layerName)
fieldName = self.parameterAsString(parameters, self.FIELD, context)
if fieldName:
arguments.append('-a')
arguments.append(fieldName)
else:
arguments.append('-burn')
arguments.append(self.parameterAsDouble(parameters, self.BURN, context))
units = self.parameterAsEnum(parameters, self.UNITS, context)
if units == 0:
arguments.append('-ts')
else:
arguments.append('-tr')
arguments.append(self.parameterAsDouble(parameters, self.WIDTH, context))
arguments.append(self.parameterAsDouble(parameters, self.HEIGHT, context))
initValue = self.parameterAsDouble(parameters, self.INIT, context)
if initValue:
arguments.append('-init')
arguments.append(initValue)
if self.parameterAsBool(parameters, self.INVERT, context):
arguments.append('-i')
if self.parameterAsBool(parameters, self.ALL_TOUCH, context):
arguments.append('-at')
nodata = self.parameterAsDouble(parameters, self.NODATA, context)
if nodata:
arguments.append('-a_nodata')
arguments.append(nodata)
extent = self.parameterAsExtent(parameters, self.EXTENT, context)
if not extent.isNull():
arguments.append('-te')
arguments.append(extent.xMinimum())
arguments.append(extent.yMinimum())
arguments.append(extent.xMaximum())
arguments.append(extent.yMaximum())
arguments.append('-ot')
arguments.append(self.TYPES[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]))
options = self.parameterAsString(parameters, self.OPTIONS, context)
if options:
arguments.append('-co')
arguments.append(options)
arguments.append(ogrLayer)
arguments.append(out)
return ['gdal_rasterize', GdalUtils.escapeAndJoin(arguments)]

View File

@ -303,7 +303,7 @@ tests:
hash: fff4a08498e93494f3f2cf1a9074451e6fd68341849aedc9e2c45e6a
type: rasterhash
# Disabled as gdal2_poligonize.py is not available on Travis
# Disabled as gdal_poligonize.py is not available on Travis
# - algorithm: gdal:polygonize
# name: Polygonize
# params:
@ -318,7 +318,7 @@ tests:
# name: expected/gdal/polygonize.gml
# type: vector
# Disabled as gdal2_proximity.py is not available on Travis
# Disabled as gdal_proximity.py is not available on Travis
# - algorithm: gdal:proximity
# name: Proximity
# params:
@ -338,6 +338,28 @@ tests:
# hash: 32802271d1ce083ca14078bfefaef6300ae8809af11f6a4270583d0c
# type: rasterhash
- algorithm: gdal:rasterize
name: Test (gdal:rasterize)
params:
BURN: 0.0
DATA_TYPE: 5
EXTENT: -1.0,10.0,-3.0,6.0 [EPSG:4326]
FIELD: intval
HEIGHT: 10.0
INIT: 0.0
INPUT:
name: polys.gml
type: vector
INVERT: false
NODATA: 0.0
OPTIONS: ''
UNITS: 0
WIDTH: 10.0
results:
OUTPUT:
hash: 30409eb496900df4ceeab37200a91552c350dbc7761eb089dd75a329
type: rasterhash
- algorithm: gdal:roughness
name: Roughness
params: