Skip to content

Commit 53ebe05

Browse files
authored
Merge pull request #5825 from nyalldawson/gdal
[processing] Some GDAL algorithm fixes
2 parents 297138f + b578f8a commit 53ebe05

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

57 files changed

+273
-246
lines changed

python/core/processing/qgsprocessingutils.sip

+4
Original file line numberDiff line numberDiff line change
@@ -273,6 +273,10 @@ class QgsProcessingFeatureSource : QgsFeatureSource
273273

274274
virtual QVariant maximumValue( int fieldIndex ) const;
275275

276+
virtual QgsRectangle sourceExtent() const;
277+
278+
virtual QgsFeatureIds allFeatureIds() const;
279+
276280

277281
QgsExpressionContextScope *createExpressionContextScope() const /Factory/;
278282
%Docstring

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ def icon(self):
7070
def group(self):
7171
return self.tr('Raster projections')
7272

73-
def getConsoleCommands(self, parameters, context, feedback):
73+
def getConsoleCommands(self, parameters, context, feedback, executing=True):
7474
inLayer = self.parameterAsRasterLayer(parameters, self.INPUT, context)
7575
fileName = inLayer.source()
7676

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -98,9 +98,9 @@ def group(self):
9898
def commandName(self):
9999
return 'ogr2ogr'
100100

101-
def getConsoleCommands(self, parameters, context, feedback):
101+
def getConsoleCommands(self, parameters, context, feedback, executing=True):
102102
fields = self.parameterAsSource(parameters, self.INPUT, context).fields()
103-
ogrLayer, layerName = self.getOgrCompatibleSource(self.INPUT, parameters, context, feedback)
103+
ogrLayer, layerName = self.getOgrCompatibleSource(self.INPUT, parameters, context, feedback, executing)
104104
geometry = self.parameterAsString(parameters, self.GEOMETRY, context)
105105
distance = self.parameterAsDouble(parameters, self.DISTANCE, context)
106106
fieldName = self.parameterAsString(parameters, self.FIELD, context)

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ def icon(self):
105105
def commandName(self):
106106
return "gdal_translate"
107107

108-
def getConsoleCommands(self, parameters, context, feedback):
108+
def getConsoleCommands(self, parameters, context, feedback, executing=True):
109109
inLayer = self.parameterAsRasterLayer(parameters, self.INPUT, context)
110110
bbox = self.parameterAsExtent(parameters, self.EXTENT, context, inLayer.crs())
111111
nodata = self.parameterAsDouble(parameters, self.NODATA, context)

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -116,10 +116,10 @@ def icon(self):
116116
def group(self):
117117
return self.tr('Raster extraction')
118118

119-
def getConsoleCommands(self, parameters, context, feedback):
119+
def getConsoleCommands(self, parameters, context, feedback, executing=True):
120120
inLayer = self.parameterAsRasterLayer(parameters, self.INPUT, context)
121121

122-
maskLayer, maskLayerName = self.getOgrCompatibleSource(self.MASK, parameters, context, feedback)
122+
maskLayer, maskLayerName = self.getOgrCompatibleSource(self.MASK, parameters, context, feedback, executing)
123123

124124
nodata = self.parameterAsDouble(parameters, self.NODATA, context)
125125
options = self.parameterAsString(parameters, self.OPTIONS, context)

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -74,8 +74,8 @@ def group(self):
7474
def commandName(self):
7575
return 'ogr2ogr'
7676

77-
def getConsoleCommands(self, parameters, context, feedback):
78-
ogrLayer, layerName = self.getOgrCompatibleSource(self.INPUT, parameters, context, feedback)
77+
def getConsoleCommands(self, parameters, context, feedback, executing=True):
78+
ogrLayer, layerName = self.getOgrCompatibleSource(self.INPUT, parameters, context, feedback, executing)
7979
source = self.parameterAsSource(parameters, self.INPUT, context)
8080
extent = self.parameterAsExtent(parameters, self.EXTENT, context, source.sourceCrs())
8181
options = self.parameterAsString(parameters, self.OPTIONS, context)

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

+3-3
Original file line numberDiff line numberDiff line change
@@ -73,9 +73,9 @@ def group(self):
7373
def commandName(self):
7474
return 'ogr2ogr'
7575

