Skip to content

Commit

Permalink
[processing] restore gdal2tiles algorithm
Browse files Browse the repository at this point in the history
  • Loading branch information
alexbruy committed Oct 11, 2017
1 parent 0f22664 commit 6a1b68e
Show file tree
Hide file tree
Showing 2 changed files with 144 additions and 110 deletions.
4 changes: 2 additions & 2 deletions python/plugins/processing/algs/gdal/GdalAlgorithmProvider.py
Expand Up @@ -41,6 +41,7 @@
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
Expand Down Expand Up @@ -71,7 +72,6 @@
# 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
Expand Down Expand Up @@ -144,6 +144,7 @@ def loadAlgorithms(self):
ColorRelief(),
contour(),
fillnodata(),
gdal2tiles(),
gdaltindex(),
GridAverage(),
GridDataMetrics(),
Expand Down Expand Up @@ -173,7 +174,6 @@ def loadAlgorithms(self):
# gdalcalc(),
# rasterize_over(),
# retile(),
# gdal2tiles(),
# ----- OGR tools -----
Ogr2OgrPointsOnLines(),
Ogr2OgrToPostGis(),
Expand Down
250 changes: 142 additions & 108 deletions python/plugins/processing/algs/gdal/gdal2tiles.py
Expand Up @@ -16,7 +16,6 @@
* *
***************************************************************************
"""
from builtins import str

__author__ = 'Médéric Ribreux'
__date__ = 'January 2016'
Expand All @@ -26,17 +25,19 @@

__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):
Expand All @@ -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'
Expand All @@ -131,58 +154,69 @@ def group(self):
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)])
zoom = self.parameterAsString(parameters, self.ZOOM, context)
if zoom:
arguments.append('-z')
arguments.append(str(zoom))

ssrs = str(self.getParameterValue(self.S_SRS))
if len(ssrs) > 0:
arguments.append('-s')
arguments.append(ssrs)
arguments.append('-w')
arguments.append(self.viewers[self.parameterAsEnum(parameters, self.VIEWER, context)][1])

if self.getParameterValue(self.ZOOM):
arguments.append('-z')
arguments.append(str(self.getParameterValue(self.ZOOM)))
title = self.parameterAsString(parameters, self.TITLE, context)
if title:
arguments.append('-t')
arguments.append(title)

if self.getParameterValue(self.RESUME):
arguments.append('-e')
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())

if self.getParameterValue(self.NODATA):
nodata = self.parameterAsDouble(parameters, self.NODATA, context)
if nodata:
arguments.append('-a')
arguments.append(str(self.getParameterValue(self.NODATA)))
arguments.append(str(nodata))

url = self.parameterAsString(parameters, self.URL, context)
if url:
arguments.append('-u')
arguments.append(url)

# KML arguments
if self.getParameterValue(self.FORCEKML):
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.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():
Expand Down

0 comments on commit 6a1b68e

Please sign in to comment.