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

Rencontres QGIS 2025

L'appel à participation est ouvert jusqu'au 19 janvier 2025!

#1 Tue 05 April 2022 14:04

alix71000
Juste Inscrit !
Date d'inscription: 31 Mar 2022
Messages: 8

QGIS: Etude sur duree d'activite type d'occupation du sol

Bonjour tout le monde,

Il s'agit de mon tout premier message sur GeoRezo alors je tiens en premier lieu à m'excuser si ce post ne respecte pas conformément les règles...

Donc voici mon problème :
Je travaille sur l'occupation du sol (ocsol) et notamment son évolution en matière de durée d'activité (en année) et cela sur certaines catégories d'ocsol.
Je dispose de plusieurs couches vectorielles d'occupation (1952, 1881, 1999, 2004, 2008, 2012, 2014, 2016, 2018) dont ont été extraites les catégories qui m'intéressaient.
A côté de ça, j'ai créé une grille (50m x 50m) à laquelle j'ai affecté des jointures par localisation de mes différentes années d'ocsol afin d'avoir dans une maille des champs relatifs aux années donnant ainsi l'information sur le type d'ocsol présent à chaque date.

Jusque là, tout va bien.

J'ai calculé par la suite trois nouveaux champs pour chaque catégorie qui donnent des infos sur leur présence à savoir : la date de début, la date de fin et le temps représentant la durée à travers la soustraction de ces deux dates.
Sauf qu'il y a un soucis par rapport aux changements qu'il peut y avoir dans le temps sur une maille. Le calcul de la date de début ne pose à priori pas de problème. Par contre le calcul de la date de fin n'est pas dans la capacité de voir les changements, par exemple :