76-
def getConsoleCommands(self, parameters, context, feedback):
77-
inLayer, inLayerName = self.getOgrCompatibleSource(self.INPUT, parameters, context, feedback)
78-
maskLayer, maskLayerName = self.getOgrCompatibleSource(self.MASK, parameters, context, feedback)
76+
def getConsoleCommands(self, parameters, context, feedback, executing=True):
77+
inLayer, inLayerName = self.getOgrCompatibleSource(self.INPUT, parameters, context, feedback, executing)
78+
maskLayer, maskLayerName = self.getOgrCompatibleSource(self.MASK, parameters, context, feedback, executing)
7979
options = self.parameterAsString(parameters, self.OPTIONS, context)
8080
outFile = self.parameterAsOutputLayer(parameters, self.OUTPUT, context)
8181

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ def displayName(self):
9292
def group(self):
9393
return self.tr('Raster analysis')
9494

95-
def getConsoleCommands(self, parameters, context, feedback):
95+
def getConsoleCommands(self, parameters, context, feedback, executing=True):
9696
arguments = ['color-relief']
9797
inLayer = self.parameterAsRasterLayer(parameters, self.INPUT, context)
9898
arguments.append(inLayer.source())

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -109,9 +109,9 @@ def group(self):
109109
def commandName(self):
110110
return 'ogr2ogr'
111111

112-
def getConsoleCommands(self, parameters, context, feedback):
112+
def getConsoleCommands(self, parameters, context, feedback, executing=True):
113113
fields = self.parameterAsSource(parameters, self.INPUT, context).fields()
114-
ogrLayer, layerName = self.getOgrCompatibleSource(self.INPUT, parameters, context, feedback)
114+
ogrLayer, layerName = self.getOgrCompatibleSource(self.INPUT, parameters, context, feedback, executing)
115115
geometry = self.parameterAsString(parameters, self.GEOMETRY, context)
116116
fieldName = self.parameterAsString(parameters, self.FIELD, context)
117117

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -82,8 +82,8 @@ def displayName(self):
8282
def group(self):
8383
return self.tr('Vector miscellaneous')
8484

85-
def getConsoleCommands(self, parameters, context, feedback):
86-
ogrLayer, layerName = self.getOgrCompatibleSource(self.INPUT, parameters, context, feedback)
85+
def getConsoleCommands(self, parameters, context, feedback, executing=True):
86+
ogrLayer, layerName = self.getOgrCompatibleSource(self.INPUT, parameters, context, feedback, executing)
8787
sql = self.parameterAsString(parameters, self.SQL, context)
8888
options = self.parameterAsString(parameters, self.OPTIONS, context)
8989
outFile = self.parameterAsOutputLayer(parameters, self.OUTPUT, context)

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

+29-15
Original file line numberDiff line numberDiff line change
@@ -59,30 +59,44 @@ def createInstance(self, config={}):
5959
def createCustomParametersWidget(self, parent):
6060
return GdalAlgorithmDialog(self)
6161

62-
def getConsoleCommands(self, parameters, context, feedback):
62+
def getConsoleCommands(self, parameters, context, feedback, executing=True):
6363
return None
6464

