Skip to content

Commit

Permalink
Merge pull request #41847 from nyalldawson/fix_41839
Browse files Browse the repository at this point in the history
Fix many issues in gdal algs...
  • Loading branch information
nyalldawson committed Feb 26, 2021
2 parents 6efe375 + 6a7e4c1 commit fe566bc
Show file tree
Hide file tree
Showing 8 changed files with 40 additions and 16 deletions.
9 changes: 6 additions & 3 deletions python/plugins/processing/algs/gdal/GdalAlgorithmDialog.py
Expand Up @@ -123,13 +123,16 @@ def parametersHaveChanged(self):
parameters = self.dialog.createProcessingParameters()
for output in self.algorithm().destinationParameterDefinitions():
if not output.name() in parameters or parameters[output.name()] is None:
parameters[output.name()] = self.tr("[temporary file]")
if not output.flags() & QgsProcessingParameterDefinition.FlagOptional:
parameters[output.name()] = self.tr("[temporary file]")
for p in self.algorithm().parameterDefinitions():
if p.flags() & QgsProcessingParameterDefinition.FlagHidden:
continue

if (not p.name() in parameters and not p.flags() & QgsProcessingParameterDefinition.FlagOptional) \
or (not p.checkValueIsAcceptable(parameters[p.name()])):
if p.flags() & QgsProcessingParameterDefinition.FlagOptional and p.name() not in parameters:
continue

if p.name() not in parameters or not p.checkValueIsAcceptable(parameters[p.name()]):
# not ready yet
self.text.setPlainText('')
return
Expand Down
5 changes: 3 additions & 2 deletions python/plugins/processing/algs/gdal/GdalUtils.py
Expand Up @@ -254,12 +254,13 @@ def getFormatShortNameFromFilename(filename):

@staticmethod
def escapeAndJoin(strList):
escChars = [' ', '&', '(', ')', '"']
escChars = [' ', '&', '(', ')', '"', ';']
joined = ''
for s in strList:
if not isinstance(s, str):
s = str(s)
if s and s[0] != '-' and any(c in s for c in escChars):
# don't escape if command starts with - and isn't a negative number, e.g. -9999
if s and re.match(r'^([^-]|-\d)', s) and any(c in s for c in escChars):
escaped = '"' + s.replace('\\', '\\\\').replace('"', '"""') \
+ '"'
else:
Expand Down
2 changes: 1 addition & 1 deletion python/plugins/processing/algs/gdal/PointsAlongLines.py
Expand Up @@ -112,7 +112,7 @@ def getConsoleCommands(self, parameters, context, feedback, executing=True):
ogrLayer,
'-dialect',
'sqlite',
'-sql'
'-sql',
f'SELECT ST_Line_Interpolate_Point({geometry}, {distance}) AS {geometry}{other_fields} FROM "{layerName}"'
]

Expand Down
3 changes: 2 additions & 1 deletion python/plugins/processing/algs/gdal/buildvrt.py
Expand Up @@ -196,7 +196,8 @@ def getConsoleCommands(self, parameters, context, feedback, executing=True):

if self.SRC_NODATA in parameters and parameters[self.SRC_NODATA] not in (None, ''):
nodata = self.parameterAsString(parameters, self.SRC_NODATA, context)
arguments.append('-srcnodata "{}"'.format(nodata))
arguments.append('-srcnodata')
arguments.append(nodata)

if self.EXTRA in parameters and parameters[self.EXTRA] not in (None, ''):
extra = self.parameterAsString(parameters, self.EXTRA, context)
Expand Down
12 changes: 6 additions & 6 deletions python/plugins/processing/algs/gdal/ogr2ogrtopostgislist.py
Expand Up @@ -252,14 +252,14 @@ def getConsoleCommands(self, parameters, context, feedback, executing=True):
if shapeEncoding:
arguments.append('--config')
arguments.append('SHAPE_ENCODING')
arguments.append('"' + shapeEncoding + '"')
arguments.append(shapeEncoding)
arguments.append('-f')
arguments.append('PostgreSQL')
arguments.append('PG:"')
for token in QgsDataSourceUri(uri).connectionInfo(executing).split(' '):
arguments.append(token)
arguments.append('active_schema={}'.format(schema or 'public'))
arguments.append('"')

