Pages: 1
- Sujet précédent - QGIS 3.4: Aggregate, options de filtrage, deuxième plus grande valeur - Sujet suivant
#1 Tue 12 February 2019 11:03
- AHAquilex
- Participant occasionnel
- Date d'inscription: 10 Jul 2018
- Messages: 17
QGIS 3.4: Aggregate, options de filtrage, deuxième plus grande valeur
Bonjour à tous,
Voici mon problème :
Je possède une couche de lignes et une couche de points, les points étant situés aux extrémités des lignes.
Dans ma couche de lignes j'ai un champ "azimut" et "longueur"
Dans ma couche de points j'ai plusieurs champs du type "ligne1_azimut","ligne2_azimut","ligne1_longueur","ligne2_longueur", etc...
Sachant qu'il peut y avoir jusqu'à 8 lignes arrivant à un même point.
Pour informations tous mes points possèdent un identifiant unique, mais pas les lignes.
Je cherche, à l'aide d'un calcul de couche virtuelle, à ce que les informations contenues dans ma couche de lignes soient enregistrées dans ma couche de points. J'aimerais que la ligne 1 pour chaque point soit celle possédant l'azimut le plus faible, la ligne 2 la deuxième plus faible, etc...
J'ai testé avec aggregate, seulement je ne vois pas quelle expression de filtrage je peux rentrer pour choisir le deuxième, troisième, etc... azimut/longueur à prendre en compte.
En effet aggregate propose bien les options 'min' et 'max' mais ce n'est pas suffisant parce que je ne veux pas seulement le premier et le dernier.
Pour info je connais le nombre de lignes arrivant à chaque point (que j'ai calculé en utilisant aggregate('couche_lignes','count_distinct',"azimut",intersects(end_point($geometry),geometry(@parent))) )
Je cherche vraiment à garder le principe de valeurs dynamiques (avec une couche virtuelle) donc les solutions nécessitant la création de couches ou de champs intermédiaires ne me conviennent pas vraiment.
Merci d'avance pour votre aide.
Dernière modification par AHAquilex (Tue 12 February 2019 11:10)
Hors ligne
#2 Tue 12 February 2019 12:29
Re: QGIS 3.4: Aggregate, options de filtrage, deuxième plus grande valeur
Bonjour,
Peut-être une méthode :
- Trier couche_lignes par la colonne azimut en allant dans propriétés de la couche > filtre et mettre
Code:
1=1 order by azimut
- Puis, dans la couche points, insérer les expressions suivantes dans des champs virtuels :
ici, récupère le premier élément
Code:
with_variable('index', 2, array_find( aggregate('couche_lignes','concatenate','azimut',','), @index))
pour le second :
Code:
with_variable('index', 3, array_find( aggregate('couche_lignes','concatenate','azimut',','), @index))
geodata au cerema et petits billets en géomatique
Hors ligne
#3 Tue 12 February 2019 13:31
- SANTANNA
- Moderateur
- Lieu: Angers
- Date d'inscription: 18 Jan 2008
- Messages: 3945
Re: QGIS 3.4: Aggregate, options de filtrage, deuxième plus grande valeur
Bonjour,
MathieuR, N'est-ce pas plutôt array_get? Find suppose qu'il connaît la valeur cherchée alors que get récupérerait la valeur à la position demandée. Et je me demande s'il ne manque pas une conversion string_to_array? ie pour obtenir le numéro 2
Code:
array_get( string_to_array( aggregate( 'couche_lignes','concatenate','azimut',concatenator:=',') ), 1)
Et pour ce qui est du tri préalable, la 3.6 apporte la fonction array_sort
Dernière modification par SANTANNA (Tue 12 February 2019 13:32)
Hors ligne
#4 Tue 12 February 2019 14:07
- AHAquilex
- Participant occasionnel
- Date d'inscription: 10 Jul 2018
- Messages: 17
Re: QGIS 3.4: Aggregate, options de filtrage, deuxième plus grande valeur
Merci MathieuR pour ta réponse rapide.
Alors j'ai un peu bidouillé avec ce que tu as écrit plus haut et j'ai du coup pu arriver à un résultat.
Dans un premier temps j'aimerais éviter d'avoir à filtrer ma couche de lignes uniquement pour ça car j'aurais au final besoin d'indiquer les azimut des lignes à chacune des extrémités de celles-ci (mes azimuts étant orientées N/S à 360°, l'azimut à une extrémité n'est pas la même à l'autre. Par exemple : 191° et 11°, ou encore 321° et 141°). Je sais que je peux l'obtenir par un simple calcul (|az2-az1|=180 mais j'y perds l'orientation de ma ligne.
Mais du coup j'ai réutilisé ton système des arrays, et j'ai pour cela utilisé le plugin arrayPlus permettant de trier les valeur d'un array par ordre croissant. J'obtiens alors un code comme ça :
Code:
array_get(array_sort(string_to_array( aggregate('couche_lignes','concatenate',to_string("azimut"),intersects(end_point($geometry),geometry(@parent)),',') )),X)
Avec X la position dans l'array que je souhaite (0 pour la première, 1 la seconde, etc...)
EDIT : Donc effectivement SANTANNA, j'utilise plutôt array_get. En fait je suis arrivé aux même conclusions que toi avant de voir ton message (merci quand-même)
Dernière modification par AHAquilex (Tue 12 February 2019 14:08)
Hors ligne
#5 Tue 12 February 2019 14:14
- carteq
- Participant assidu
- Date d'inscription: 8 Mar 2008
- Messages: 829
Re: QGIS 3.4: Aggregate, options de filtrage, deuxième plus grande valeur
En SQL, on utiliserait Order BY champ ASC OFFSET x LIMIT y (où x est la ligne de départ et LIMIT le nombre d'éléments à retenir, qui serait 1 ici)
Hors ligne
#6 Tue 12 February 2019 14:20
- AHAquilex
- Participant occasionnel
- Date d'inscription: 10 Jul 2018
- Messages: 17
Re: QGIS 3.4: Aggregate, options de filtrage, deuxième plus grande valeur
Malheureusement, je suis une bille avec SQL (que je n'ai pour ainsi dire jamais utilisé). J'ai pu grâce à Mathieu trouver une solution qui marche bien sans passer par SQL (juste besoin du plugin arrayPlus pour pouvoir utiliser array_sort avant la 3.6), mais merci pour ta réponse quand-même. Ca en aidera peut-être d'autres.
Hors ligne
#7 Thu 14 February 2019 14:44
Re: QGIS 3.4: Aggregate, options de filtrage, deuxième plus grande valeur
Oui, en effet @santanna, c'était array_get. J'ai écrit un peu de manière précipitée
et bonne trouvaille, @AHAquilez que Array Plus. Je me disais bien qu'il manquait une fonction de tri dans le calculateur d'expressions. Espérons qu'elle intègre par défaut la prochaine version de QGIS !
Je pense aussi qu'il serait intéressant, de façon annexe, de pouvoir agréger les résultats de aggregate et relation_aggregate sous la forme de tableaux array. C'est pourquoi j'ai formulé cette proposition sur le hubb qgis https://issues.qgis.org/issues/21274
Finalement, il y a maintenant beaucoup de choses que l'on peut réaliser avec les fonctions natives de QGIS, sans nécessité d'utiliser de SQL
geodata au cerema et petits billets en géomatique
Hors ligne
Pages: 1
- Sujet précédent - QGIS 3.4: Aggregate, options de filtrage, deuxième plus grande valeur - Sujet suivant