#1 Tue 25 June 2024 10:45
- pyjoubert
- Participant assidu
- Lieu: Lyon
- Date d'inscription: 21 Mar 2006
- Messages: 347
QGIS/Python: Mise a Jour d attributs sur couche SHP
Bonjour,
Je bataille depuis plusieurs jours ... en vain.
J'ai une couche shape d'objets ponctuels saisis en PYQGIS.
Leurs attributs existent, mais ils sont vide (NULL)
Je voudrais maintenent les renseigner, pour cela, je fais:
Code:
liste = [{'attribut': 'IDENT', 'valeur': 'CM_MDL_MC4_A_69152_99'}, {'attribut': 'INSEE', 'valeur': '69152'}] layer.startEditing() for elem in liste: idx = layer.dataProvider().fieldNameIndex(elem["attribut"]) if (idx > -1): obj.setAttribute(idx,elem["valeur"]) layer.updateFeature(obj) print(obj.attributes()) layer.commitChanges()
Tout semble fonctionner, le print(obj.attributes()) me renvoie bien la liste des attributs renseignés, mais lorsque je consulte mon objet, les attributs sont toujours à NULL
j'ai essayé d'utiliser par layer.dataProvider().changeAttributeValues, mais il faut passer par l'ID de l'objet, et je na sais pas si cela fonctionne pour du Shape (ll'id est tours du style -918000000000000
Bref, je suis coincé.
Si vous avez une idée, je suis preneur
Merci et bonne journée
PYJ
Hors ligne
#2 Tue 25 June 2024 12:52
- YoLecomte
- Participant assidu
- Lieu: Epinal
- Date d'inscription: 7 Jul 2015
- Messages: 266
Re: QGIS/Python: Mise a Jour d attributs sur couche SHP
Bonjour,
Il faudrait savoir comment vous obtenez la variable obj.
Voici un exemple de script qui montre la mise à jour sur des feature existantes dans la couche et la création de nouvelle feature. Ce script fonctionne dans la console python avec une couche shapefile contenant les attributs INSEE et IDENT. Ce doit être la couche active dans qgis.
Code:
layer = iface.activeLayer() # ce doit être votre shapefile liste = {'attribut': 'IDENT', 'valeur': 'CM_MDL_MC4_A_69152_99'}, {'attribut': 'INSEE', 'valeur': '00002'} with edit(layer): for obj in layer.getFeatures(): # on set les valeurs, une QgsFeature se comporte comme un dictionnaire donc on peut faire feat['champ'] = valeur for elem in liste: obj[elem['attribut']] = elem["valeur"] # on enregistre les modifs layer.updateFeature(obj) # Ici, on crée un nouvel objet dans la couche obj = QgsFeature() obj.setFields(layer.fields()) obj.setGeometry(QgsPoint(0,0)) for elem in liste: obj[elem['attribut']] = elem["valeur"] layer.addFeature(obj)
Hors ligne
#3 Tue 25 June 2024 14:52
- pyjoubert
- Participant assidu
- Lieu: Lyon
- Date d'inscription: 21 Mar 2006
- Messages: 347
Re: QGIS/Python: Mise a Jour d attributs sur couche SHP
En effet, obj ne contenait pas ce que je voulais initialement. Chose réglée
Par contre, pour que cela fonctionne, il a fallu que j’enlève le
Code:
with edit(layer):
et à la place, j'utilise
Code:
layer.startEditing()
Voici mon code final (il utiise nos foctions fédérales, mais leur nom est explicite.
Code:
def WBO_MODELE_RenseignerAttributsObjet(liste,obj,nomlayer): print(nomlayer) layer = GL_LAYER.WBO_LAYER_RecupererLayer(nomlayer) GL_LAYER.WBO_LAYER_MettreAuPremierPlan(layer) ret = GL_LAYER.WBO_LAYER_ActiverLayer(layer) layer.startEditing() for elem in liste: obj[elem["attribut"]] = elem["valeur"] layer.updateFeature(obj) layer.commitChanges()
Merci encore et bonn journée
PYJ
Hors ligne