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

Rencontres QGIS 2025

L'appel à participation est ouvert jusqu'au 19 janvier 2025!

#1 Fri 31 October 2014 10:20

kathy_cano
Participant occasionnel
Date d'inscription: 3 Jul 2014
Messages: 14

QGIS 2.4 & PYTHON : créer un nouveau champ et l'alimenter

Bonjour,

Alors voilà l'histoire, j'utilise un Pocket PC me permettant de saisir des objets sur le terrain (désordres sur digue) et de prendre une photo.
Le nom de cette photo s'enregistre dans la table attributaire de l'objet dans le champ E_PHOTO sous la forme NOMDELACOUCHE_123.JPG.
La photo et le fichier SHP s'enregistre sur la carte SD de l'appareil.

Avec un .BAT j'effectue la copie de ces fichiers sur mon disque dur dans différents dossiers. Les photos se retrouvent donc dans un dossier PHOTOS là où sera enregistré mon projet QGIS.

Dans QGIS justement, j'utilise des formulaires QT que j'ai créé pour avoir une interface de consultation pour les non-sigistes. Ces zones QT sont alimentées par le nom des champs. Et la zone pour ma photo nécessite le chemin entier vers la photo pour l'afficher. Or je n'ai que qu'un champ avec le nom du fichier .JPG

Ça c'est l'état initial.

Ma question est : est-ce qu'avec Python je peux créer un nouveau champ et ensuite faire en sorte de concaténer le chemin + le nom de la photo ?

J'ai essayé pour le moment ceci :
1. Pour récupérer le chemin entier
proj = QgsProject.instance()
urfile = proj.homePath()
path = urfile+"/PHOTOS/"+"[% "E_PHOTO" %]"

2. Pour créer un nouveau champ CHEMIN
from PyQt4.QtCore import *
from qgis.core import *
layer= qgis.utils.iface.activeLayer()
pr = layer.dataProvider()
layer.startEditing()
pr.addAttributes([QgsField("CHEMIN", QVariant.String)])
True

3. Pour alimenter le nouveau champ
fet = QgsFeature()
layer.changeAttributeValue(feature.id(), 17, QtCore.QVariant(value))
layer.commitChanges()

Je rencontre plusieurs erreurs :
Pour le 1. ça ne marche évidemment pas dans la console, mais avec un startfile dans ACTIONS ça ouvre bien la photo donc le chemin est correct. Je ne sais pas du coup comment intégrer ce code dans un plugin pour que l'utilisateur ai juste à cliquer sur un bouton pour lancer le "calcul" du chemin.

Pour le 2. malgré l'utilisation de startEditing() et de commitChanges(), la couche ne se met pas à jour et on est obligé de mettre nous même en mode édition. D'où ça peut venir ?

Pour le 3. je ne vois pas trop quoi mettre dans chacune des valeurs demandées... J'ai essayé avec un layer.changeAttributeValue(fet.id(), 21, "HELLO WORLD") et j'ai obtenu une seule ligne de changée. Il faut l'inclure dans un FOR ? Ou c'est moi qui m'y prend vraiment mal ?


Voilà désolé pour le pavé et bravo à ceux qui sont arrivés jusqu'ici.

Je débute en PyQgis donc vraiment merci d'avance pour l'aide précieuse que vous me fournirez.

C.K.

Dernière modification par kathy_cano (Fri 31 October 2014 11:24)

Hors ligne

 

#2 Fri 31 October 2014 15:52

kathy_cano
Participant occasionnel
Date d'inscription: 3 Jul 2014
Messages: 14

Re: QGIS 2.4 & PYTHON : créer un nouveau champ et l'alimenter

OUBLIEZ TOUT CE QU'IL Y A AU DESSUS !!
J'ai amélioré (beaucoup) le code et ça fonctionne mais uniquement dans la console et sans récupérer la valeur du champ E_PHOTO :

#boucler dans toutes les couches actives
canvas = qgis.utils.iface.mapCanvas()
allLayers = canvas.layers()
for i in allLayers:

                #créer le chemin
                proj = QgsProject.instance()
                urfile = proj.homePath()
                path = urfile+"/PHOTOS/"+"PLOP"
                #à la place de PLOP il faudrait [% "E_PHOTO" %] mais dans la console ça ne marche pas.
 
                #créer le nouveau champ
                from PyQt4.QtCore import *
                from qgis.core import *
                layer= qgis.utils.iface.activeLayer()
                pr = layer.dataProvider()
                layer.startEditing()
                pr.addAttributes([QgsField("CHEMIN", QVariant.String)])
                layer.commitChanges()

                #modifier le contenu de chaque ligne du nouveau champ
                layer.startEditing()
                index=pr.fieldNameIndex("CHEMIN")
                for elem in layer.getFeatures() :
                                layer.changeAttributesValue(elem.id(), index, path)
                layer.commitChanges()
                # le 2 correspond à la position du champ sachant qu'il existe ID(0), E_PHOTO(1) et CHEMIN(2)


Ma question est donc désormais la suivante :
- comment rendre ce code opérationnel dans un plugin ? quoi modifier ?
C'est à dire en récupérant bien l'attribut contenu dans le champ E_PHOTO et en se lançant sans erreur depuis un bouton (extension Plugin Builder ?), voire à l'ouverture du projet ?

Hors ligne

 

Pied de page des forums

Powered by FluxBB