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 05 April 2024 15:31

PaulDALLES
Juste Inscrit !
Date d'inscription: 8 Mar 2023
Messages: 4

QField: Joindre des attributs par localisation

Bonjour,

Je suis forestier et j'aimerais traiter des données que je numériquement sur le terrain à l'aide de QField.

J'ai créer un outils très simple pour la rédaction de documents de gestion durables sur QGis.
Pour gagner du temps j'ai créer un projet pour QField mais au lieu d'avoir une couche "Polygone" je l'ai mis sous forme de point.
Ma couche polygone a les mêmes champs que ma couche point.

J'aimerais pouvoir faire en sorte qu'une fois mes polygones tracés, je puisse leur attribuer les attribut des points qui leurs correspondent.

Je ne sais pas si c'est assez claire mais je me ferais un plaisir de répondre à vos questions pour essayer de trouver une solution.

Merci d'avance, Paul

Hors ligne

 

#2 Fri 05 April 2024 16:05

bbk9
Participant occasionnel
Date d'inscription: 7 Jan 2022
Messages: 24

Re: QField: Joindre des attributs par localisation

tu peux créer une relation entre ta couche point (mere) et ta couche polygone (fille) et aller chercher l’identifiant avec  array_first(overlay_nearest('couche_mere',"id_couche_mere")) comme valeur par défaut

overlay_nearest peut être remplacé par overlay_contains ou overlay_within, selon comment tu veux procéder

EDIT : sans faire de relation d’ailleurs, tu peux récupérer comme valeur par défaut pour chacun des champs de ta couche polyg :
array_first(overlay_nearest('couche_point', "nom_du_champ_dans_la_couche_mere"))

Dernière modification par bbk9 (Fri 05 April 2024 19:22)

Hors ligne

 

#3 Mon 08 April 2024 08:15

PaulDALLES
Juste Inscrit !
Date d'inscription: 8 Mar 2023
Messages: 4

Re: QField: Joindre des attributs par localisation

bbk9 a écrit:

tu peux créer une relation entre ta couche point (mere) et ta couche polygone (fille) et aller chercher l’identifiant avec  array_first(overlay_nearest('couche_mere',"id_couche_mere")) comme valeur par défaut

overlay_nearest peut être remplacé par overlay_contains ou overlay_within, selon comment tu veux procéder

EDIT : sans faire de relation d’ailleurs, tu peux récupérer comme valeur par défaut pour chacun des champs de ta couche polyg :
array_first(overlay_nearest('couche_point', "nom_du_champ_dans_la_couche_mere"))


Bonjour bbk9,

Merci pour ta réponse rapide. N'y a-t-il pas un moyen de créer un script ou une petite extention Qgis qui ferait cela ? Car j'aimerais toujours avoir accès à mon formulaire pour modifier mes peuplements après l'export pour affiner au mieux mon travail.

Car enfaite ma couche polygone a déjà un formulaire d'attribut identique à la couche point (ma couche point qui, je précise est mon export qfield). Ma couche polygone est sur un projet de création de document de gestion durable et permet au technicien de créer son document de gestion sans avoir fait le travail terrain avec Qfield mais au papier. (Il ne faudrait pas que je les brusques :') ).

Le fait de pouvoir donner rapidement les attributs de ma couche point à ma couche polygone serait le second moyen de renseigner cette couche.

Le problème est que, mes connaissances Qgis je les acquières grâce à des tutos ou des forum ce qui me bride dans ma progression de création de cette outil pour mon entreprise et malheureusement nous n'avons pas de cartographe (ou heureusement car j'aime vraiment faire ça wink ). Donc désolé si je mets un peu de temps à comprendre ce que l'on peut me dire ou si je demande des choses ubuesques.

PS : Je peux fournir des captures d'écran si besoin, pour permettre un meilleur compréhension de mon projet (encore faut-il que je trouve comment joindre une PJ)

Bonne journée

