diff --git a/python/plugins/processing/algs/gdal/GdalAlgorithmProvider.py b/python/plugins/processing/algs/gdal/GdalAlgorithmProvider.py index 41a084b99b7..a4652a7ac13 100644 --- a/python/plugins/processing/algs/gdal/GdalAlgorithmProvider.py +++ b/python/plugins/processing/algs/gdal/GdalAlgorithmProvider.py @@ -41,6 +41,7 @@ from .ClipByMask import ClipByMask from .ColorRelief import ColorRelief from .contour import contour from .fillnodata import fillnodata +from .gdal2tiles import gdal2tiles from .gdaltindex import gdaltindex from .GridAverage import GridAverage from .GridDataMetrics import GridDataMetrics @@ -71,7 +72,6 @@ from .warp import warp # from .gdalcalc import gdalcalc # from .rasterize_over import rasterize_over # from .retile import retile -# from .gdal2tiles import gdal2tiles from .ogr2ogrpointsonlines import Ogr2OgrPointsOnLines from .ogr2ogrtopostgis import Ogr2OgrToPostGis @@ -144,6 +144,7 @@ class GdalAlgorithmProvider(QgsProcessingProvider): ColorRelief(), contour(), fillnodata(), + gdal2tiles(), gdaltindex(), GridAverage(), GridDataMetrics(), @@ -173,7 +174,6 @@ class GdalAlgorithmProvider(QgsProcessingProvider): # gdalcalc(), # rasterize_over(), # retile(), - # gdal2tiles(), # ----- OGR tools ----- Ogr2OgrPointsOnLines(), Ogr2OgrToPostGis(), diff --git a/python/plugins/processing/algs/gdal/gdal2tiles.py b/python/plugins/processing/algs/gdal/gdal2tiles.py index 89f64f960d5..70af5d47bb0 100644 --- a/python/plugins/processing/algs/gdal/gdal2tiles.py +++ b/python/plugins/processing/algs/gdal/gdal2tiles.py @@ -16,7 +16,6 @@ * * *************************************************************************** """ -from builtins import str __author__ = 'Médéric Ribreux' __date__ = 'January 2016' @@ -26,17 +25,19 @@ __copyright__ = '(C) 2016, Médéric Ribreux' __revision__ = '$Format:%H$' -from qgis.core import QgsProcessingParameterDefinition +from qgis.core import (QgsProcessingParameterDefinition, + QgsProcessingParameterRasterLayer, + QgsProcessingParameterCrs, + QgsProcessingParameterEnum, + QgsProcessingParameterString, + QgsProcessingParameterNumber, + QgsProcessingParameterBoolean, + QgsProcessingOutputFolder, + QgsProcessingParameterFolderDestination) 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 ParameterCrs -from processing.core.parameters import ParameterBoolean -from processing.core.outputs import OutputDirectory -from processing.tools.system import isWindows from processing.algs.gdal.GdalUtils import GdalUtils +from processing.tools.system import isWindows class gdal2tiles(GdalAlgorithm): @@ -45,81 +46,103 @@ class gdal2tiles(GdalAlgorithm): PROFILE = 'PROFILE' RESAMPLING = 'RESAMPLING' ZOOM = 'ZOOM' - S_SRS = 'S_SRS' - OUTPUTDIR = 'OUTPUTDIR' - RESUME = 'RESUME' + SOURCE_CRS = 'SOURCE_CRS' NODATA = 'NODATA' - FORCEKML = 'FORCEKML' - NOKML = 'NOKML' + KML = 'KML' + NO_KML = 'NO_KML' URL = 'URL' - WEBVIEWER = 'WEBVIEWER' + VIEWER = 'VIEWER' TITLE = 'TITLE' COPYRIGHT = 'COPYRIGHT' - GOOGLEKEY = 'GOOGLEKEY' - BINGKEY = 'BINGKEY' - - PROFILES = ['mercator', 'geodetic', 'raster'] - RESAMPLINGS = ['average', 'near', 'bilinear', 'cubic', 'cubicspline', 'lanczos', 'antialias'] - WEBVIEWERS = ['all', 'google', 'openlayers', 'leaflet', 'none'] + GOOGLE_KEY = 'GOOGLE_KEY' + BING_KEY = 'BING_KEY' + RESUME = 'RESUME' + OUTPUT = 'OUTPUT' def __init__(self): super().__init__() def initAlgorithm(self, config=None): - # Required parameters - self.addParameter(ParameterRaster(self.INPUT, self.tr('Input layer'))) + self.profiles = ((self.tr('Mercator'), 'mercator'), + (self.tr('Geodetic'), 'geodetic'), + (self.tr('Raster'), 'raster')) + + self.methods = ((self.tr('Average'), 'average'), + (self.tr('Nearest neighbour'), 'near'), + (self.tr('Bilinear'), 'bilinear'), + (self.tr('Cubic'), 'cubic'), + (self.tr('Cubic spline'), 'cubicspline'), + (self.tr('Lanczos windowed sinc'), 'lanczos'), + (self.tr('Antialias'), 'antialias')) + + self.viewers = ((self.tr('All'), 'all'), + (self.tr('GoogleMaps'), 'google'), + (self.tr('OpenLayers'), 'openlayers'), + (self.tr('Leaflet'), 'leaflet'), + (self.tr('None'), 'none')) + + self.addParameter(QgsProcessingParameterRasterLayer(self.INPUT, self.tr('Input layer'))) + self.addParameter(QgsProcessingParameterEnum(self.PROFILE, + self.tr('Tile cutting profile'), + options=[i[0] for i in self.profiles], + allowMultiple=False, + defaultValue=0)) + self.addParameter(QgsProcessingParameterString(self.ZOOM, + self.tr('Zoom levels to render'), + defaultValue='', + optional=True)) + self.addParameter(QgsProcessingParameterEnum(self.VIEWER, + self.tr('Web viewer to generate'), + options=[i[0] for i in self.viewers], + allowMultiple=False, + defaultValue=0)) + self.addParameter(QgsProcessingParameterString(self.TITLE, + self.tr('Title of the map'), + optional=True)) + self.addParameter(QgsProcessingParameterString(self.COPYRIGHT, + self.tr('Copyright of the map'), + optional=True)) - # Advanced parameters params = [] - params.append(ParameterSelection(self.PROFILE, - self.tr('Tile cutting profile'), - self.PROFILES, 0, False, optional=True)) - params.append(ParameterSelection(self.RESAMPLING, - self.tr('Resampling method'), - self.RESAMPLINGS, 0, False, optional=True)) - params.append(ParameterCrs(self.S_SRS, - self.tr('The spatial reference system used for the source input data'), - None, True)) - params.append(ParameterString(self.ZOOM, - self.tr('Zoom levels to render'), - None, False, True)) - params.append(ParameterBoolean(self.RESUME, - self.tr('Resume mode, generate only missing files'), - False, True)) - params.append(ParameterString(self.NODATA, - self.tr('NODATA transparency value to assign to the input data'), - None, False, True)) - params.append(ParameterBoolean(self.FORCEKML, - self.tr('Generate KML for Google Earth - default for "geodetic" profile and "raster" in EPSG:4326'), - False, True)) - params.append(ParameterBoolean(self.NOKML, - self.tr('Avoid automatic generation of KML files for EPSG:4326'), - False, True)) - params.append(ParameterString(self.URL, - self.tr('URL address where the generated tiles are going to be published'), - None, False, True)) - params.append(ParameterSelection(self.WEBVIEWER, - self.tr('Web viewer to generate'), - self.WEBVIEWERS, 0, False, optional=True)) - params.append(ParameterString(self.TITLE, - self.tr('Title of the map'), - None, False, True)) - params.append(ParameterString(self.COPYRIGHT, - self.tr('Copyright for the map'), - None, False, True)) - params.append(ParameterString(self.GOOGLEKEY, - self.tr('Google Maps API key from http://code.google.com/apis/maps/signup.html'), - None, False, True)) - params.append(ParameterString(self.BINGKEY, - self.tr('Bing Maps API key from https://www.bingmapsportal.com/'), - None, False, True)) - + params.append(QgsProcessingParameterEnum(self.RESAMPLING, + self.tr('Resampling method'), + options=[i[0] for i in self.methods], + allowMultiple=False, + defaultValue=0)) + params.append(QgsProcessingParameterCrs(self.SOURCE_CRS, + self.tr('The spatial reference system used for the source input data'), + optional=True)) + params.append(QgsProcessingParameterNumber(self.NODATA, + self.tr('Transparency value to assign to the input data'), + type=QgsProcessingParameterNumber.Double, + defaultValue=0, + optional=True)) + params.append(QgsProcessingParameterString(self.URL, + self.tr('URL address where the generated tiles are going to be published'), + optional=True)) + params.append(QgsProcessingParameterString(self.GOOGLE_KEY, + self.tr('Google Maps API key (http://code.google.com/apis/maps/signup.html)'), + optional=True)) + params.append(QgsProcessingParameterString(self.BING_KEY, + self.tr('Bing Maps API key (https://www.bingmapsportal.com/)'), + optional=True)) + params.append(QgsProcessingParameterBoolean(self.RESUME, + self.tr('Generate only missing files'), + defaultValue=False)) + params.append(QgsProcessingParameterBoolean(self.KML, + self.tr('Generate KML for Google Earth'), + defaultValue=False)) + params.append(QgsProcessingParameterBoolean(self.NO_KML, + self.tr('Avoid automatic generation of KML files for EPSG:4326'), + defaultValue=False)) for param in params: param.setFlags(param.flags() | QgsProcessingParameterDefinition.FlagAdvanced) self.addParameter(param) - self.addOutput(OutputDirectory(self.OUTPUTDIR, - self.tr('The directory where the tile result is created'))) + self.addParameter(QgsProcessingParameterFolderDestination(self.OUTPUT, + self.tr('Output directory'))) + + self.addOutput(QgsProcessingOutputFolder(self.OUTPUT, self.tr('Output directory'))) def name(self): return 'gdal2tiles' @@ -131,58 +154,69 @@ class gdal2tiles(GdalAlgorithm): return self.tr('Raster miscellaneous') def getConsoleCommands(self, parameters, context, feedback): - arguments = [] - if self.getParameterValue(self.PROFILE): - arguments.append('-p') - arguments.append(self.PROFILES[self.getParameterValue(self.PROFILE)]) + arguments.append('-p') + arguments.append(self.profiles[self.parameterAsEnum(parameters, self.PROFILE, context)][1]) - if self.getParameterValue(self.RESAMPLING): - arguments.append('-r') - arguments.append(self.RESAMPLINGS[self.getParameterValue(self.RESAMPLING)]) - - ssrs = str(self.getParameterValue(self.S_SRS)) - if len(ssrs) > 0: - arguments.append('-s') - arguments.append(ssrs) - - if self.getParameterValue(self.ZOOM): + zoom = self.parameterAsString(parameters, self.ZOOM, context) + if zoom: arguments.append('-z') - arguments.append(str(self.getParameterValue(self.ZOOM))) + arguments.append(str(zoom)) - if self.getParameterValue(self.RESUME): + arguments.append('-w') + arguments.append(self.viewers[self.parameterAsEnum(parameters, self.VIEWER, context)][1]) + + title = self.parameterAsString(parameters, self.TITLE, context) + if title: + arguments.append('-t') + arguments.append(title) + + copying = self.parameterAsString(parameters, self.COPYRIGHT, context) + if copying: + arguments.append('-c') + arguments.append(copying) + + arguments.append('-r') + arguments.append(self.methods[self.parameterAsEnum(parameters, self.RESAMPLING, context)][1]) + + crs = self.parameterAsCrs(parameters, self.SOURCE_CRS, context) + if crs.isValid(): + arguments.append('-s') + arguments.append(crs.authid()) + + nodata = self.parameterAsDouble(parameters, self.NODATA, context) + if nodata: + arguments.append('-a') + arguments.append(str(nodata)) + + url = self.parameterAsString(parameters, self.URL, context) + if url: + arguments.append('-u') + arguments.append(url) + + key = self.parameterAsString(parameters, self.GOOGLE_KEY, context) + if key: + arguments.append('-g') + arguments.append(key) + + key = self.parameterAsString(parameters, self.BING_KEY, context) + if key: + arguments.append('-b') + arguments.append(key) + + if self.parameterAsBool(parameters, self.RESUME, context): arguments.append('-e') - if self.getParameterValue(self.NODATA): - arguments.append('-a') - arguments.append(str(self.getParameterValue(self.NODATA))) - - # KML arguments - if self.getParameterValue(self.FORCEKML): + if self.parameterAsBool(parameters, self.KML, context): arguments.append('-k') - if self.getParameterValue(self.NOKML): + if self.parameterAsBool(parameters, self.NO_KML, context): arguments.append('-n') - if self.getParameterValue(self.URL): - arguments.append('-u') - arguments.append(str(self.getParameterValue(self.URL))) - - # Web viewer arguments - if self.getParameterValue(self.WEBVIEWER): - arguments.append('-w') - arguments.append(self.WEBVIEWERS[self.getParameterValue(self.WEBVIEWER)]) - - parameters = {self.TITLE: '-t', self.COPYRIGHT: '-c', - self.GOOGLEKEY: '-g', self.BINGKEY: '-b'} - for arg, parameter in list(parameters.items()): - if self.getParameterValue(arg): - arguments.append(parameter) - arguments.append(self.getParameterValue(arg)) - - arguments.append(self.getParameterValue(self.INPUT)) - arguments.append(self.getOutputValue(self.OUTPUTDIR)) + inLayer = self.parameterAsRasterLayer(parameters, self.INPUT, context) + arguments.append(inLayer.source()) + arguments.append(self.parameterAsString(parameters, self.OUTPUT, context)) commands = [] if isWindows():