Skip to content

Commit cf85937

Browse files
committedFeb 6, 2013
added explicit CRS checking in sextante algorithms
1 parent 63ed164 commit cf85937

File tree

6 files changed

+62
-14
lines changed

6 files changed

+62
-14
lines changed
 

‎python/plugins/sextante/core/GeoAlgorithm.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -272,6 +272,24 @@ def setOutputCRS(self):
272272
return
273273
qgis = QGisLayers.iface
274274
self.crs = qgis.mapCanvas().mapRenderer().destinationCrs()
275+
276+
def checkInputCRS(self):
277+
'''it checks that all input layers use the same CRS. If so, returns True. False otherwise'''
278+
crs = None;
279+
layers = QGisLayers.getAllLayers()
280+
for param in self.parameters:
281+
if isinstance(param, (ParameterRaster, ParameterVector, ParameterMultipleInput)):
282+
if param.value:
283+
inputlayers = param.value.split(";")
284+
for inputlayer in inputlayers:
285+
for layer in layers:
286+
if layer.source() == inputlayer:
287+
if crs is None:
288+
crs = layer.crs()
289+
else:
290+
if crs != layer.crs():
291+
return False
292+
return True
275293

276294
def addOutput(self, output):
277295
#TODO: check that name does not exist

‎python/plugins/sextante/core/Sextante.py

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,7 @@ def loadAlgorithms():
174174
for alg in providerAlgs:
175175
algs[alg.commandLineName()] = alg
176176
Sextante.algs[provider.getName()] = algs
177-
177+
178178
#this is a special provider, since it depends on others
179179
#TODO Fix circular imports, so this provider can be incorporated
180180
#as a normal one
@@ -287,9 +287,13 @@ def runAlgorithm(algOrName, onFinish, *args):
287287

288288
msg = alg.checkParameterValuesBeforeExecuting()
289289
if msg:
290-
print ("Unable to execute algorithm\n" + msg)
291-
return
290+
print ("Unable to execute algorithm\n" + msg)
291+
return
292292

293+
if not alg.checkInputCRS():
294+
print ("Warning: Not all input layers use the same CRS.\n" +
295+
"This can cause unexpected results.")
296+
293297
SextanteLog.addToLog(SextanteLog.LOG_ALGORITHM, alg.getAsCommand())
294298

295299
# don't set the wait cursor twice, because then when you restore it
@@ -300,7 +304,12 @@ def runAlgorithm(algOrName, onFinish, *args):
300304
elif cursor.shape() != Qt.WaitCursor:
301305
QApplication.setOverrideCursor(QCursor(Qt.WaitCursor))
302306

303-
if SextanteConfig.getSetting(SextanteConfig.USE_THREADS):
307+
useThreads = SextanteConfig.getSetting(SextanteConfig.USE_THREADS)
308+
309+
#this is doing strange things, so temporarily the thread execution is disabled from the console
310+
useThreads = False
311+
312+
if useThreads:
304313
algEx = AlgorithmExecutor(alg)
305314
progress = QProgressDialog()
306315
progress.setWindowTitle(alg.name)

‎python/plugins/sextante/core/SextanteConfig.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@ class SextanteConfig():
4545
RECENT_ALGORITHMS = "RECENT_ALGORITHMS"
4646
PRE_EXECUTION_SCRIPT = "PRE_EXECUTION_SCRIPT"
4747
POST_EXECUTION_SCRIPT = "POST_EXECUTION_SCRIPT"
48+
SHOW_CRS_DEF = "SHOW_CRS_DEF"
49+
WARN_UNMATCHING_CRS = "WARN_UNMATCHING_CRS"
4850

4951
settings = {}
5052
settingIcons= {}
@@ -61,8 +63,9 @@ def initialize():
6163
SextanteConfig.addSetting(Setting("General", SextanteConfig.USE_FILENAME_AS_LAYER_NAME, "Use filename as layer name", True))
6264
SextanteConfig.addSetting(Setting("General", SextanteConfig.SHOW_RECENT_ALGORITHMS, "Show recently executed algorithms", True))
6365
SextanteConfig.addSetting(Setting("General", SextanteConfig.USE_CATEGORIES, "Use categories to classify algorithms, instead of providers", False))
64-
SextanteConfig.addSetting(Setting("General", SextanteConfig.OUTPUT_FOLDER,
65-
"Output folder", SextanteUtils.tempFolder()))
66+
SextanteConfig.addSetting(Setting("General", SextanteConfig.OUTPUT_FOLDER, "Output folder", SextanteUtils.tempFolder()))
67+
SextanteConfig.addSetting(Setting("General", SextanteConfig.SHOW_CRS_DEF, "Show layer CRS definition in selection boxes", True))
68+
SextanteConfig.addSetting(Setting("General", SextanteConfig.WARN_UNMATCHING_CRS, "Warn before executing if layer CRS's do not match", True))
6669
SextanteConfig.addSetting(Setting("General", SextanteConfig.RASTER_STYLE,"Style for raster layers",""))
6770
SextanteConfig.addSetting(Setting("General", SextanteConfig.VECTOR_POINT_STYLE,"Style for point layers",""))
6871
SextanteConfig.addSetting(Setting("General", SextanteConfig.VECTOR_LINE_STYLE,"Style for line layers",""))

