#1 Thu 29 October 2020 16:22
- Carolus
- Juste Inscrit !
- Date d'inscription: 5 Oct 2020
- Messages: 8
QGIS 3.14: Points aux extremites d une Polyligne
Bonjour,
Voici ma demande. Je dispose de deux couches. Tout d'abord une couche de polylignes ("Segments"). Ensuite une couche de points ("Noeuds"), ces points correspondent aux extrémités de ces polylignes.
Dans ma couche de polylignes, j'ai deux champs ("Départ" et "Fin") que je voudrais remplir avec le premier champ de ma couche de points.
Voici un schéma qui résume ma demande
[img]https://nsa40.casimages.com/img/2020/10/29/201029042252153313.png[/img]
Je vous remercie pour vos suggestions.
Hors ligne
#2 Fri 06 November 2020 13:56
- aheurion
- Participant actif
- Lieu: NANTES
- Date d'inscription: 8 Oct 2020
- Messages: 141
Re: QGIS 3.14: Points aux extremites d une Polyligne
Bonjour,
Je te conseillerai d'utiliser la fonction aggregate qui va récupérer les informations de ta couche de points vers ta couche de lignes, et dans les conditions tu utilises la condition intersects entre la géométrie du point et des extrémités de tes lignes. Pour cela tu rentres l'expression suivante dans ta calculatrice de champs (pour le champ "Départ") :
aggregate(
'id_couche_ligne', /*à récupérer dans le menu 'couches' de la calculatrice de champs*/
'concatenate_unique',
"ID_NOEUD", /*le nom du champ de ta couche noeud que tu veux mettre dans tes champs départ et fin*/
intersects(start_point($geometry),geometry(@parent)), /*ici la condition qui indique la superposition entre tes noeuds et l'extrémité "départ" de tes lignes*/
','
)
pour l'extrémité "fin" de tes lignes, il faut utiliser end_point à la place de start_point
Hors ligne
#3 Fri 06 November 2020 14:48
- GlaDal
- Participant assidu
- Date d'inscription: 30 Aug 2013
- Messages: 1024
Re: QGIS 3.14: Points aux extremites d une Polyligne
Bonjour,
Dans la version 3.16 de Qgis, il existe de nouvelles fonctions d'intersection entre couches :https://ubuntu.qgis.org/fr/site/foruser … ns-to-core
Hors ligne
#4 Tue 10 November 2020 11:33
- insay
- Participant occasionnel
- Date d'inscription: 23 Mar 2018
- Messages: 25
Re: QGIS 3.14: Points aux extremites d une Polyligne
Bonjour,
J'ai la même demande que Carolus, Aheurion j'ai essayé la formule mais il me dit qu'il ne peut pas calculer l'aggrégat pour la couche point.
Est ce que tu pourrais me venir en aide s'il te plait ?
Voici ce que j'ai fait :
"aggregate('12_FO_04aa8780_8d6e_4cf7_95e9_9a89277b76cd','concatenate_unique',
"nom",intersects(start_point($geometry),geometry(@parent)),',')"
Ma couche ligne a pour identifiant "12_FO_04aa8780_8d6e_4cf7_95e9_9a89277b76cd" et ma couche point s'appelle BPE avec le champ que j'aimerai récupérer qui se nomme "nom".
J'ai essayé de modifié en remplaçant l'identifiant de la couche ligne par ma couche point, je n'ai plus d'erreur mais rien ne se passe
Dernière modification par insay (Thu 12 November 2020 11:59)
Hors ligne
#5 Thu 12 November 2020 12:01
- insay
- Participant occasionnel
- Date d'inscription: 23 Mar 2018
- Messages: 25
Re: QGIS 3.14: Points aux extremites d une Polyligne
ah oui pour info je travaille sur la version LTR (3.10.11)
Hors ligne
#6 Thu 12 November 2020 15:42
- SANTANNA
- Moderateur
- Lieu: Angers
- Date d'inscription: 18 Jan 2008
- Messages: 3884
Re: QGIS 3.14: Points aux extremites d une Polyligne
Bonjour,
j'ai essayé la formule mais il me dit qu'il ne peut pas calculer l'aggrégat pour la couche point.
C'est parce que le champ duquel vous souhaitez récupérer l'info ("nom") doit appartenir à la couche mis en paramètre ('12_FO_04aa8780_8d6e_4cf7_95e9_9a89277b76cd'). Or il me semble que ce champ appartient à la couche point BPE et que vous indiquez la couche ligne. Remplacez par l'ID de la couche point pour voir. Et c'est sur la couche ligne qu'il vous faut vous mettre pour saisir la formule, étant donné que c'est dans elle que vous souhaitez rajouter les infos.
J'ai aussi un doute sur le filtre. Si ça ne marche pas, essayez intersects($geometry, start_point(geometry(@parent))) même si je n'aime pas trop les intersections entre points.
Hors ligne
#7 Thu 12 November 2020 18:30
- insay
- Participant occasionnel
- Date d'inscription: 23 Mar 2018
- Messages: 25
Re: QGIS 3.14: Points aux extremites d une Polyligne
Bonsoir Santanna,
Alors ca fonctionne il manquait le "$geometry" en premier paramètre, pas pour tous, mais la je sais pourquoi.
Dans mon boulot ils gèrent depuis 8 ans un réseau régional avec un simple KML, j'ai intégrer tout leur point et tracé en SHP mais je dois refaire au propre les tracé pour qu'ils commencent ou se termine sur un point, j'ai a peu prés 1500 tracés a retravailler ^^
En tout cas un grand merci a toi pour ton aide, ca m'est très utile, mille fois merci
Hors ligne
#8 Mon 16 November 2020 20:57
- sylvain poupard
- Participant assidu
- Date d'inscription: 19 Mar 2009
- Messages: 362
Re: QGIS 3.14: Points aux extremites d une Polyligne
Bonjour,
je dois refaire au propre les tracé pour qu'ils commencent ou se termine sur un point
Vous pouvez essayer "Accrocher les géométries à la couche" (snap) dans la boite à outils de traitement.
Bon courage
Hors ligne
#9 Tue 17 November 2020 15:54
- insay
- Participant occasionnel
- Date d'inscription: 23 Mar 2018
- Messages: 25
Re: QGIS 3.14: Points aux extremites d une Polyligne
Hello j'ai regardé cette option mais malheureusement ca ne donne pas l'effet escompté.
Les données sur lequel je travail sont issues de tracé fait a l'arrache sur google earth au format KML que j'ai transposé au format SHP ( pour y mettre des infos supplémentaires genre le nom du client, adresse, bon de commande etc...) mais merci quand même pour l'astuce
Hors ligne
#10 Wed 18 November 2020 10:09
- sylvain poupard
- Participant assidu
- Date d'inscription: 19 Mar 2009
- Messages: 362
Re: QGIS 3.14: Points aux extremites d une Polyligne
ca ne donne pas l'effet escompté.
Avez-vous bien pris connaissance des options situées dans le paramètre "comportement" et notamment celle nommée "Déplacer les points terminaux uniquement[..]"?
Hors ligne
#11 Wed 31 March 2021 10:09
- Col A
- Participant occasionnel
- Date d'inscription: 13 Mar 2015
- Messages: 18
Re: QGIS 3.14: Points aux extremites d une Polyligne
Bonjour à tous,
Je réactive ce post car j'ai la même problématique que Carolus.
Je dispose d'une couche polyligne "link" et d'une couche de noeuds "node". Les points de la couche node sont les extrémités de la couche link.
Dans la couche link, j'ai 2 champs : amont et aval que je souhaite remplir avec le champs id de la couche node.
Avec vos conseils, à l'aide la calculatrice de champs, je renseigne dans le champs "amont" de ma couche de polyligne l'expression suivante :
aggregate('node_e2bb8aa3_2129_4a94_a748_34d248b73976', 'concatenate_unique',"id",intersects(geometry('node_e2bb8aa3_2129_4a94_a748_34d248b73976'), start_point( $geometry )))
L'erreur suivante apparait :
Une erreur s'est produite lors de l'évaluation de la chaîne de calcul:
Impossible de calculer l'aggrégat pour: id
Avez vous une idée d'où peut provenir l'erreur ?
Je vous remercie pour vos suggestions !
Hors ligne
#12 Wed 31 March 2021 10:14
- GlaDal
- Participant assidu
- Date d'inscription: 30 Aug 2013
- Messages: 1024
Re: QGIS 3.14: Points aux extremites d une Polyligne
Bonjour avez-vous essayer de le faire sans le nom barbare de la couche :
Code:
aggregate('node', 'concatenate_unique',"id",intersects(geometry('node'), start_point( $geometry )))
ou le faire avec la fonction 'max' ?
Hors ligne
#13 Wed 31 March 2021 10:22
- Col A
- Participant occasionnel
- Date d'inscription: 13 Mar 2015
- Messages: 18
Re: QGIS 3.14: Points aux extremites d une Polyligne
Merci pour votre réponse,
1) sans le nom barbare, j'ai tjs la meme erreur
2) le calcul se lance, mais il ne se passe rien => mon champs "amont" reste NULL
Hors ligne
#14 Wed 31 March 2021 10:41
- GlaDal
- Participant assidu
- Date d'inscription: 30 Aug 2013
- Messages: 1024
Re: QGIS 3.14: Points aux extremites d une Polyligne
Essaye ça :
Code:
aggregate( layer:= 'node', aggregate:='max', expression:="id", filter:=intersects(buffer($geometry,0.05), start_point(geometry(@parent)) ) )
Hors ligne
#15 Wed 31 March 2021 10:50
- Col A
- Participant occasionnel
- Date d'inscription: 13 Mar 2015
- Messages: 18
Re: QGIS 3.14: Points aux extremites d une Polyligne
SUPER ça fonctionne !
MERCI BEAUCOUP
Afin de comprendre, on utilise buffer pour chercher le node dans un rayon de recherche afin de maximiser nos chance de l'intersecter ?
Dernière modification par Col A (Wed 31 March 2021 10:50)
Hors ligne
#16 Wed 31 March 2021 11:13
- GlaDal
- Participant assidu
- Date d'inscription: 30 Aug 2013
- Messages: 1024
Re: QGIS 3.14: Points aux extremites d une Polyligne
c'est exactement ça ! ;-)
Hors ligne
#17 Wed 31 March 2021 11:14
- SANTANNA
- Moderateur
- Lieu: Angers
- Date d'inscription: 18 Jan 2008
- Messages: 3884
Re: QGIS 3.14: Points aux extremites d une Polyligne
Bonjour,
Je pense que, plus que le buffer qui effectivement permet de contourner des imprécisions d'accrochage, c'est l'utilisation de @parent qui est la clé; elle permet de faire référence à la couche sur laquelle vous êtes (et donc récupérer le point d'origine de l'entité linéaire courante)
Hors ligne
#18 Mon 19 July 2021 17:02
- trynalearn
- Juste Inscrit !
- Date d'inscription: 19 Jul 2021
- Messages: 9
Re: QGIS 3.14: Points aux extremites d une Polyligne
Bonjour,
Je me permets de faire vivre le sujet pour demander quelque chose. En essayant la solution de GlaDal, durant la création d'une entité de type ligne, celle-ci n'accroche que s'il y a, au préalable, une autre ligne pour accrocher à son start/end_point, l'expression en tant que telle fonctionne parfaitement, mais l'absence de snapping (surtout que c'est destiné à l'usage pour QField) rend la chose assez problématique
edit: je m'excuse pour le déterrage de post sans raison, il s'avère que j'avais juste à bien prendre le bon mode d'accrochage.
Dernière modification par trynalearn (Mon 19 July 2021 22:00)
Hors ligne
#19 Tue 20 July 2021 12:57
- insay
- Participant occasionnel
- Date d'inscription: 23 Mar 2018
- Messages: 25
Re: QGIS 3.14: Points aux extremites d une Polyligne
Bonjour à tous,
Je reviens sur le sujet pour avoir une petite précision si possible.
J'aimerai obtenir la même chose mais avec 2 couches de points différentes, en gros je veux savoir si ma couche de ligne touche bien une des 2 couches points que j'ai sur mon projet.
Initialement j'utilisais ce code :
aggregate
('Couche_Point_1',
'concatenate_unique'
,"Attribut_couche_point_1",
intersects
(buffer
($geometry, 0.000005),
end_point
(geometry(@parent))))
J'ai essayé de bidouiller a ma facon en faisant ceci :
aggregate
('Couche_Point_1',
'concatenate_unique'
,"Attribut_couche_point_1",
intersects
(buffer
($geometry, 0.000005),
end_point
(geometry(@parent))))
OR
aggregate('couche_Point_2',
'concatenate_unique',
"Attribut_couche_point_2",
intersects
(buffer
($geometry, 0.000005),
end_point
(geometry(@parent))))
Et bien évidemment ca ne fonctionne pas, je dois trés certainement mal utilisé la fonction "OR" dans ce cas présent, pourriez vous m'aiguiller sur le bon chemin ?
Hors ligne
#20 Wed 21 July 2021 12:19
- aheurion
- Participant actif
- Lieu: NANTES
- Date d'inscription: 8 Oct 2020
- Messages: 141
Re: QGIS 3.14: Points aux extremites d une Polyligne
Bonjour insay,
En effet ça ne fonctionnera pas ainsi car tu essaies d'appliquer ton OR aux résultats des aggregates
(OR fonctionne avec des booléens : 1 OR 0 = 1 / 1 OR 1 = 1 / 0 OR 0 = 0 mais ici ça essaie de faire 'resultat_1' OR 'resultat_2', tes résultats étant des chaînes de caractères (car tu aggregates avec un concatenate_unique) le OR ne fonctionne pas.)
Je pense qu'il faut découper en 2 l'expression :
- d'abord tu fais les aggregate pour récupérer les résultats 1 et 2
- ensuite tu regardes s'ils sont tous les deux null ou non
Ici l'expression with_variable va être pratique : with_variable('nom_variable', valeur_variable, suite_de_l_expression)
où tu indiqueras en variable les résultats de tes aggregates :
Code:
with_variable('resultat_1', aggregate('Couche_Point_1','concatenate_unique',"Attribut_couche_point_1",intersects(buffer($geometry, 0.000005),end_point(geometry(@parent)))), with_variable('resultat_2', aggregate('Couche_Point_2','concatenate_unique',"Attribut_couche_point_2",intersects(buffer($geometry, 0.000005),end_point(geometry(@parent)))), .........cf code ci-dessous............... ))
Et dans le reste de l'expression tu regardes ce que tu fais en fonction des résultats avec un CASE WHEN THEN END
(tu utilises tes variables en utilisant le @ : @resultat_1, @resultat_2) :
Code:
CASE WHEN @resultat_1 is null AND @resultat_2 is null THEN null /*s'il ne trouve rien dans aucune des deux couches on laisse le champ vide dans la ligne*/ WHEN @resultat_1 is null AND @resultat_2 is not null THEN @resultat_2 /*s'il trouve un résultat uniquement dans 2, il prend cette valeur*/ WHEN @resultat_1 is not null AND @resultat_2 is null THEN @resultat_1 /*idem mais pour 1*/ WHEN @resultat_1 is not null AND @resultat_2 is not null THEN .... /*Ben là à toi de voir quoi prendre s'il trouve un résultat pour les deux : le plus grand, le plus petit, concaténer les deux ? etc.*/ END
Dernière modification par aheurion (Thu 22 July 2021 08:53)
Hors ligne
#21 Wed 21 July 2021 17:20
- insay
- Participant occasionnel
- Date d'inscription: 23 Mar 2018
- Messages: 25
Re: QGIS 3.14: Points aux extremites d une Polyligne
Bonjour Aheurion,
Merci énormément pour ton aide, ta solution fonctionne parfaitement, j'ai pris le choix de concaténer les résultats dans le cas ou il y en aurait 2.
Hors ligne
#22 Wed 21 July 2021 22:20
- SANTANNA
- Moderateur
- Lieu: Angers
- Date d'inscription: 18 Jan 2008
- Messages: 3884
Re: QGIS 3.14: Points aux extremites d une Polyligne
Bonjour,
Code:
CASE
WHEN @resultat_1 is null AND @resultat_2 is null THEN null /*s'il ne trouve rien dans aucune des deux couches on laisse le champ vide dans la ligne*/
WHEN @resultat_1 is null AND @resultat_2 is not null THEN @resultat_2 /*s'il trouve un résultat uniquement dans 2, il prend cette valeur*/
WHEN @resultat_1 is not null AND @resultat_2 is null THEN @resultat_1 /*idem mais pour 1*/
WHEN @resultat_1 is not null AND @resultat_2 is not null THEN .... /*Ben là à toi de voir quoi prendre s'il trouve un résultat pour les deux : le plus grand, le plus petit, concaténer les deux ? etc.*/
END
Vu que la concaténation a été retenue, je me demande si toute cette partie ne peut se résumer en
Code:
concat(@resultat_1, @resultat_2)
ou en
Code:
coalesce(@resultat_1 || @resultat_2, @resultat_1, @resultat_2)
Hors ligne