Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
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

Printemps des cartes 2024

#1 Tue 29 November 2016 11:40

Cerise45
Participant actif
Date d'inscription: 31 Aug 2011
Messages: 132

QGIS 2.14 & Python: itération sur entités sélectionnées uniquement

Bonjour à la communauté,

Je fais appel à vous car je suis bloquée (malgré mes recherches sur les forum en anglais) sur une action python qui semble pourtant toute bête... :

Je suis dans une première boucle (un shapefile de tous les Etats) et je fais une sélection dans ce shapefile des Etats pour récupérer l'identifiant correspondant à la 1ère entité de ce shapefile :

Code:

layer.startEditing()

for feat in layerEtats.getFeatures():
  id_etat = feat.attribute("ID")

  # une fois que j'ai récupéré cet état, je veux faire une sélection dans mon shapefile des unités administratives plus fines, ce que j'appelle "layer"
  expr1 = (u' "id_state" = \'')
  expr2 = id_etat
  expr3 = (u'\'')
  expr = str(expr1) + str(expr2) + str(expr3)
  selection = layer.getFeatures(QgsFeatureRequest().setFilterExpression(expr))
  ids = [i.id() for i in selection]
  layer.setSelectedFeatures(ids)

A ce stade, mes éléments (entités administratives plus fines dont l'Etat correspond au 1er dans la table attributaire du shapefile des Etats) se sélectionnent dans ma couche.

La deuxième étape est que je veux modifier les attributs de chacune de ces entités sélectionnées en itérant sur chacune d'entre elles....et c'est là que je bloque.

Je fais :

Code:

  for elem in layer.selectedFeatures():
    # calculs
    # blabla
    layer.changeAttributeValue(feat.id(),writefield,result)

Je dois donc avoir un problème sur la seconde itération (qui est pourtant à l'intérieur de ma 1ère boucle).

Le comportement de son script est étrange car il me modifie les valeurs des 70 premières unités administratives plus fines (soit exactement le nombre d'Etats...) et quand mon script bloque à la fin, j'ouvre ma table attributaire et ma sélection est pourtant bien faite.

--> le problème serait donc que le script arrive à sélectionner les entités mais il écrit sur tout le layer au lieu d'écrire uniquement sur les entités sélectionnées !


Si quelqu'un pouvait me débloquer... smile

Hors ligne

 

#2 Thu 01 December 2016 09:52

JD
Moderateur
Date d'inscription: 8 Aug 2013
Messages: 722

Re: QGIS 2.14 & Python: itération sur entités sélectionnées uniquement

Bonjour,

vous utilisez ce code en tant que script ou en tant qu'action ?

Pouvez vous poster l'ensemble de votre code ?
Et evenutellement une capture d'écran de vos 2 tables ?
Et enfin, ce que vous voulez faire exactement, car c'est difficile de comprendre ce que vous cherchez à faire.
Sinon quelques remarques, j'ai réécris vos 2 codes car certaines fonctions ne sont plus trop utilisées.


Code:

layer.startEditing()
for feat in layerEtats.getFeatures():
  id_etat = feat['ID']
  expr = u"id_state = '{}'".format(id_etat)
  selection = layer.getFeatures(QgsFeatureRequest().setFilterExpression(expr))
  ids = [i.id() for i in selection]
  layer.setSelectedFeatures(ids)

Code:

for elem in layer.selectedFeatures():
    # calculs
    # blabla
    elem['monchamps'] = ma_nouvelle_valeur
    layer.updateFeature(elem)

Dernière modification par lejedi76 (Thu 01 December 2016 09:53)

Hors ligne

 

#3 Mon 05 December 2016 15:32

Cerise45
Participant actif
Date d'inscription: 31 Aug 2011
Messages: 132

Re: QGIS 2.14 & Python: itération sur entités sélectionnées uniquement

Bonjour lejedi76,

Merci pour ces modifications simples que j'ai intégré et qui allègent la lecture de mon code.

Oui désolée ce n'est pas forcément très clair.. j'essaie de poster rapidement des explications plus limpides.

Hors ligne

 

Pied de page des forums

Powered by FluxBB