Skip to content

Commit 006a161

Browse files
author
Médéric RIBREUX
committed
[Processing]Add gdal_retile.py and gdal2tiles.py algorithms
This should fix Redmine #3331
1 parent 2eb95f0 commit 006a161

File tree

3 files changed

+376
-0
lines changed

3 files changed

+376
-0
lines changed

python/plugins/processing/algs/gdal/GdalOgrAlgorithmProvider.py

+3
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,8 @@
6767
from gdaltindex import gdaltindex
6868
from gdalcalc import gdalcalc
6969
from rasterize_over import rasterize_over
70+
from retile import retile
71+
from gdal2tiles import gdal2tiles
7072

7173
from ogr2ogr import Ogr2Ogr
7274
from ogr2ogrclip import Ogr2OgrClip
@@ -137,6 +139,7 @@ def createAlgsList(self):
137139
hillshade(), slope(), aspect(), tri(), tpi(), roughness(),
138140
ColorRelief(), GridInvDist(), GridAverage(), GridNearest(),
139141
GridDataMetrics(), gdaltindex(), gdalcalc(), rasterize_over(),
142+
retile(), gdal2tiles(),
140143
# ----- OGR tools -----
141144
OgrInfo(), Ogr2Ogr(), Ogr2OgrClip(), Ogr2OgrClipExtent(),
142145
Ogr2OgrToPostGis(), Ogr2OgrToPostGisList(), Ogr2OgrPointsOnLines(),
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,186 @@
1+
# -*- coding: utf-8 -*-
2+
3+
"""
4+
***************************************************************************
5+
gdal2tiles.py
6+
---------------------
7+
Date : January 2016
8+
Copyright : (C) 2016 by Médéric Ribreux
9+
Email : mederic dot ribreux at medspx dot fr
10+
***************************************************************************
11+
* *
12+
* This program is free software; you can redistribute it and/or modify *
13+
* it under the terms of the GNU General Public License as published by *
14+
* the Free Software Foundation; either version 2 of the License, or *
15+
* (at your option) any later version. *
16+
* *
17+
***************************************************************************
18+
"""
19+
20+
__author__ = 'Médéric Ribreux'
21+
__date__ = 'January 2016'
22+
__copyright__ = '(C) 2016, Médéric Ribreux'
23+
24+
# This will get replaced with a git SHA1 when you do a git archive
25+
26+
__revision__ = '$Format:%H$'
27+
28+
from processing.algs.gdal.GdalAlgorithm import GdalAlgorithm
29+
from processing.core.parameters import ParameterRaster
30+
from processing.core.parameters import ParameterString
31+
from processing.core.parameters import ParameterSelection
32+
from processing.core.parameters import ParameterCrs
33+
from processing.core.parameters import ParameterBoolean
34+
from processing.core.outputs import OutputDirectory
35+
from processing.tools.system import isWindows
36+
from processing.algs.gdal.GdalUtils import GdalUtils
37+
38+
39+
class gdal2tiles(GdalAlgorithm):
40+
41+
INPUT = 'INPUT'
42+
PROFILE = 'PROFILE'
43+
RESAMPLING = 'RESAMPLING'
44+
ZOOM = 'ZOOM'
45+
S_SRS = 'S_SRS'
46+
OUTPUTDIR = 'OUTPUTDIR'
47+
RESUME = 'RESUME'
48+
NODATA = 'NODATA'
49+
FORCEKML = 'FORCEKML'
50+
NOKML = 'NOKML'
51+
URL = 'URL'
52+
WEBVIEWER = 'WEBVIEWER'
53+
TITLE = 'TITLE'
54+
COPYRIGHT = 'COPYRIGHT'
55+
GOOGLEKEY = 'GOOGLEKEY'
56+
BINGKEY = 'BINGKEY'
57+
58+
PROFILES = ['mercator', 'geodetic', 'raster']
59+
RESAMPLINGS = ['average', 'near', 'bilinear', 'cubic', 'cubicspline', 'lanczos', 'antialias']
60+
WEBVIEWERS = ['all', 'google', 'openlayers', 'leaflet', 'none']
61+
62+
def commandLineName(self):
63+
return "gdalogr:gdal2tiles"
64+
65+
def defineCharacteristics(self):
66+
self.name, self.i18n_name = self.trAlgorithm('gdal2tiles')
67+
self.group, self.i18n_group = self.trAlgorithm('[GDAL] Miscellaneous')
68+
69+
# Required parameters
70+
self.addParameter(ParameterRaster(self.INPUT, self.tr('Input layer')))
71+
72+
# Advanced parameters
73+
params = []
74+
params.append(ParameterSelection(self.PROFILE,
75+
self.tr('Tile cutting profile'),
76+
self.PROFILES, 0, False, True))
77+
params.append(ParameterSelection(self.RESAMPLING,
78+
self.tr('Resampling method'),
79+
self.RESAMPLINGS, 0, False, True))
80+
params.append(ParameterCrs(self.S_SRS,
81+
self.tr('The spatial reference system used for the source input data'),
82+
None, True))
83+
params.append(ParameterString(self.ZOOM,
84+
self.tr('Zoom levels to render'),
85+
None, False, True))
86+
params.append(ParameterBoolean(self.RESUME,
87+
self.tr('Resume mode, generate only missing files'),
88+
False, True))
89+
params.append(ParameterString(self.NODATA,
90+
self.tr('NODATA transparency value to assign to the input data'),
91+
None, False, True))
92+
params.append(ParameterBoolean(self.FORCEKML,
93+
self.tr('Generate KML for Google Earth - default for "geodetic" profile and "raster" in EPSG:4326'),
94+
False, True))
95+
params.append(ParameterBoolean(self.NOKML,
96+
self.tr('Avoid automatic generation of KML files for EPSG:4326'),
97+
False, True))
98+
params.append(ParameterString(self.URL,
99+
self.tr('URL address where the generated tiles are going to be published'),
100+
None, False, True))
101+
params.append(ParameterSelection(self.WEBVIEWER,
102+
self.tr('Web viewer to generate'),
103+
self.WEBVIEWERS, 0, False, True))
104+
params.append(ParameterString(self.TITLE,
105+
self.tr('Title of the map'),
106+
None, False, True))
107+
params.append(ParameterString(self.COPYRIGHT,
108+
self.tr('Copyright for the map'),
109+
None, False, True))
110+
params.append(ParameterString(self.GOOGLEKEY,
111+
self.tr('Google Maps API key from http://code.google.com/apis/maps/signup.html'),
112+
None, False, True))
113+
params.append(ParameterString(self.BINGKEY,
114+
self.tr('Bing Maps API key from https://www.bingmapsportal.com/'),
115+
None, False, True))
116+
117+
for param in params:
118+
param.isAdvanced = True
119+
self.addParameter(param)
120+
121+
self.addOutput(OutputDirectory(self.OUTPUTDIR,
122+
self.tr('The directory where the tile result is created')))
123+
124+
def getConsoleCommands(self):
125+
126+
arguments = []
127+
128+
if self.getParameterValue(self.PROFILE):
129+
arguments.append('-p')
130+
arguments.append(self.PROFILES[self.getParameterValue(self.PROFILE)])
131+
132+
if self.getParameterValue(self.RESAMPLING):
133+
arguments.append('-r')
134+
arguments.append(self.RESAMPLINGS[self.getParameterValue(self.RESAMPLING)])
135+
136+
ssrs = unicode(self.getParameterValue(self.S_SRS))
137+
if len(ssrs) > 0:
138+
arguments.append('-s')
139+
arguments.append(ssrs)
140+
141+
if self.getParameterValue(self.ZOOM):
142+
arguments.append('-z')
143+
arguments.append(unicode(self.getParameterValue(self.ZOOM)))
144+
145+
if self.getParameterValue(self.RESUME):
146+
arguments.append('-e')
147+
148+
if self.getParameterValue(self.NODATA):
149+
arguments.append('-a')
150+
arguments.append(unicode(self.getParameterValue(self.NODATA)))
151+
152+
# KML arguments
153+
if self.getParameterValue(self.FORCEKML):
154+
arguments.append('-k')
155+
156+
if self.getParameterValue(self.NOKML):
157+
arguments.append('-n')
158+
159+
if self.getParameterValue(self.URL):
160+
arguments.append('-u')
161+
arguments.append(unicode(self.getParameterValue(self.URL)))
162+
163+
# Web viewer arguments
164+
if self.getParameterValue(self.WEBVIEWER):
165+
arguments.append('-w')
166+
arguments.append(self.WEBVIEWERS[self.getParameterValue(self.WEBVIEWER)])
167+
168+
parameters = {self.TITLE: '-t', self.COPYRIGHT: '-c',
169+
self.GOOGLEKEY: '-g', self.BINGKEY: '-b'}
170+
for arg, parameter in parameters.iteritems():
171+
if self.getParameterValue(arg):
172+
arguments.append(parameter)
173+
arguments.append(self.getParameterValue(arg))
174+
175+
arguments.append(self.getParameterValue(self.INPUT))
176+
arguments.append(self.getOutputValue(self.OUTPUTDIR))
177+
178+
commands = []
179+
if isWindows():
180+
commands = ['cmd.exe', '/C ', 'gdal2tiles.bat',
181+
GdalUtils.escapeAndJoin(arguments)]
182+
else:
183+
commands = ['gdal2tiles.py',
184+
GdalUtils.escapeAndJoin(arguments)]
185+
186+
return commands
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,187 @@
1+
# -*- coding: utf-8 -*-
2+
3+
"""
4+
***************************************************************************
5+
retile.py
6+
---------------------
7+
Date : January 2016
8+
Copyright : (C) 2016 by Médéric Ribreux
9+
Email : mederic dot ribreux at medspx dot fr
10+
***************************************************************************
11+
* *
12+
* This program is free software; you can redistribute it and/or modify *
13+
* it under the terms of the GNU General Public License as published by *
14+
* the Free Software Foundation; either version 2 of the License, or *
15+
* (at your option) any later version. *
16+
* *
17+
***************************************************************************
18+
"""
19+
20+
__author__ = 'Médéric Ribreux'
21+
__date__ = 'January 2016'
22+
__copyright__ = '(C) 2016, Médéric Ribreux'
23+
24+
# This will get replaced with a git SHA1 when you do a git archive
25+
26+
__revision__ = '$Format:%H$'
27+
28+
from processing.algs.gdal.GdalAlgorithm import GdalAlgorithm
29+
from processing.core.parameters import ParameterString
30+
from processing.core.parameters import ParameterSelection
31+
from processing.core.parameters import ParameterNumber
32+
from processing.core.parameters import ParameterMultipleInput
33+
from processing.core.parameters import ParameterCrs
34+
from processing.core.parameters import ParameterBoolean
35+
from processing.core.outputs import OutputDirectory
36+
from processing.tools.system import isWindows
37+
from processing.algs.gdal.GdalUtils import GdalUtils
38+
import re
39+
40+
41+
class retile(GdalAlgorithm):
42+
43+
INPUT = 'INPUT'
44+
RTYPE = 'RTYPE'
45+
ONLYPYRAMIDS = 'ONLYPYRAMIDS'
46+
PYRAMIDLEVELS = 'PYRAMIDLEVELS'
47+
PIXELSIZE = 'PIXELSIZE'
48+
ALGORITHM = 'ALGORITHM'
49+
USEDIRFOREACHROW = 'USEDIRFOREACHROW'
50+
S_SRS = 'S_SRS'
51+
TARGETDIR = 'TARGETDIR'
52+
CSVFILE = 'CSVFILE'
53+
CSVDELIM = 'CSVDELIM'
54+
TILEINDEX = 'TILEINDEX'
55+
TILEINDEXFIELD = 'TILEINDEXFIELD'
56+
FORMAT = 'FORMAT'
57+
58+
TYPE = ['Byte', 'Int16', 'UInt16', 'UInt32', 'Int32', 'Float32', 'Float64']
59+
ALGO = ['near', 'bilinear', 'cubic', 'cubicspline', 'lanczos']
60+
61+
def commandLineName(self):
62+
return "gdalogr:retile"
63+
64+
def commandName(self):
65+
return "gdal_retile"
66+
67+
def defineCharacteristics(self):
68+
self.name, self.i18n_name = self.trAlgorithm('Retile')
69+
self.group, self.i18n_group = self.trAlgorithm('[GDAL] Miscellaneous')
70+
71+
# Required parameters
72+
self.addParameter(ParameterMultipleInput(self.INPUT,
73+
self.tr('Input layers'),
74+
ParameterMultipleInput.TYPE_RASTER))
75+
# Advanced parameters
76+
params = []
77+
params.append(ParameterString(self.PIXELSIZE,
78+
self.tr('Pixel size to be used for the output file (XSIZE YSIZE like 512 512)'),
79+
None, False, True))
80+
params.append(ParameterSelection(self.ALGORITHM,
81+
self.tr('Resampling algorithm'), self.ALGO, 0, False, True))
82+
params.append(ParameterCrs(self.S_SRS,
83+
self.tr('Override source CRS'), None, True))
84+
params.append(ParameterNumber(self.PYRAMIDLEVELS,
85+
self.tr('Number of pyramids levels to build'),
86+
None, None, None, True))
87+
params.append(ParameterBoolean(self.ONLYPYRAMIDS,
88+
self.tr('Build only the pyramids'),
89+
False, True))
90+
params.append(ParameterSelection(self.RTYPE,
91+
self.tr('Output raster type'),
92+
self.TYPE, 5, False, True))
93+
params.append(ParameterSelection(self.FORMAT,
94+
self.tr('Output raster format'),
95+
GdalUtils.getSupportedRasters().keys(), 0, False, True))
96+
params.append(ParameterBoolean(self.USEDIRFOREACHROW,
97+
self.tr('Use a directory for each row'),
98+
False, True))
99+
params.append(ParameterString(self.CSVFILE,
100+
self.tr('Name of the csv file containing the tile(s) georeferencing information'),
101+
None, False, True))
102+
params.append(ParameterString(self.CSVDELIM,
103+
self.tr('Column delimiter used in the CSV file'),
104+
None, False, True))
105+
params.append(ParameterString(self.TILEINDEX,
106+
self.tr('name of shape file containing the result tile(s) index'),
107+
None, False, True))
108+
params.append(ParameterString(self.TILEINDEXFIELD,
109+
self.tr('name of the attribute containing the tile name in the result shape file'),
110+
None, False, True))
111+
112+
for param in params:
113+
param.isAdvanced = True
114+
self.addParameter(param)
115+
116+
self.addOutput(OutputDirectory(self.TARGETDIR,
117+
self.tr('The directory where the tile result is created')))
118+
119+
def getConsoleCommands(self):
120+
121+
arguments = []
122+
123+
if self.getParameterValue(self.RTYPE):
124+
arguments.append('-ot')
125+
arguments.append(self.TYPE[self.getParameterValue(self.RTYPE)])
126+
127+
arguments.append('-of')
128+
arguments.append(GdalUtils.getSupportedRasters().keys()[self.getParameterValue(self.FORMAT)])
129+
130+
if self.getParameterValue(self.PIXELSIZE):
131+
pixelSize = self.getParameterValue(self.PIXELSIZE)
132+
if re.match(r'\d+ \d+', pixelSize):
133+
xsize, ysize = pixelSize.split(' ')
134+
arguments.append('-ps')
135+
arguments.append(xsize)
136+
arguments.append(ysize)
137+
138+
if self.getParameterValue(self.ONLYPYRAMIDS):
139+
arguments.append('-pyramidOnly')
140+
141+
if self.getParameterValue(self.USEDIRFOREACHROW):
142+
arguments.append('-useDirForEachRow')
143+
144+
ssrs = unicode(self.getParameterValue(self.S_SRS))
145+
if len(ssrs) > 0:
146+
arguments.append('-s_srs')
147+
arguments.append(ssrs)
148+
149+
if self.getParameterValue(self.PYRAMIDLEVELS):
150+
arguments.append('-levels')
151+
arguments.append(unicode(self.getParameterValue(self.PYRAMIDLEVELS)))
152+
153+
arguments.append('-r')
154+
arguments.append(self.ALGO[self.getParameterValue(self.ALGORITHM)])
155+
156+
# Handle CSV
157+
if self.getParameterValue(self.CSVFILE):
158+
arguments.append('-csv')
159+
arguments.append(self.getParameterValue(self.CSVFILE))
160+
161+
if self.getParameterValue(self.CSVFILE) and self.getParameterValue(self.CSVDELIM):
162+
arguments.append('-csvDelim')
163+
arguments.append(self.getParameterValue(self.CSVDELIM))
164+
165+
# Handle Shp
166+
if self.getParameterValue(self.TILEINDEX):
167+
arguments.append('-tileIndex')
168+
arguments.append(self.getParameterValue(self.TILEINDEX))
169+
170+
if self.getParameterValue(self.TILEINDEX) and self.getParameterValue(self.TILEINDEXFIELD):
171+
arguments.append('-tileIndexField')
172+
arguments.append(self.getParameterValue(self.TILEINDEXFIELD))
173+
174+
arguments.append('-targetDir')
175+
arguments.append(self.getOutputValue(self.TARGETDIR))
176+
177+
arguments.extend(self.getParameterValue(self.INPUT).split(';'))
178+
179+
commands = []
180+
if isWindows():
181+
commands = ['cmd.exe', '/C ', 'gdal_retile.bat',
182+
GdalUtils.escapeAndJoin(arguments)]
183+
else:
184+
commands = ['gdal_retile.py',
185+
GdalUtils.escapeAndJoin(arguments)]
186+
187+
return commands

0 commit comments

Comments
 (0)