[processing] restore gdal2tiles algorithm

This commit is contained in:
Alexander Bruy 2017-09-07 14:13:32 +03:00
parent 0f226645fa
commit 6a1b68edd6
2 changed files with 146 additions and 112 deletions

View File

@ -41,6 +41,7 @@ from .ClipByMask import ClipByMask
from .ColorRelief import ColorRelief from .ColorRelief import ColorRelief
from .contour import contour from .contour import contour
from .fillnodata import fillnodata from .fillnodata import fillnodata
from .gdal2tiles import gdal2tiles
from .gdaltindex import gdaltindex from .gdaltindex import gdaltindex
from .GridAverage import GridAverage from .GridAverage import GridAverage
from .GridDataMetrics import GridDataMetrics from .GridDataMetrics import GridDataMetrics
@ -71,7 +72,6 @@ from .warp import warp
# from .gdalcalc import gdalcalc # from .gdalcalc import gdalcalc
# from .rasterize_over import rasterize_over # from .rasterize_over import rasterize_over
# from .retile import retile # from .retile import retile
# from .gdal2tiles import gdal2tiles
from .ogr2ogrpointsonlines import Ogr2OgrPointsOnLines from .ogr2ogrpointsonlines import Ogr2OgrPointsOnLines
from .ogr2ogrtopostgis import Ogr2OgrToPostGis from .ogr2ogrtopostgis import Ogr2OgrToPostGis
@ -144,6 +144,7 @@ class GdalAlgorithmProvider(QgsProcessingProvider):
ColorRelief(), ColorRelief(),
contour(), contour(),
fillnodata(), fillnodata(),
gdal2tiles(),
gdaltindex(), gdaltindex(),
GridAverage(), GridAverage(),
GridDataMetrics(), GridDataMetrics(),
@ -173,7 +174,6 @@ class GdalAlgorithmProvider(QgsProcessingProvider):
# gdalcalc(), # gdalcalc(),
# rasterize_over(), # rasterize_over(),
# retile(), # retile(),
# gdal2tiles(),
# ----- OGR tools ----- # ----- OGR tools -----
Ogr2OgrPointsOnLines(), Ogr2OgrPointsOnLines(),
Ogr2OgrToPostGis(), Ogr2OgrToPostGis(),

View File

