Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix many issues in gdal algs... #41847

Merged
merged 6 commits into from
Feb 26, 2021
9 changes: 6 additions & 3 deletions python/plugins/processing/algs/gdal/GdalAlgorithmDialog.py
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
Expand Up @@ -250,12 +250,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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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