65-
def getOgrCompatibleSource(self, parameter_name, parameters, context, feedback):
65+
def getOgrCompatibleSource(self, parameter_name, parameters, context, feedback, executing):
6666
"""
6767
Interprets a parameter as an OGR compatible source and layer name
68+
:param executing:
6869
"""
6970
input_layer = self.parameterAsVectorLayer(parameters, parameter_name, context)
7071
ogr_data_path = None
7172
ogr_layer_name = None
7273
if input_layer is None:
73-
# parameter is not a vector layer - try to convert to a source compatible with OGR
74-
# and extract selection if required
75-
ogr_data_path = self.parameterAsCompatibleSourceLayerPath(parameters, parameter_name, context,
76-
QgsVectorFileWriter.supportedFormatExtensions(),
77-
feedback=feedback)
78-
ogr_layer_name = GdalUtils.ogrLayerName(ogr_data_path)
74+
if executing:
75+
# parameter is not a vector layer - try to convert to a source compatible with OGR
76+
# and extract selection if required
77+
ogr_data_path = self.parameterAsCompatibleSourceLayerPath(parameters, parameter_name, context,
78+
QgsVectorFileWriter.supportedFormatExtensions(),
79+
feedback=feedback)
80+
ogr_layer_name = GdalUtils.ogrLayerName(ogr_data_path)
81+
else:
82+
#not executing - don't waste time converting incompatible sources, just return dummy strings
83+
#for the command preview (since the source isn't compatible with OGR, it has no meaning anyway and can't
84+
#be run directly in the command line)
85+
ogr_data_path = 'path_to_data_file'
86+
ogr_layer_name = 'layer_name'
7987
elif input_layer.dataProvider().name() == 'ogr':
80-
# parameter is a vector layer, with OGR data provider
81-
# so extract selection if required
82-
ogr_data_path = self.parameterAsCompatibleSourceLayerPath(parameters, parameter_name, context,
83-
QgsVectorFileWriter.supportedFormatExtensions(),
84-
feedback=feedback)
85-
ogr_layer_name = GdalUtils.ogrLayerName(input_layer.dataProvider().dataSourceUri())
88+
if executing:
89+
# parameter is a vector layer, with OGR data provider
90+
# so extract selection if required
91+
ogr_data_path = self.parameterAsCompatibleSourceLayerPath(parameters, parameter_name, context,
92+
QgsVectorFileWriter.supportedFormatExtensions(),
93+
feedback=feedback)
94+
ogr_layer_name = GdalUtils.ogrLayerName(input_layer.dataProvider().dataSourceUri())
95+
else:
96+
#not executing - don't worry about 'selected features only' handling. It has no meaning
97+
#for the command line preview since it has no meaning outside of a QGIS session!
98+
ogr_data_path = GdalUtils.ogrConnectionString(input_layer.dataProvider().dataSourceUri(), context)[1:-1]
99+
ogr_layer_name = GdalUtils.ogrLayerName(input_layer.dataProvider().dataSourceUri())
86100
else:
87101
# vector layer, but not OGR - get OGR compatible path
88102
# TODO - handle "selected features only" mode!!
@@ -94,7 +108,7 @@ def setOutputValue(self, name, value):
94108
self.output_values[name] = value
95109

96110
def processAlgorithm(self, parameters, context, feedback):
97-
commands = self.getConsoleCommands(parameters, context, feedback)
111+
commands = self.getConsoleCommands(parameters, context, feedback, executing=True)
98112
GdalUtils.runGdal(commands, feedback)
99113

100114
# auto generate outputs

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ def parametersHaveChanged(self):
118118
self.text.setPlainText('')
119119
return
120120

121-
commands = self.alg.getConsoleCommands(parameters, context, feedback)
121+
commands = self.alg.getConsoleCommands(parameters, context, feedback, executing=False)
122122
commands = [c for c in commands if c not in ['cmd.exe', '/C ']]
123123
self.text.setPlainText(" ".join(commands))
124124
except AlgorithmDialogBase.InvalidParameterValue as e:

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -82,10 +82,10 @@
8282
from .ogr2ogr import ogr2ogr
8383
from .ogrinfo import ogrinfo
8484
from .OgrToPostGis import OgrToPostGis
85+
from .ogr2ogrtopostgislist import Ogr2OgrToPostGisList
8586
from .OneSideBuffer import OneSideBuffer
8687
from .PointsAlongLines import PointsAlongLines
8788

88-
# from .ogr2ogrtopostgislist import Ogr2OgrToPostGisList
8989
# from .ogr2ogrtabletopostgislist import Ogr2OgrTableToPostGisList
9090