‎python/plugins/sextante/gui/AlgorithmExecutionDialog.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,6 @@
4747
from sextante.parameters.ParameterCrs import ParameterCrs
4848
from sextante.core.SextanteConfig import SextanteConfig
4949
from sextante.parameters.ParameterExtent import ParameterExtent
50-
from sextante.outputs.OutputHTML import OutputHTML
5150
from sextante.outputs.OutputRaster import OutputRaster
5251
from sextante.outputs.OutputVector import OutputVector
5352
from sextante.outputs.OutputTable import OutputTable
@@ -202,10 +201,19 @@ def setParamValue(self, param, widget):
202201

203202
@pyqtSlot()
204203
def accept(self):
204+
checkCRS = SextanteConfig.getSetting(SextanteConfig.WARN_UNMATCHING_CRS)
205205
keepOpen = SextanteConfig.getSetting(SextanteConfig.KEEP_DIALOG_OPEN)
206206
useThread = SextanteConfig.getSetting(SextanteConfig.USE_THREADS)
207207
try:
208208
self.setParamValues()
209+
if checkCRS and not self.alg.checkInputCRS():
210+
reply = QMessageBox.question(self, "Unmatching CRS's",
211+
"Layers do not all use the same CRS.\n" +
212+
"This can cause unexpected results.\n" +
213+
"Do you want to continue?",
214+
QtGui.QMessageBox.Yes | QtGui.QMessageBox.No, QtGui.QMessageBox.No)
215+
if reply == QtGui.QMessageBox.No:
216+
return
209217
msg = self.alg.checkParameterValuesBeforeExecuting()
210218
if msg:
211219
if keepOpen or useThread:

‎python/plugins/sextante/gui/ParametersPanel.py

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -192,23 +192,29 @@ def buttonToggled(self, value):
192192
if button is not sender:
193193
button.setChecked(False)
194194

195+
def getExtendedLayerName(self, layer):
196+
if SextanteConfig.getSetting(SextanteConfig.SHOW_CRS_DEF):
197+
return layer.name() + " [" + layer.crs().description() +"]"
198+
else:
199+
return layer.name()
200+
195201
def getWidgetFromParameter(self, param):
196202
if isinstance(param, ParameterRaster):
197203
layers = QGisLayers.getRasterLayers()
198204
items = []
199205
if (param.optional):
200206
items.append((self.NOT_SELECTED, None))
201207
for layer in layers:
202-
items.append((layer.name(), layer))
208+
items.append((self.getExtendedLayerName(layer), layer))
203209
item = InputLayerSelectorPanel(items)
204210
elif isinstance(param, ParameterVector):
205211
if self.somethingDependsOnThisParameter(param):
206212
item = QtGui.QComboBox()
207213
layers = QGisLayers.getVectorLayers(param.shapetype)
208214
if (param.optional):
209-
item.addItem(self.NOT_SELECTED, None)
215+
item.addItem((self.NOT_SELECTED, None))
210216
for layer in layers:
211-
item.addItem(layer.name(), layer)
217+
item.addItem((self.getExtendedLayerName(layer), layer))
212218
item.currentIndexChanged.connect(self.updateDependentFields)
213219
item.name = param.name
214220
else:
@@ -217,16 +223,16 @@ def getWidgetFromParameter(self, param):
217223
if (param.optional):
218224
items.append((self.NOT_SELECTED, None))
219225
for layer in layers:
220-
items.append((layer.name(), layer))
226+
items.append((self.getExtendedLayerName(layer), layer))
221227
item = InputLayerSelectorPanel(items)
222228
elif isinstance(param, ParameterTable):
223229
if self.somethingDependsOnThisParameter(param):
224230
item = QtGui.QComboBox()
225231
layers = QGisLayers.getTables()
226232
if (param.optional):
227-
item.addItem(self.NOT_SELECTED, None)
233+
item.addItem((self.NOT_SELECTED, None))
228234
for layer in layers:
229-
item.addItem(layer.name(), layer)
235+
item.addItem((layer.name(), layer))
230236
item.currentIndexChanged.connect(self.updateDependentFields)
231237
item.name = param.name
232238
else:
@@ -279,7 +285,7 @@ def getWidgetFromParameter(self, param):
279285
options = QGisLayers.getVectorLayers(param.datatype)
280286
opts = []
281287
for opt in options:
282-
opts.append(opt.name())
288+
opts.append(self.getExtendedLayerName(opt))
283289
item = MultipleInputPanel(opts)
284290
elif isinstance(param, ParameterNumber):
285291
item = NumberInputPanel(param.default, param.isInteger)

‎python/plugins/sextante/saga/SagaAlgorithmProvider.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,10 @@ def getSupportedOutputVectorLayerExtensions(self):
9797

9898
def getSupportedOutputRasterLayerExtensions(self):
9999
return ["tif"]
100+
101+
def getSupportedOutputTableLayerExtensions(self):
102+
return ["dbf"]
103+
100104

101105
def getIcon(self):
102106
return QIcon(os.path.dirname(__file__) + "/../images/saga.png")

0 commit comments

Comments
 (0)
Please sign in to comment.