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

Les inscriptions sont ouvertes !

#1 Thu 27 March 2025 23:08

Marcopololo
Participant actif
Date d'inscription: 23 Nov 2021
Messages: 70

QGIS: programme python affichage champ attribut sur clic

Bonjour,

En prenant comme exemple un tuto j'essaie d'afficher dans un champ type QLineEdit la valeur d'un champ de la couche active, en lien avec un click.

Code:

ef display_point(self, point, button):
        # Affiche les coordonnées du clic

        self.dlg.hide()  # cache la boite de dialogue
        coords = "{:.3f}, {:.3f}".format(point.x(), point.y())  ## formatage des coordonnées
        self.dlg.lineEdit.setText(coords)  # affichage des coordonnées
        self.dlg.NumParc.setText(coord2)  # affichage des infos du champ de la couche active
        self.dlg.LineTest.append("Test")
        self.dlg.show()  # affiche de nouveau la boite de dialogue

J'ai un code qui semble convenir mais mes compétences en python sont celles d'un débutant et j'ai du mal à insérer le code suivant à la place de la ligne ou se trouve NumParc. Le champ de la table attributaire que je veux afficher s'appelle  id

Code:

layer = iface.activeLayer()
layer.feature[id]

J'espère avoir été assez clair.
Merci de votre aide, Marcopololo

Hors ligne

 

#2 Sun 30 March 2025 18:04

Marcopololo
Participant actif
Date d'inscription: 23 Nov 2021
Messages: 70

Re: QGIS: programme python affichage champ attribut sur clic

Bonjour,

Je suis arrivé à afficher l'attribut d'un champ de ma couche "parcelles moyenmoutier".
Et j'ai plusieurs questions.
1. J'aurais aimé plutôt que de définir une couche précise, que le code s'applique à la couche active mais lorsque j’utilise

Code:

activeLayer()

cela ne fonctionne pas j'ai une erreur QgsProject' object has no attribute 'activeLayer'. a priori si j'ai bien compris c'est parce que activeLayer dépend de la class QgisInterface ?
2. J'ai tenté d'utilisé self.iface pour que se soit le id de la zone cliquée qui s'affiche et non pas le premier champ de la table ? Faut il rajouter un paramètre
dans def display_point ?

Merci d'avance de votre aide

Marcopololo

Code:

 def display_point(self, point, button):
        # Affiche les coordonnées du clic

        self.dlg.hide()  # cache la boite de dialogue
        coords = "{:.3f}, {:.3f}".format(point.x(), point.y())  ## formatage des coordonnées
        #coord2 = "{:.4f}, {:.4f}".format(point.x(), point.y())  ## formatage des coordonnées
        layer = self.iface.activeLayer()
        projet = QgsProject.instance()
        couches = projet.mapLayers()
        couchePAR = projet.mapLayersByName("parcelles moyenmoutier")[0]
        enregistrements = couchePAR.getFeatures()
        e = next(couchePAR.getFeatures())
        numP = e.attributes()[1]
        self.dlg.lineEdit.setText(coords)  # affichage des coordonnées
        self.dlg.NumParc.setText(numP)  # affichage id parcelle
        self.dlg.LineTest.append("Test")
        self.dlg.show()  # affiche de nouveau la boite de dialogue

Hors ligne

 

#3 Mon 31 March 2025 12:02

Marcopololo
Participant actif
Date d'inscription: 23 Nov 2021
Messages: 70

Re: QGIS: programme python affichage champ attribut sur clic

Bonjour,
Après de multiples recherches et d'un début apprentissage de python, j'ai enfin trouvé ce que je cherchais. Il me restera à récupérer les coordonnées sur un click. Par contre j'ai tout de même un soucis dans les tests effectués en console python. Ma couche pointDemo se créé bien ainsi que mon champ, mais la condition if avec within ne donne aucun résultat ? Es ce que cela peut être lié au type de couche geopackage ? J'ai testé avant d'utiliser la condition if et j'ai bien toute la liste de mes valeurs ?
J'ai essayé avec intersecs, contains et c'est j'ai le même soucis

Code:

projet = QgsProject.instance()
coucheParcelles = projet.mapLayersByName("parcelles moyenmoutier")[0]
entites = coucheParcelles.getFeatures()

#création point en mémoire
layer = QgsVectorLayer('Point?crs=epsg:4326&field=id:integer','pointDemo','memory')
pr = layer.dataProvider()
pointParc = QgsFeature()
pointParc.setGeometry(QgsGeometry.fromPointXY(QgsPointXY(48.3815098,6.9509046)))
pr.addFeatures([pointParc])
layer.updateExtents()
projet.addMapLayers([layer])
print(layer.sourceCrs())

#Recherche champ ou se trouve mon point
for e in entites:
    if pointParc.geometry().within(e.geometry()):
        print(e.attributes()[1])

Dernière modification par Marcopololo (Mon 31 March 2025 12:04)

Hors ligne

 

#4 Mon 31 March 2025 16:06

Marcopololo
Participant actif
Date d'inscription: 23 Nov 2021
Messages: 70

Re: QGIS: programme python affichage champ attribut sur clic

Bon, j'ai trouvé l'erreur, j'ai inversé les coordonnées X et Y.
Ca fonctionne. Maintenant reste à intégrer cela avec un click reccherche coordonnées

Hors ligne

 

#5 Mon 31 March 2025 23:34

Marcopololo
Participant actif
Date d'inscription: 23 Nov 2021
Messages: 70

Re: QGIS: programme python affichage champ attribut sur clic

