Bonjour à Toutes et à Tous,
Je me permets de vous contacter pour une demande en Python PyQGIS :
Je cherche à mettre à jour, en Python 2.7 pour QGIS 2.18 Las Palmas, un champ existant ( "ETIQUETTE") d'une table attributaire en fonction d'un autre champ ("MODE_ADDUC"), c'est-à-dire l'équivalent d'un CASE WHEN .... THEN .... ELSE ..... END en langage SQL.
-----------------------------------------------------------------
J'ai testé le code suivant en utilisant une condition if .....elif .......else (au lieu du CASE WHEN du langage SQL) :
mais la console Python me retourne
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 #TEST : mettre à jour un champ existant avec boucle from PyQt4.QtCore import * from qgis.core import * vl = iface.activeLayer() vl.startEditing() #step 1 vl.updateFields() idx = vl.dataProvider().fieldNameIndex( 'ETIQUETTE' ) adduc = vl.dataProvider().fieldNameIndex( 'MODE_ADDUC' ) #step 2 for f in vl.getFeatures(): if f[adduc] == 'AERIEN': f[idx] = 'CIEL' elif f[adduc] == 'FACADE': f[idx] = 'MUR' elif f[adduc] == 'SOUTERRAIN': f[idx] = 'TERRE' else: f[idx] = 'RIEN' vl.updateFeature( f ) vl.commitChanges()
Pouvez-vous m'aider ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 Traceback (most recent call last): File "<input>", line 2, in <module> KeyError: '-1'
-----------------------------------------------------------------
Pour info :
Le même type de code fonctionne, mais sans la condition if .... elif .... else :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 #mettre à jour un champ existant from PyQt4.QtCore import QVariant from qgis.core import QgsField, QgsExpression, QgsFeature vl = iface.activeLayer() vl.startEditing() #step 1 vl.updateFields() idx = vl.fieldNameIndex( 'ETIQUETTE' ) #step 2 for f in vl.getFeatures(): f[idx] = 'ETIQPHIL' vl.updateFeature( f ) vl.commitChanges()
En pièce Jointe : le Shapefile zippé "test_adresses.zip" contenant les champs mentionnés dans mes précédents exemples.
En vous remerciant par avance,
Philippe Schitter
Partager