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 Wed 27 January 2021 14:14

aheurion
Participant actif
Lieu: NANTES
Date d'inscription: 8 Oct 2020
Messages: 143

QGIS 3.16: Difference dates 2 a 2 consecutives dans champ relation

Bonjour,

Je suis face à un souci que je n'arrive pas à résoudre avec les outils à disposition :
Je dispose d'une couche de polyligne parent, liée à une couche csv non géométrique enfant. Cette couche CSV contient un historique des entités de la couche parent (parent A <=> enfant A1 avec date d1 + enfant A2 avec date d2 + etc..).
Je souhaite créer un champ dans ma couche parent contenant l'intervalle moyen entre deux dates pour chaque entité (ex : 01/01/2018 ; 01/01/2019 ; 01/01/2021 => intervalle moyen = 1.5 an).

Je suis parti sur l'idée suivante :
1) stocker les dates dans un tableau A (aggregate avec array_agg) et trier par dates croissantes
2) créer un tableau B à partir de A contenant les dates consécutives sauf la première
3) créer un tableau C à partir de A contenant les dates consécutives sauf la dernière
4) soustraire B à C
5) faire la moyenne de la soustraction

Voici l'expression que j'utilise :

with_variable(
    'tableauA',
    array_sort(
        aggregate(
            'id_de_ma_couche_enfant',
            'array_agg',
            "date",
            "FOREIGN_KEY"=attribute(@parent,'PRIMARY_KEY')
        )
    ),
    mean(
        age(
            array_slice(@tableauA,1,array_length(@tableau0)),    /* => le tableau B*/
            array_slice(@tableauA,0,array_length(@tableau0)-1)  /* => le tableau C*/
        )
    )
)



Mais QGIS me dit que l'expression est invalide (impossible de calculer l'aggrégat pour...)

Le champ que je veux calculer est un double, je me trompe peut-être là-dessus.
Ou bien est-ce lié à la soustraction entre les deux tableaux B et C ?

Merci d'avance pour vos retours !

EDIT :
alors j'ai trouvé 2 problèmes que j'ai réussi à résoudre :
1) Apparemment mean() ne fonctionne pas avec des arrays, mais il n'y a pas d'option équivalente dans QGIS en natif, donc il faut installer l'extension ArrayPlus qui rajoutera l'option array_avg()
2) Pour ce qui est de la soustraction de deux tableaux, j'ai remplacé age(tableauA,tableauB) par un petit bidouillage mais qui marche :

with_variable('tableauB',array_slice(@tableauA,1,array_length(@tableauA)-1),
with_variable('tableauC',array_slice(@tableauA,0,array_length(@tableauA)-2),
with_variable('tableauA2',array_foreach(@tableauB,epoch(@element)),
    round(
        array_avg(
            array_foreach(@tableauA2,
                year(
                    age(
                        array_get(@tableauB,array_find(@tableauA2,@element)),
                        array_get(@tableauC,array_find(@tableauA2,@element))
                    )
                )
            )
        ),
        1
    )
)
)
)


(je passe par un quatrième tableau A2 qui fait la taille de B et C mais qui contient des double/real plutôt que des dates (en transformant la date en epoch)

Dernière modification par aheurion (Wed 27 January 2021 18:05)

Hors ligne

 

#2 Thu 28 January 2021 13:26

sylvain poupard
Participant assidu
Date d'inscription: 19 Mar 2009
Messages: 362

Re: QGIS 3.16: Difference dates 2 a 2 consecutives dans champ relation

Bonjour,

Si j'ai bien compris c'est l'écart-type que vous recherchez(?). Si oui regardez du côté de la fonction stdev.

J'ai testé stdev(date, Nom) depuis la couche contenant les entités filles et je me retrouve avec :
Nom | date en numérique | stdev
A 100 100
A 200 100
A 300 100
B 1 1
B 2 1
B 3 1

Ensuite j'ai fait une jointure 1-1 (vu que la valeur est identique avec le regroupement par "Nom") depuis les propriétés de la couche contenant les géométries et rempli le champs dédié.

J'ai essayé de le faire en dynamique via une couche virtuelle mais sans succès, peut-être qu'en allant voir du côté de postgre ça serait possible(?)

Merci pour vos retours.

Bon courage

Hors ligne

 

#3 Thu 28 January 2021 16:29

aheurion
Participant actif
Lieu: NANTES
Date d'inscription: 8 Oct 2020
Messages: 143

Re: QGIS 3.16: Difference dates 2 a 2 consecutives dans champ relation

Bonjour Sylvain, et merci pour ta réponse.

Alors je n'avais pensé à ça, et ça semble beaucoup plus simple que ma méthode ^^
J'ai essayé ainsi :

aggregate(
    'id_de_ma_couche_enfant',
    'stdev',
    epoch("date"),
    "FOREIGN_KEY"=attribute(@parent,'PRIMARY_KEY')
)/31557600000


(31557600000 étant le nombre de millisecondes dans une année)
J'utilise epoch pour transformer ma date en nombre, parce stdev ne semble pas fonctionner avec des dates.

Par contre je ne comprends pas pourquoi : avec cette formule et ces 3 dates-ci : [2019-01-01 ; 2020-01-01 ; 2021-01-01], cette nouvelle formule me donne un résultat différent : 0.8 ans d'écart, alors que ma formule précédente trouvait bien 1.0 pile hmm
Si stdev donnait l'écart entre toutes les valeurs de dates, je devrais trouver un nombre plus grand que 1 non ? (moyenne des écarts=(1+1+2)/3)

Dernière modification par aheurion (Thu 28 January 2021 16:38)

Hors ligne

 

#4 Thu 28 January 2021 18:33

sylvain poupard
Participant assidu
Date d'inscription: 19 Mar 2009
Messages: 362

Re: QGIS 3.16: Difference dates 2 a 2 consecutives dans champ relation

Re bonjour,

A partir d'un champs numérique, la fonction relation_aggregate me renvoie des résultat qui ont l'air correct :

'Renvoie une valeur agrégée, calculée à partir de toutes les entités enfants correspondantes dans la couche en relation.'


Syntaxe:

Code:

relation_aggregate(relation,aggregate,expression[,concatenator=''][,order_by])

Avec quelquechose comme :

Code:

 relation_aggregate( 'ma_relation','stdev',"mon_champs_date_numérique")

(La relation étant à définir dans le projet)

Bon courage

Hors ligne

 

#5 Thu 28 January 2021 18:45

sylvain poupard
Participant assidu
Date d'inscription: 19 Mar 2009
Messages: 362

Re: QGIS 3.16: Difference dates 2 a 2 consecutives dans champ relation

...et avec une date :

Code:

 relation_aggregate( 'ma_relation','stdev',epoch(to_date("mon_champ_date")))

Bon courage

Hors ligne

 

Pied de page des forums

Powered by FluxBB