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

MathieuR
Membre
Lieu: aix-en-provence
Date d'inscription: 16 Feb 2009
Messages: 1690
Site web

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

MathieuR
Membre
Lieu: aix-en-provence
Date d'inscription: 16 Feb 2009
Messages: 1690
Site web

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 smile


geodata au cerema et petits billets en géomatique

Hors ligne

 

Pied de page des forums

Powered by FluxBB