Je continue avec mes questions. J'ai réussi à créer une première partie dans laquelle je récupère les coordonnées x et y que j'affiche dans un champ et la seconde partie ci dessus.
Quel code me permettrait de réinjecter ces coordonnées sur click dans la ligne ci dessous à la place des coordonnées statiques ?
Elles sont sous la forme suivante :

Code:

    def display_point(self, point, button):
        # Affiche les coordonnées du clic

        self.dlg.hide()  # cache la boite de dialogue
        coords = "{}, {}".format(point.x(), point.y())  ## formatage des coordonnées

Code partie coordonnées statiques :

Code:

pointParc.setGeometry(QgsGeometry.fromPointXY(QgsPointXY(48.3815098,6.9509046)))

Merci d'avance de votre aide

Hors ligne

 

#6 Tue 01 April 2025 07:26

Benoit D
Participant assidu
Date d'inscription: 17 Jul 2018
Messages: 158

Re: QGIS: programme python affichage champ attribut sur clic

Ne vous découragez pas si vous n’avez pas de réponse c’est peut-être un peu loin de nos expériences ou dans une période où les uns et les autres ne disposent peut-on pas de temps. et merci de nous faire partager votre cheminement.
En espérant que vous trouverez.

Je ne suis pas sûr d’avoir compris. Vous voulez utiliser les coordonnées cliquées pour les enregistrer dans votre couche d’entités ? Avez-vous essayé

Code:

 pointParc.setGeometry(QgsGeometry.fromPointXY(QgsPointXY(point.x(),point.y())))

Hors ligne

 

#7 Tue 01 April 2025 08:42

Marcopololo
Participant actif
Date d'inscription: 23 Nov 2021
Messages: 70

Re: QGIS: programme python affichage champ attribut sur clic

Bonjour,
Merci de votre réponse. J'avance tout doucement et ce n'est pas en me mâchant tout le travail que je vais comprendre.
en fait je souhaite réutiliser les coordonnées cliquées pour afficher la valeur du champ id de ma parcelle. Pour l'instant je n'y arrive qu'en mettant une coordonnées statique.
Je cherche une fonction qui me permettrait de remplacer les coordonnées fixes dans mon code par une fonction. Peut-être aspoint ?

Hors ligne

 

#8 Tue 01 April 2025 11:46

Marcopololo
Participant actif
Date d'inscription: 23 Nov 2021
Messages: 70

Re: QGIS: programme python affichage champ attribut sur clic

Je suis arrivé en utilisant dans la console

Code:

print(pointParc.geometry().asPoint())

à afficher les coordonnées, mais je n'arrive pas à l'écrire dans un QLineEdit d'e ma boite de dialogue ?
Merci de votre aide

Hors ligne

 

#9 Aujourd'hui 09:28

Marcopololo
Participant actif
Date d'inscription: 23 Nov 2021
Messages: 70

Re: QGIS: programme python affichage champ attribut sur clic

Je pense que je me rapproche de la solution (avec de nombreuses approximations de codage, mais je ne vois pas comment rendre lisible mes coordonnées, j'ai une erreur "AttributeError: 'QgsPointXY' object has no attribute 'setGeometry"

Code:

class CoordClick:
    """QGIS Plugin Implementation."""

    def display_point(self, point, button):
        # Affiche les coordonnées du clic

        #Instances recherche id parcelle

        projet = QgsProject.instance()
        coucheParcelles = projet.mapLayersByName("parcelles moyenmoutier")[0]
        entites = coucheParcelles.getFeatures()

        self.dlg.hide()  # cache la boite de dialogue

        coords = "{}, {}".format(point.x(), point.y())  ## formatage des coordonnées
        pc = QgsGeometry.fromPointXY(QgsPointXY(point.x(), point.y()))
        point.setGeometry(pc)
        # Affichage point et numéro parcelle correpondante
        self.dlg.coordClick.setText(coords)  # affichage des coordonnées dans la boite de dialogue
        print(coords)
        #Recherche id parcelle correspondant aux coordonnées
        for e in entites:
            if point.geometry().within(e.geometry()):
                print(e.attributes()[1])  # affiche l'attribut id
                       
        
        self.dlg.show()  # affiche de nouveau la boite de dialogue

Pourtant si je remplace par une coordonnée statique cela fonctionne :

Code:

point.setGeometry(QgsGeometry.fromPointXY(QgsPointXY(6.9509046,48.3815098)))

Dernière modification par Marcopololo (Aujourd'hui 09:32)

Hors ligne

 

#10 Aujourd'hui 10:27

Gabi63
Juste Inscrit !
Date d'inscription: 3 Apr 2016
Messages: 8

Re: QGIS: programme python affichage champ attribut sur clic

Bonjour,

Je ne suis pas sur de comprendre ce que vous voulez.

De ce que je comprends vous voulez :

- Cliquer sur une géométrie de la couche active dans le canvas ;
- Que le champ id de la géométrie s'affiche dans un bandeau ou dans une fenêtre pop-up ?

Ou vous voulez éditer un champ de manière interactive lorsque vous cliquez sur une entité ?

Cordialement.

Hors ligne

 

#11 Aujourd'hui 11:32

Marcopololo
Participant actif
Date d'inscription: 23 Nov 2021
Messages: 70

Re: QGIS: programme python affichage champ attribut sur clic

Bonjour,
Lorsque je clique sur une zone géométrique je souhaite récupérer le champ id associé à ma couche active et l'afficher dans ma boite de dialogue où j'ai déjà affiché mes coordonnées.
Marcopololo

Hors ligne

 

Pied de page des forums

Copyright Association GeoRezo