Skip to content

Commit aba9dfb

Browse files
authoredMar 24, 2023
[feature][processing] Add skip/src/dstnodata params to gdal2xyz
1 parent ff9a4ca commit aba9dfb

File tree

2 files changed

+80
-2
lines changed

2 files changed

+80
-2
lines changed
 

‎python/plugins/processing/algs/gdal/gdal2xyz.py

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,8 @@
2626
QgsProcessingParameterRasterLayer,
2727
QgsProcessingParameterBand,
2828
QgsProcessingParameterBoolean,
29-
QgsProcessingParameterFileDestination
29+
QgsProcessingParameterFileDestination,
30+
QgsProcessingParameterNumber
3031
)
3132
from processing.algs.gdal.GdalAlgorithm import GdalAlgorithm
3233
from processing.algs.gdal.GdalUtils import GdalUtils
@@ -36,6 +37,9 @@
3637
class gdal2xyz(GdalAlgorithm):
3738
INPUT = 'INPUT'
3839
BAND = 'BAND'
40+
SRCNODATA = 'NODATA_INPUT'
41+
DSTNODATA = 'NODATA_OUTPUT'
42+
SKIPNODATA = 'SKIP_NODATA'
3943
CSV = 'CSV'
4044
OUTPUT = 'OUTPUT'
4145

@@ -49,6 +53,16 @@ def initAlgorithm(self, config=None):
4953
self.tr('Band number'),
5054
1,
5155
parentLayerParameterName=self.INPUT))
56+
57+
self.addParameter(QgsProcessingParameterNumber(self.SRCNODATA,
58+
self.tr('Input pixel value to treat as "nodata"'),
59+
optional=True)) # GDAL > 3.6.3
60+
self.addParameter(QgsProcessingParameterNumber(self.DSTNODATA,
61+
self.tr('Assign specified "nodata" value to output'),
62+
optional=True)) # GDAL > 3.6.3
63+
self.addParameter(QgsProcessingParameterBoolean(self.SKIPNODATA,
64+
self.tr('Do not output nodata values'),
65+
defaultValue=False)) # GDAL > 3.3
5266
self.addParameter(QgsProcessingParameterBoolean(self.CSV,
5367
self.tr('Output comma-separated values'),
5468
defaultValue=False))
@@ -79,6 +93,30 @@ def getConsoleCommands(self, parameters, context, feedback, executing=True):
7993
'-band',
8094
str(self.parameterAsInt(parameters, self.BAND, context))
8195
]
96+
97+
if self.SRCNODATA in parameters and parameters[self.SRCNODATA] is not None:
98+
if GdalUtils.version() > 3060300: # src/dstnodata broken <= 3.6.3 https://github.com/OSGeo/gdal/issues/7410
99+
srcnodata = self.parameterAsDouble(parameters, self.SRCNODATA, context)
100+
arguments.append('-srcnodata')
101+
arguments.append(srcnodata)
102+
else:
103+
raise QgsProcessingException(self.tr('The source nodata option (-srcnodata) is only available on GDAL 3.6.4 or later'))
104+
105+
if self.DSTNODATA in parameters and parameters[self.DSTNODATA] is not None:
106+
if GdalUtils.version() > 3060300: # src/dstnodata broken <= 3.6.3 https://github.com/OSGeo/gdal/issues/7410
107+
dstnodata = self.parameterAsDouble(parameters, self.DSTNODATA, context)
108+
arguments.append('-dstnodata')
109+
arguments.append(dstnodata)
110+
else:
111+
raise QgsProcessingException(self.tr('The destination nodata option (-dstnodata) is only available on GDAL 3.6.4 or later'))
112+
113+
if self.SKIPNODATA in parameters:
114+
if GdalUtils.version() >= 3030000: # skipnodata added at GDAL 3.3
115+
if self.parameterAsBoolean(parameters, self.SKIPNODATA, context):
116+
arguments.append('-skipnodata')
117+
else:
118+
raise QgsProcessingException(self.tr('The skip nodata option (-skipnodata) is only available on GDAL 3.3 or later'))
119+
82120
if self.parameterAsBoolean(parameters, self.CSV, context):
83121
arguments.append('-csv')
84122

‎python/plugins/processing/tests/GdalAlgorithmsRasterTest.py

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2533,7 +2533,47 @@ def testGdal2Xyz(self):
25332533
['gdal2xyz.py',
25342534
'-band 1 -csv ' +
25352535
source + ' ' +
2536-
outsource])
2536+
outsource])
2537+
2538+
if GdalUtils.version() >= 3030000:
2539+
# skip nodata output
2540+
self.assertEqual(
2541+
alg.getConsoleCommands({'INPUT': source,
2542+
'BAND': 1,
2543+
'CSV': False,
2544+
'SKIP_NODATA': True,
2545+
'OUTPUT': outsource}, context, feedback),
2546+
['gdal2xyz.py',
2547+
'-band 1 -skipnodata ' +
2548+
source + ' ' +
2549+
outsource])
2550+
2551+
if GdalUtils.version() > 3060300:
2552+
# srcnodata output
2553+
self.assertEqual(
2554+
alg.getConsoleCommands({'INPUT': source,
2555+
'BAND': 1,
2556+
'CSV': False,
2557+
'NODATA_INPUT': -999,
2558+
'SKIP_NODATA': False,
2559+
'OUTPUT': outsource}, context, feedback),
2560+
['gdal2xyz.py',
2561+
'-band 1 -srcnodata -999 ' +
2562+
source + ' ' +
2563+
outsource])
2564+
2565+
# dstnodata output
2566+
self.assertEqual(
2567+
alg.getConsoleCommands({'INPUT': source,
2568+
'BAND': 1,
2569+
'CSV': False,
2570+
'NODATA_OUTPUT': -999,
2571+
'SKIP_NODATA': False,
2572+
'OUTPUT': outsource}, context, feedback),
2573+
['gdal2xyz.py',
2574+
'-band 1 -dstnodata -999 ' +
2575+
source + ' ' +
2576+
outsource])
25372577

25382578
def testGdalPolygonize(self):
25392579
context = QgsProcessingContext()

0 commit comments

Comments
 (0)
Please sign in to comment.