@ -16,7 +16,6 @@
* * * *
*************************************************************************** ***************************************************************************
""" """
from builtins import str
__author__ = 'Médéric Ribreux' __author__ = 'Médéric Ribreux'
__date__ = 'January 2016' __date__ = 'January 2016'
@ -26,17 +25,19 @@ __copyright__ = '(C) 2016, Médéric Ribreux'
__revision__ = '$Format:%H$' __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.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.algs.gdal.GdalUtils import GdalUtils
from processing.tools.system import isWindows
class gdal2tiles(GdalAlgorithm): class gdal2tiles(GdalAlgorithm):
@ -45,81 +46,103 @@ class gdal2tiles(GdalAlgorithm):
PROFILE = 'PROFILE' PROFILE = 'PROFILE'
RESAMPLING = 'RESAMPLING' RESAMPLING = 'RESAMPLING'
ZOOM = 'ZOOM' ZOOM = 'ZOOM'
S_SRS = 'S_SRS' SOURCE_CRS = 'SOURCE_CRS'
OUTPUTDIR = 'OUTPUTDIR'
RESUME = 'RESUME'
NODATA = 'NODATA' NODATA = 'NODATA'
FORCEKML = 'FORCEKML' KML = 'KML'
NOKML = 'NOKML' NO_KML = 'NO_KML'
URL = 'URL' URL = 'URL'
WEBVIEWER = 'WEBVIEWER' VIEWER = 'VIEWER'
TITLE = 'TITLE' TITLE = 'TITLE'
COPYRIGHT = 'COPYRIGHT' COPYRIGHT = 'COPYRIGHT'
GOOGLEKEY = 'GOOGLEKEY' GOOGLE_KEY = 'GOOGLE_KEY'
BINGKEY = 'BINGKEY' BING_KEY = 'BING_KEY'
RESUME = 'RESUME'
PROFILES = ['mercator', 'geodetic', 'raster'] OUTPUT = 'OUTPUT'
RESAMPLINGS = ['average', 'near', 'bilinear', 'cubic', 'cubicspline', 'lanczos', 'antialias']
WEBVIEWERS = ['all', 'google', 'openlayers', 'leaflet', 'none']
def __init__(self): def __init__(self):
super().__init__() super().__init__()
def initAlgorithm(self, config=None): def initAlgorithm(self, config=None):
# Required parameters self.profiles = ((self.tr('Mercator'), 'mercator'),
self.addParameter(ParameterRaster(self.INPUT, self.tr('Input layer'))) (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 = []
params.append(ParameterSelection(self.PROFILE, params.append(QgsProcessingParameterEnum(self.RESAMPLING,
self.tr('Tile cutting profile'), self.tr('Resampling method'),
self.PROFILES, 0, False, optional=True)) options=[i[0] for i in self.methods],
params.append(ParameterSelection(self.RESAMPLING, allowMultiple=False,
self.tr('Resampling method'), defaultValue=0))
self.RESAMPLINGS, 0, False, optional=True)) params.append(QgsProcessingParameterCrs(self.SOURCE_CRS,
params.append(ParameterCrs(self.S_SRS, self.tr('The spatial reference system used for the source input data'),
self.tr('The spatial reference system used for the source input data'), optional=True))
None, True)) params.append(QgsProcessingParameterNumber(self.NODATA,
params.append(ParameterString(self.ZOOM, self.tr('Transparency value to assign to the input data'),
self.tr('Zoom levels to render'), type=QgsProcessingParameterNumber.Double,
None, False, True)) defaultValue=0,
params.append(ParameterBoolean(self.RESUME, optional=True))
self.tr('Resume mode, generate only missing files'), params.append(QgsProcessingParameterString(self.URL,
False, True)) self.tr('URL address where the generated tiles are going to be published'),
params.append(ParameterString(self.NODATA, optional=True))
self.tr('NODATA transparency value to assign to the input data'), params.append(QgsProcessingParameterString(self.GOOGLE_KEY,
None, False, True)) self.tr('Google Maps API key (http://code.google.com/apis/maps/signup.html)'),
params.append(ParameterBoolean(self.FORCEKML, optional=True))
self.tr('Generate KML for Google Earth - default for "geodetic" profile and "raster" in EPSG:4326'), params.append(QgsProcessingParameterString(self.BING_KEY,
False, True)) self.tr('Bing Maps API key (https://www.bingmapsportal.com/)'),
params.append(ParameterBoolean(self.NOKML, optional=True))
self.tr('Avoid automatic generation of KML files for EPSG:4326'), params.append(QgsProcessingParameterBoolean(self.RESUME,
False, True)) self.tr('Generate only missing files'),
params.append(ParameterString(self.URL, defaultValue=False))
self.tr('URL address where the generated tiles are going to be published'), params.append(QgsProcessingParameterBoolean(self.KML,
None, False, True)) self.tr('Generate KML for Google Earth'),
params.append(ParameterSelection(self.WEBVIEWER, defaultValue=False))
self.tr('Web viewer to generate'), params.append(QgsProcessingParameterBoolean(self.NO_KML,
self.WEBVIEWERS, 0, False, optional=True)) self.tr('Avoid automatic generation of KML files for EPSG:4326'),
params.append(ParameterString(self.TITLE, defaultValue=False))
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))
for param in params: for param in params:
param.setFlags(param.flags() | QgsProcessingParameterDefinition.FlagAdvanced) param.setFlags(param.flags() | QgsProcessingParameterDefinition.FlagAdvanced)
self.addParameter(param) self.addParameter(param)
self.addOutput(OutputDirectory(self.OUTPUTDIR, self.addParameter(QgsProcessingParameterFolderDestination(self.OUTPUT,
self.tr('The directory where the tile result is created'))) self.tr('Output directory')))
self.addOutput(QgsProcessingOutputFolder(self.OUTPUT, self.tr('Output directory')))
def name(self): def name(self):
return 'gdal2tiles' return 'gdal2tiles'
@ -131,58 +154,69 @@ class gdal2tiles(GdalAlgorithm):
return self.tr('Raster miscellaneous') return self.tr('Raster miscellaneous')
def getConsoleCommands(self, parameters, context, feedback): def getConsoleCommands(self, parameters, context, feedback):
arguments = [] arguments = []
if self.getParameterValue(self.PROFILE): arguments.append('-p')
arguments.append('-p') arguments.append(self.profiles[self.parameterAsEnum(parameters, self.PROFILE, context)][1])
arguments.append(self.PROFILES[self.getParameterValue(self.PROFILE)])
if self.getParameterValue(self.RESAMPLING): zoom = self.parameterAsString(parameters, self.ZOOM, context)
arguments.append('-r') if zoom:
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):
arguments.append('-z') 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') arguments.append('-e')
if self.getParameterValue(self.NODATA): if self.parameterAsBool(parameters, self.KML, context):
arguments.append('-a')
arguments.append(str(self.getParameterValue(self.NODATA)))
# KML arguments
if self.getParameterValue(self.FORCEKML):
arguments.append('-k') arguments.append('-k')
if self.getParameterValue(self.NOKML): if self.parameterAsBool(parameters, self.NO_KML, context):
arguments.append('-n') arguments.append('-n')
if self.getParameterValue(self.URL): inLayer = self.parameterAsRasterLayer(parameters, self.INPUT, context)
arguments.append('-u') arguments.append(inLayer.source())
arguments.append(str(self.getParameterValue(self.URL))) arguments.append(self.parameterAsString(parameters, self.OUTPUT, context))
# 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))
commands = [] commands = []
if isWindows(): if isWindows():