9191
pluginPath = os.path.normpath(os.path.join(
@@ -187,9 +187,9 @@ def loadAlgorithms(self):
187187
ogr2ogr(),
188188
ogrinfo(),
189189
OgrToPostGis(),
190+
Ogr2OgrToPostGisList(),
190191
OneSideBuffer(),
191192
PointsAlongLines(),
192-
# Ogr2OgrToPostGisList(),
193193
# Ogr2OgrTableToPostGisList(),
194194
]
195195
for a in self.algs:

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -135,8 +135,8 @@ def group(self):
135135
def icon(self):
136136
return QIcon(os.path.join(pluginPath, 'images', 'gdaltools', 'grid.png'))
137137

138-
def getConsoleCommands(self, parameters, context, feedback):
139-
ogrLayer, layerName = self.getOgrCompatibleSource(self.INPUT, parameters, context, feedback)
138+
def getConsoleCommands(self, parameters, context, feedback, executing=True):
139+
ogrLayer, layerName = self.getOgrCompatibleSource(self.INPUT, parameters, context, feedback, executing)
140140

141141
arguments = ['-l']
142142
arguments.append(layerName)

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -149,8 +149,8 @@ def icon(self):
149149
def group(self):
150150
return self.tr('Raster analysis')
151151

152-
def getConsoleCommands(self, parameters, context, feedback):
153-
ogrLayer, layerName = self.getOgrCompatibleSource(self.INPUT, parameters, context, feedback)
152+
def getConsoleCommands(self, parameters, context, feedback, executing=True):
153+
ogrLayer, layerName = self.getOgrCompatibleSource(self.INPUT, parameters, context, feedback, executing)
154154

155155
arguments = ['-l']
156156
arguments.append(layerName)

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -155,8 +155,8 @@ def group(self):
155155
def icon(self):
156156
return QIcon(os.path.join(pluginPath, 'images', 'gdaltools', 'grid.png'))
157157

158-
def getConsoleCommands(self, parameters, context, feedback):
159-
ogrLayer, layerName = self.getOgrCompatibleSource(self.INPUT, parameters, context, feedback)
158+
def getConsoleCommands(self, parameters, context, feedback, executing=True):
159+
ogrLayer, layerName = self.getOgrCompatibleSource(self.INPUT, parameters, context, feedback, executing)
160160

161161
arguments = ['-l']
162162
arguments.append(layerName)

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -142,8 +142,8 @@ def group(self):
142142
def icon(self):
143143
return QIcon(os.path.join(pluginPath, 'images', 'gdaltools', 'grid.png'))
144144

145-
def getConsoleCommands(self, parameters, context, feedback):
146-
ogrLayer, layerName = self.getOgrCompatibleSource(self.INPUT, parameters, context, feedback)
145+
def getConsoleCommands(self, parameters, context, feedback, executing=True):
146+
ogrLayer, layerName = self.getOgrCompatibleSource(self.INPUT, parameters, context, feedback, executing)
147147

148148
arguments = ['-l']
149149
arguments.append(layerName)

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -117,8 +117,8 @@ def group(self):
117117
def icon(self):
118118
return QIcon(os.path.join(pluginPath, 'images', 'gdaltools', 'grid.png'))
119119

120-
def getConsoleCommands(self, parameters, context, feedback):
121-
ogrLayer, layerName = self.getOgrCompatibleSource(self.INPUT, parameters, context, feedback)
120+
def getConsoleCommands(self, parameters, context, feedback, executing=True):
121+
ogrLayer, layerName = self.getOgrCompatibleSource(self.INPUT, parameters, context, feedback, executing)
122122

123123
arguments = ['-l']
124124
arguments.append(layerName)

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -130,8 +130,8 @@ def group(self):
130130
def icon(self):
131131
return QIcon(os.path.join(pluginPath, 'images', 'gdaltools', 'grid.png'))
132132

133-
def getConsoleCommands(self, parameters, context, feedback):
134-
ogrLayer, layerName = self.getOgrCompatibleSource(self.INPUT, parameters, context, feedback)
133+
def getConsoleCommands(self, parameters, context, feedback, executing=True):
134+
ogrLayer, layerName = self.getOgrCompatibleSource(self.INPUT, parameters, context, feedback, executing)
135135

136136
arguments = ['-l']
137137
arguments.append(layerName)

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -81,9 +81,9 @@ def group(self):
8181
def commandName(self):
8282
return 'ogr2ogr'
8383

84-
def getConsoleCommands(self, parameters, context, feedback):
84+
def getConsoleCommands(self, parameters, context, feedback, executing=True):
8585
fields = self.parameterAsSource(parameters, self.INPUT, context).fields()
86-
ogrLayer, layerName = self.getOgrCompatibleSource(self.INPUT, parameters, context, feedback)
86+
ogrLayer, layerName = self.getOgrCompatibleSource(self.INPUT, parameters, context, feedback, executing)
8787
geometry = self.parameterAsString(parameters, self.GEOMETRY, context)
8888
distance = self.parameterAsDouble(parameters, self.DISTANCE, context)
8989
options = self.parameterAsString(parameters, self.OPTIONS, context)

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

+5-8
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ def initAlgorithm(self, config=None):
122122
self.tr('Maximum distance between 2 nodes (densification)'),
123123
defaultValue='', optional=True))
124124
self.addParameter(QgsProcessingParameterExtent(self.SPAT,
125-
self.tr('Select features by extent (defined in input layer CRS)')))
125+
self.tr('Select features by extent (defined in input layer CRS)'), optional=True))
126126
self.addParameter(QgsProcessingParameterBoolean(self.CLIP,
127127
self.tr('Clip the input layer using the above (rectangle) extent'),
128128
defaultValue=False))
@@ -184,9 +184,8 @@ def getConnectionString(self, parameters, context):
184184
arguments.append('user=' + user)
185185
return GdalUtils.escapeAndJoin(arguments)
186186

