Pages: 1
- Sujet précédent - QGIS: Etude sur duree d'activite type d'occupation du sol - Sujet suivant
#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,
- 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
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
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
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
Pages: 1
- Sujet précédent - QGIS: Etude sur duree d'activite type d'occupation du sol - Sujet suivant