#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
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 ). 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
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
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