connection_parts = QgsDataSourceUri(uri).connectionInfo(executing).split(' ')
connection_parts.append('active_schema={}'.format(schema or 'public'))
arguments.append('PG:{}'.format(' '.join(connection_parts)))

arguments.append(dimstring)
arguments.append(ogrLayer)
arguments.append(layername)
Expand Down
2 changes: 1 addition & 1 deletion python/plugins/processing/algs/gdal/retile.py
Expand Up @@ -208,7 +208,7 @@ def getConsoleCommands(self, parameters, context, feedback, executing=True):
delimiter = self.parameterAsString(parameters, self.DELIMITER, context)
if delimiter:
arguments.append('-csvDelim')
arguments.append('"{}"'.format(delimiter))
arguments.append(delimiter)

arguments.append('-targetDir')
arguments.append(self.parameterAsString(parameters, self.OUTPUT, context))
Expand Down
3 changes: 2 additions & 1 deletion python/plugins/processing/tests/GdalAlgorithmsGeneralTest.py
Expand Up @@ -338,7 +338,8 @@ def testCrsConversion(self):
self.assertEqual(GdalUtils.gdal_crs_string(QgsCoordinateReferenceSystem('ESRI:102003')), 'ESRI:102003')

def testEscapeAndJoin(self):
self.assertEqual(GdalUtils.escapeAndJoin([1, "a", "a b", "a&b", "a(b)"]), '1 a "a b" "a&b" "a(b)"')
self.assertEqual(GdalUtils.escapeAndJoin([1, "a", "a b", "a&b", "a(b)", ";"]), '1 a "a b" "a&b" "a(b)" ";"')
self.assertEqual(GdalUtils.escapeAndJoin([1, "-srcnodata", "--srcnodata", "-9999 9999"]), '1 -srcnodata --srcnodata "-9999 9999"')


if __name__ == '__main__':
Expand Down
20 changes: 19 additions & 1 deletion python/plugins/processing/tests/GdalAlgorithmsRasterTest.py
Expand Up @@ -1715,6 +1715,24 @@ def testRetile(self):
'-ps 256 256 -overlap 0 -levels 1 -s_srs EPSG:3111 -r near -ot Float32 -targetDir {} {}'.format(outdir, source)
])

self.assertEqual(
alg.getConsoleCommands({'INPUT': [source],
'OUTPUT_CSV': 'out.csv',
'DELIMITER': '',
'OUTPUT': outdir}, context, feedback),
['gdal_retile.py',
'-ps 256 256 -overlap 0 -levels 1 -r near -ot Float32 -csv out.csv -targetDir {} '.format(outdir) +
source])

self.assertEqual(
alg.getConsoleCommands({'INPUT': [source],
'OUTPUT_CSV': 'out.csv',
'DELIMITER': ';',
'OUTPUT': outdir}, context, feedback),
['gdal_retile.py',
'-ps 256 256 -overlap 0 -levels 1 -r near -ot Float32 -csv out.csv -csvDelim ";" -targetDir {} '.format(outdir) +
source])

# additional parameters
self.assertEqual(
alg.getConsoleCommands({'INPUT': [source],
Expand Down Expand Up @@ -2588,7 +2606,7 @@ def testBuildVrt(self):
cmd[1] = t[:t.find('-input_file_list') + 17] + t[t.find('buildvrtInputFiles.txt'):]
self.assertEqual(cmd,
['gdalbuildvrt',
'-resolution average -separate -r nearest -srcnodata "-9999" ' +
'-resolution average -separate -r nearest -srcnodata -9999 ' +
'-input_file_list buildvrtInputFiles.txt ' +
outdir + '/check.vrt'])

Expand Down

0 comments on commit fe566bc

Please sign in to comment.