187-
def getConsoleCommands(self, parameters, context, feedback):
188-
inLayer = self.parameterAsSource(parameters, self.INPUT, context)
189-
ogrLayer, layername = self.getOgrCompatibleSource(self.INPUT, parameters, context, feedback)
187+
def getConsoleCommands(self, parameters, context, feedback, executing=True):
188+
ogrLayer, layername = self.getOgrCompatibleSource(self.INPUT, parameters, context, feedback, executing)
190189
shapeEncoding = self.parameterAsString(parameters, self.SHAPE_ENCODING, context)
191190
ssrs = self.parameterAsCrs(parameters, self.S_SRS, context).authid()
192191
tsrs = self.parameterAsCrs(parameters, self.T_SRS, context).authid()
@@ -203,8 +202,6 @@ def getConsoleCommands(self, parameters, context, feedback):
203202
simplify = self.parameterAsString(parameters, self.SIMPLIFY, context)
204203
segmentize = self.parameterAsString(parameters, self.SEGMENTIZE, context)
205204
spat = self.parameterAsExtent(parameters, self.SPAT, context)
206-
if spat.isNull():
207-
spat = inLayer.sourceExtent()
208205
clip = self.parameterAsBool(parameters, self.CLIP, context)
209206
where = self.parameterAsString(parameters, self.WHERE, context)
210207
wherestring = '-where "' + where + '"'
@@ -235,7 +232,7 @@ def getConsoleCommands(self, parameters, context, feedback):
235232
arguments.append('"')
236233
arguments.append(dimstring)
237234
arguments.append(ogrLayer)
238-
arguments.append(GdalUtils.ogrLayerName(inLayer))
235+
arguments.append(layername)
239236
if index:
240237
arguments.append(indexstring)
241238
if launder:
@@ -256,7 +253,7 @@ def getConsoleCommands(self, parameters, context, feedback):
256253
elif primary_key is not None:
257254
arguments.append("-lco FID=" + primary_key)
258255
if len(table) == 0:
259-
table = GdalUtils.ogrLayerName(inLayer).lower()
256+
table = layername.lower()
260257
if schema:
261258
table = '{}.{}'.format(schema, table)
262259
arguments.append('-nln')

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -107,9 +107,9 @@ def group(self):
107107
def commandName(self):
108108
return 'ogr2ogr'
109109

110-
def getConsoleCommands(self, parameters, context, feedback):
110+
def getConsoleCommands(self, parameters, context, feedback, executing=True):
111111
fields = self.parameterAsSource(parameters, self.INPUT, context).fields()
112-
ogrLayer, layerName = self.getOgrCompatibleSource(self.INPUT, parameters, context, feedback)
112+
ogrLayer, layerName = self.getOgrCompatibleSource(self.INPUT, parameters, context, feedback, executing)
113113
geometry = self.parameterAsString(parameters, self.GEOMETRY, context)
114114
distance = self.parameterAsDouble(parameters, self.DISTANCE, context)
115115
side = self.parameterAsEnum(parameters, self.BUFFER_SIDE, context)

0 commit comments

Comments
 (0)