banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

GEODATA DAYS 2024

#1 Tue 25 June 2024 10:45

pyjoubert
Participant assidu
Lieu: Lyon
Date d'inscription: 21 Mar 2006
Messages: 343

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: 253

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: 343

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

 

Pied de page des forums

Powered by FluxBB