- De 1952 à 1981: on a de la viticulture
- de 1981 à 2004 : maraichage
- de 2004 à 2018 : viticulture
- de 2018 à 2020 : maraichage
L'algorithme ne vas pas comprendre qu'il y a des "trous" dans les périodes d'activités, il va dire que la viticulture a commencé en 1952 et s'est terminée en 2018 (alors qu'il y a eu 23 ans de maraichage entre temps), et que le maraichage a commencé en 1981 et s'est terminé en 2020 (alors qu'il y a eu 14 années de viticulture entre). Forcément du coup mon temps d'activité va se retrouvé surestimé.

J'ai trouvé potentiellement une solution grâce à la notion d'inactivité où en fait je calcule la durée (début, fin, temps) où il n'y a pas la catégorie d'ocsol et ensuite je soustrait le temps activité surestimé au temps d'inactivité, sauf que cela ne marche pas quand il y a plus de 1 changement (comme l'exemple).

Il ne me semble pas avoir trouvé de sujet similaire dans l'historique du forum malgré mes nombreuses recherches alors me voilà donc coincée et à cours d'idées. Si jamais vous avez eu affaire à ce genre de problématique ou que vous pensez avoir une alternative je suis toute ouïe !

PS : je travaille sur QGIS 3.22.4, padawan du SQL et pas douée en python

Merci beaucoup d'avance !!

Alix

Hors ligne

 

#2 Tue 05 April 2022 16:20

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

Re: QGIS: Etude sur duree d'activite type d'occupation du sol

Bonjour,

alix71000 a écrit:

- De 1952 à 1981: on a de la viticulture
- de 1981 à 2004 : maraichage
- de 2004 à 2018 : viticulture
- de 2018 à 2020 : maraichage


Pour être sûr de bien comprendre, est-ce à dire que dans ce cas-ci, votre maille affiche comme table attributaire ceci:

id | 1952                  | 1981        | 1999          |           2004 |  2008       | 2012        | 2014        | 2016        | 2018        | 2020
1  | (n'importe quoi)  | viticulture | maraichage | maraichage | viticulture | viticulture | viticulture | viticulture | viticulture |maraichage

Et qu'en gros il y a 43 années de viticulture et 25 années de maraichage?
Et que vous souhaiteriez rajouter à la suite des champs "maraichage" et "viticulture" indiquant les valeurs 25 et 43 pour cette entité?

Hors ligne

 

#3 Tue 05 April 2022 16:37

alix71000
Juste Inscrit !
Date d'inscription: 31 Mar 2022
Messages: 8

Re: QGIS: Etude sur duree d'activite type d'occupation du sol

SANTANNA a écrit:

id | 1952                  | 1981        | 1999          |           2004 |  2008       | 2012        | 2014        | 2016        | 2018        | 2020
1  | (n'importe quoi)  | viticulture | maraichage | maraichage | viticulture | viticulture | viticulture | viticulture | viticulture |maraichage

Et qu'en gros il y a 43 années de viticulture et 25 années de maraichage?
Et que vous souhaiteriez rajouter à la suite des champs "maraichage" et "viticulture" indiquant les valeurs 25 et 43 pour cette entité?


Bonjour ! Merci pour votre message,
C'est à peu près cela, dans l'exemple il y a déjà "viticulture" en 1952, et dans mon cas il s'agit de code d'occupation à la place* (j'avais traduit pour simplifier mon propos).
Effectivement ce que je recherche c'est le nombre d'années par type d'occupation et cela pour chaque entité ! Soit 25 pour "maraichage" et 43 pour "viticulture" exactement vis-à-vis de l'exemple.

*Les codes d'ocsol ont été convertis en entier

Hors ligne

 

#4 Tue 05 April 2022 18:20

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

Re: QGIS: Etude sur duree d'activite type d'occupation du sol

Je pense que l'extrait ci-dessous marche. A confirmer. J'ai essayé de commenter le code mais je vous invite à lire l'aide des fonctions qui sont utilisées, voire à commenter des blocs pour voir ce qui est renvoyé à chacune des étapes.

Code:

with_variable('champcalc', 'cult_1', -- on crée une variable pour stocker le nom du champ qu'on veut calculer, il faudra remplacer 'cult_1' par votre valeur d'occupation de sol
  with_variable(
    'annees_recensement_duree', -- on crée une autre variable tableau associant l'année d'observation à la durée d'existence correspondante depuis le précédent recensement
    map(1952, 0
       ,1981, 29
       ,1999, 18
       ,2004, 5
       ,2008, 4
       ,2012, 4
       ,2016, 4
       ,2018, 2
       ,2020, 2),
    array_sum( -- on va sommer les valeurs d'une liste
      array_foreach(-- laquelle liste est créée à partir des champs année d'observation sur lesquels on va itérer
        map_akeys(@annees_recensement_duree), -- ceci renvoie la liste des années d'observation
        CASE WHEN attributes()[@element]=@champcalc -- si l'observation dans l'année est celle voulue
        THEN map_get(@annees_recensement_duree, @element) -- on récupère le nombre d'années correspondantes dans le tableau
        ELSE 0 -- sinon on met 0
        END
      )
    )
  )
)

Hors ligne

 

#5 Wed 06 April 2022 10:22

alix71000
Juste Inscrit !
Date d'inscription: 31 Mar 2022
Messages: 8

Re: QGIS: Etude sur duree d'activite type d'occupation du sol

SANTANNA a écrit:

Je pense que l'extrait ci-dessous marche. A confirmer. J'ai essayé de commenter le code mais je vous invite à lire l'aide des fonctions qui sont utilisées, voire à commenter des blocs pour voir ce qui est renvoyé à chacune des étapes.


Incroyable, merci beaucoup pour votre aide !

Le bémol c'est que je ne suis pas encore à l'aise avec de tel script, surtout les passages qu'il faut remplacer en fonction de mes données et attentes. Egalement, faut-il l'exécuter dans le Gestionnaire BD, dans la Calculatrice de champ ou autre part ?
J'essaye en attendant de déchiffrer et comprendre les fonctions que vous employez dans l'aide des fonctions...

Comment est-ce que la formule comprend qu'il faut utiliser les champs précédents correspondant aux années et leur type d'ocsol recensé ?

Dernière modification par alix71000 (Wed 06 April 2022 10:30)

Hors ligne

 

#6 Wed 06 April 2022 11:46

alix71000
Juste Inscrit !
Date d'inscription: 31 Mar 2022
Messages: 8

Re: QGIS: Etude sur duree d'activite type d'occupation du sol

Update :

J'ai réussi à "comprendre" et faire fonctionner le code (dans calculatrice de champ) !
Au début cela m'affichait des durées étranges par rapport au recensement mais en fait c'est parce que les valeurs attribuées aux années doivent directement commencer par 29 en 1952.

Code:

with_variable('champcalc', 221, -- on crée une variable pour stocker le nom du champ qu'on veut calculer, il faudra remplacer 'cult_1' par votre valeur d'occupation de sol
  with_variable(
    'annees_recensement_duree', -- on crée une autre variable tableau associant l'année d'observation à la durée d'existence correspondante depuis le précédent recensement
    map('C_1952', 29
       ,'C_1981', 18
       ,'C_1999', 5
       ,'C_2004', 4
       ,'C_2008', 4
       ,'C_2012', 2
       ,'C_2014', 2
       ,'C_2016', 2
       ,'C_2018', 2
       ,'C_2020', 2),
    array_sum( -- on va sommer les valeurs d'une liste
      array_foreach(-- laquelle liste est créée à partir des champs année d'observation sur lesquels on va itérer
        map_akeys(@annees_recensement_duree), -- ceci renvoie la liste des années d'observation
        CASE WHEN attributes()[@element]=@champcalc -- si l'observation dans l'année est celle voulue
        THEN map_get(@annees_recensement_duree, @element) -- on récupère le nombre d'années correspondantes dans le tableau
        ELSE 0 -- sinon on met 0
        END
      )
    )
  )
)

Encore merci pour votre aide Santanna !!

Bien à vous smile

Alix

Hors ligne

 

#7 Wed 06 April 2022 11:52

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

Re: QGIS: Etude sur duree d'activite type d'occupation du sol

Bonjour,

Egalement, faut-il l'exécuter dans le Gestionnaire BD, dans la Calculatrice de champ ou autre part ?


Ça s'exécute dans la calculatrice des champs.

Le bémol c'est que je ne suis pas encore à l'aise avec de tel script, surtout les passages qu'il faut remplacer en fonction de mes données et attentes.


Il n'y a, en l'état de votre demande, qu'une seule chose à remplacer à chaque exécution, le texte 'cult_1' par la valeur de l'occupation des sols dont vous calculez l'âge.

Comment est-ce que la formule comprend qu'il faut utiliser les champs précédents correspondant aux années et leur type d'ocsol recensé ?


Bonne question, et là, j'ai peut-être trop vite supposé que ces champs s'appelaient 1952, 1981, 1999.... Il faudrait en effet remplacer ces valeurs par le nom réel des champs correspondants. Une fois qu'on lui a passé la liste des champs à "regarder" (map_akeys(@annees_recensement_duree)), la formule attributes()[@element] permet d'aller récupérer les valeurs dans chacun des champs pour l'entité en cours.

Hors ligne

 

#8 Wed 06 April 2022 12:03

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

Re: QGIS: Etude sur duree d'activite type d'occupation du sol

les valeurs attribuées aux années doivent directement commencer par 29 en 1952.


Ah ouais? étrange. J'ai dû mal comprendre comment affecte les durées aux observations. mais bon... Je vois aussi que j'avais zappé le 2014 dans la liste des années.
En tout cas, super que vous ayez pu vous dépatouiller!

Hors ligne

 

Pied de page des forums

Powered by FluxBB