Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
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

#1 Thu 29 October 2020 16:22

Carolus
Membre
Date d'inscription: 5 Oct 2020
Messages: 7

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
Membre
Date d'inscription: 8 Oct 2020
Messages: 83

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
Membre
Date d'inscription: 30 Aug 2013
Messages: 617

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
Membre
Date d'inscription: 23 Mar 2018
Messages: 20

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
Membre
Date d'inscription: 23 Mar 2018
Messages: 20

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: 2937

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
Membre
Date d'inscription: 23 Mar 2018
Messages: 20

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 big_smile

Hors ligne

 

#8 Mon 16 November 2020 20:57

sylvain poupard
Membre
Date d'inscription: 19 Mar 2009
Messages: 337

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
Membre
Date d'inscription: 23 Mar 2018
Messages: 20

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 smile

Hors ligne

 

#10 Wed 18 November 2020 10:09

sylvain poupard
Membre
Date d'inscription: 19 Mar 2009
Messages: 337

Re: QGIS 3.14: Points aux extremites d une Polyligne

insay a écrit:

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
Membre
Date d'inscription: 13 Mar 2015
Messages: 15

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
Membre
Date d'inscription: 30 Aug 2013
Messages: 617

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
Membre
Date d'inscription: 13 Mar 2015
Messages: 15

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
Membre
Date d'inscription: 30 Aug 2013
Messages: 617

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
Membre
Date d'inscription: 13 Mar 2015
Messages: 15

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
Membre
Date d'inscription: 30 Aug 2013
Messages: 617

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: 2937

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
Membre
Date d'inscription: 19 Jul 2021
Messages: 6

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
Membre
Date d'inscription: 23 Mar 2018
Messages: 20

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
Membre
Date d'inscription: 8 Oct 2020
Messages: 83

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
Membre
Date d'inscription: 23 Mar 2018
Messages: 20

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.

big_smile big_smile big_smile big_smile big_smile big_smile big_smile big_smile big_smile big_smile big_smile

Hors ligne

 

#22 Wed 21 July 2021 22:20

SANTANNA
Moderateur
Lieu: Angers
Date d'inscription: 18 Jan 2008
Messages: 2937

Re: QGIS 3.14: Points aux extremites d une Polyligne

Bonjour,

aheurion a écrit:

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

 

Pied de page des forums

Powered by FluxBB

Partagez  |