Dernière modification par PaulDALLES (Mon 08 April 2024 09:06)

Hors ligne

 

#4 Mon 08 April 2024 16:49

PaulDALLES
Juste Inscrit !
Date d'inscription: 8 Mar 2023
Messages: 4

Re: QField: Joindre des attributs par localisation

Re-bonjour smile

Je pense avoir réussi a faire quelque chose via un script (je me suis aidé de ChatGPT pour la création de ce script).

Je vous le met ci dessous :

Code:

from qgis.core import QgsProject, QgsWkbTypes
from PyQt5.QtWidgets import QMessageBox, QInputDialog

# Fonction pour transférer les attributs des points contenus dans les polygones vers les polygones
def transfer_attributes(point_layer, poly_layer):
    # Vérifier si la couche de points est de type vectoriel
    if point_layer.type() != QgsMapLayer.VectorLayer:
        QMessageBox.warning(None, "Avertissement", "La couche sélectionnée n'est pas une couche vectorielle.")
        return
    
    # Vérifier si la couche de polygones est de type vectoriel
    if poly_layer.type() != QgsMapLayer.VectorLayer:
        QMessageBox.warning(None, "Avertissement", "La couche sélectionnée n'est pas une couche vectorielle.")
        return
    
    # Créer une liste des noms des champs de la couche de points
    point_fields = [field.name() for field in point_layer.fields()]
    
    # Créer une liste des noms des champs de la couche de polygones
    poly_fields = [field.name() for field in poly_layer.fields()]
    
    print("Champs de la couche de points :", point_fields)
    print("Champs de la couche de polygones :", poly_fields)
    
    # Créer un dictionnaire pour stocker les valeurs des attributs des points contenus dans les polygones
    contained_point_attributes = {}
    
    # Parcourir les entités de la couche de polygones
    for poly_feature in poly_layer.getFeatures():
        # Récupérer la géométrie du polygone
        poly_geom = poly_feature.geometry()
        
        # Créer une liste pour stocker les attributs des points contenus dans le polygone
        points_in_poly_attributes = []
        
        # Parcourir les entités de la couche de points
        for point_feature in point_layer.getFeatures():
            # Vérifier si le point est contenu dans le polygone
            if poly_geom.contains(point_feature.geometry()):
                points_in_poly_attributes.append(point_feature.attributes())
        
        # Stocker les attributs des points contenus dans le polygone dans le dictionnaire
        contained_point_attributes[poly_feature.id()] = points_in_poly_attributes
    
    print("Attributs des points contenus dans les polygones :", contained_point_attributes)
    
    # Mettre à jour les attributs des polygones avec les valeurs des attributs des points contenus dans les polygones
    poly_layer.startEditing()
    for poly_feature in poly_layer.getFeatures():
        if poly_feature.id() in contained_point_attributes:
            attributes_list = contained_point_attributes[poly_feature.id()]
            if attributes_list:
                attributes = attributes_list[0]  # Utiliser les attributs du premier point contenu dans le polygone
                print(f"Attributs du polygone ({poly_feature.id()}): {attributes}")
                for field in point_fields:
                    if field in poly_fields:  # Vérifier si le champ existe dans la couche de polygones
                        value = attributes[point_fields.index(field)]
                        poly_layer.changeAttributeValue(poly_feature.id(), poly_fields.index(field), value)
                    else:
                        print(f"Le champ '{field}' de la couche de points n'existe pas dans la couche de polygones.")
    
    # Sauvegarder les modifications et arrêter l'édition
    poly_layer.commitChanges()
    poly_layer.triggerRepaint()
    QMessageBox.information(None, "Succès", "Transfert des attributs terminé avec succès.")

# Récupérer les couches actuellement ouvertes dans le projet
root = QgsProject.instance().layerTreeRoot()
layer_groups = root.children()

# Créer une liste des noms des groupes de couches
group_names = [group.name() for group in layer_groups if isinstance(group, QgsLayerTreeGroup)]

# Demander à l'utilisateur de choisir un groupe de couches pour les points
selected_point_group_name, ok = QInputDialog.getItem(None, "Sélectionner un groupe de couches pour les points", "Groupe de couches pour les points :", group_names, 0, False)

if ok:
    # Récupérer le groupe de couches sélectionné pour les points
    selected_point_group_index = group_names.index(selected_point_group_name)
    selected_point_group = layer_groups[selected_point_group_index]
    
    # Créer une liste des couches de points dans le groupe sélectionné
    point_layers = [child.layer() for child in selected_point_group.children() if isinstance(child, QgsLayerTreeLayer) and child.layer().geometryType() == QgsWkbTypes.PointGeometry]
    
    # Vérifier s'il y a des couches de points dans le groupe sélectionné
    if not point_layers:
        QMessageBox.warning(None, "Avertissement", "Aucune couche de points dans le groupe sélectionné.")
    else:
        # Demander à l'utilisateur de choisir la couche de points
        point_layer_names = [layer.name() for layer in point_layers]
        selected_point_layer_name, ok = QInputDialog.getItem(None, "Sélectionner la couche de points", "Couche de points :", point_layer_names, 0, False)
        
        if ok:
            # Récupérer la couche de points sélectionnée
            selected_point_layer_index = point_layer_names.index(selected_point_layer_name)
            selected_point_layer = point_layers[selected_point_layer_index]
            
            # Demander à l'utilisateur de choisir un groupe de couches pour les polygones
            selected_poly_group_name, ok = QInputDialog.getItem(None, "Sélectionner un groupe de couches pour les polygones", "Groupe de couches pour les polygones :", group_names, 0, False)
            
            if ok:
                # Récupérer le groupe de couches sélectionné pour les polygones
                selected_poly_group_index = group_names.index(selected_poly_group_name)
                selected_poly_group = layer_groups[selected_poly_group_index]
                
                # Créer une liste des couches de polygones dans le groupe sélectionné
                poly_layers = [child.layer() for child in selected_poly_group.children() if isinstance(child, QgsLayerTreeLayer) and child.layer().geometryType() == QgsWkbTypes.PolygonGeometry]
                
                # Vérifier s'il y a des couches de polygones dans le groupe sélectionné
                if not poly_layers:
                    QMessageBox.warning(None, "Avertissement", "Aucune couche de polygones dans le groupe sélectionné.")
                else:
                    # Demander à l'utilisateur de choisir la couche de polygones
                    poly_layer_names = [layer.name() for layer in poly_layers]
                    selected_poly_layer_name, ok = QInputDialog.getItem(None, "Sélectionner la couche de polygones", "Couche de polygones :", poly_layer_names, 0, False)
                    
                    if ok:
                        # Récupérer la couche de polygones sélectionnée
                        selected_poly_layer_index = poly_layer_names.index(selected_poly_layer_name)
                        selected_poly_layer = poly_layers[selected_poly_layer_index]
                        
                        # Appeler la fonction pour transférer les attributs
                        transfer_attributes(selected_point_layer, selected_poly_layer)

Voila wink

Bonne fin de journée

Hors ligne

 

#5 Mon 08 April 2024 20:02

bbk9
Participant occasionnel
Date d'inscription: 7 Jan 2022
Messages: 24

Re: QField: Joindre des attributs par localisation

Essayez peut-être de reformuler votre demande, en quelques points clairs, je ne suis finalement pas si sûr d’avoir compris ce que vous voulez.
Dans tous les cas si vous cherchez à joindre spatialement des éléments, que ce soit à la saisie sur qfield (avec les fonctions que je vous ai présenté) ou depuis qgis directement (avec des jointures spatiales), des outils existent déjà dans QGis sans chercher à réinventer la roue.

Personnellement je ne touche pas à PyQGis.

Hors ligne

 

Pied de page des forums

Powered by FluxBB