#1 Wed 17 November 2021 22:06
- Loup
- Juste Inscrit !
- Date d'inscription: 16 Nov 2021
- Messages: 8
QGIS/Atlas: compter des donnees par maille
Bonjour,
Je réalise des cartographies pour un atlas odonates. Je cherche à obtenir, grâce au générateur atlas, des cartes ,par espèce, du nombre de données par maille.
J'ai une couche de données avec les colonnes :
n_bd_dep (identifiant de la donnée)
nom_latin (nom de l'espèce)
Et une grille avec "FID" comme colonne d'identifiants.
Pour tenter d'obtenir ce que je souhaite, j'utilise une requête telle que :
SELECT "données 2021"."nom_latin", Count("données 2021"."n_bd_dep", "maillles 5k Loire"."FID") AS Nombre, "maillles 5k Loire"."FID", "maillles 5k Loire"."geometry"
FROM "maillles 5k Loire", "données 2021"
WHERE ST_Intersects("maillles 5k Loire"."geometry","données 2021"."geometry")
GROUP BY "données 2021"."nom_latin","maillles 5k Loire"."FID"
Malheureusement le résultat n'est pas celui escompté :
J'obtiens bien une ligne par maille et par espèce, mais le nombre indiqué pour chaque espèce est le même pour toutes les mailles. Par exemple, pour Aeschna affinis, le nombre est de 8 pour toutes les mailles, Sympetrum vulgatum a un nombre de 2 pour toutes les mailles (alors qu'il n'est présent que dans 4 ou 5 mailles), etc.
Est-ce que j'utilise la mauvaise fonction ?
Hors ligne
#2 Thu 18 November 2021 02:44
- carteq
- Participant assidu
- Date d'inscription: 8 Mar 2008
- Messages: 829
Re: QGIS/Atlas: compter des donnees par maille
Bonjour Loup,
J'ai fait ça dans un autre logiciel, mais tu comprendras je crois comment corriger ton SQL :
Select [especes].[nom], Count([especes].[ID]) as [nombre], [mailles].[maille_no]
from [especes], [mailles]
where Intersects([especes].[Geom (I)], [mailles].[Geom (I)])
Group By [especes].[nom], [mailles].[maille_no]
Vincent
Hors ligne
#3 Thu 18 November 2021 15:07
- Loup
- Juste Inscrit !
- Date d'inscription: 16 Nov 2021
- Messages: 8
Re: QGIS/Atlas: compter des donnees par maille
Bonjour Vincent,
Merci pour l'aide. Le résultat est malheureusement toujours le même. J'ai testé avec un autre jeu de données similaires (seule le nombre de données change) et une autre grille de même taille : le résultat est mieux mais toujours pas comme je le souhaiterais.
Au lieu d'avoir un unique nombre par espèce pour toutes les mailles, j'ai l'impression que seules les mailles où il n'y a pas de données de l'espèce ont ce nombre (qui devraient normalement être zéro mais qui là semble être le minimum de données comptées dans une maille pour l'espèce en question).
Je ne comprends pas pourquoi il attribut un nombre de données aux mailles qui n'en n'ont pas (si c'est bien ça) ?
Je ne comprends pas non plus pourquoi la requête marche mieux avec ce jeu de données ?
Hors ligne
#4 Thu 18 November 2021 15:23
- Loup
- Juste Inscrit !
- Date d'inscription: 16 Nov 2021
- Messages: 8
Re: QGIS/Atlas: compter des donnees par maille
j'ai testé avec Max("Données Loire test"."nombre") AS NOMBRE à la place de Count("données 2021"."n_bd_dep" mais encore une fois le problème est le même :
J'ai bien le nombre maximum noté dans chaque maille mais les mailles sans données se voient toujours attribuer le minimum. J'aimerais plutôt pouvoir faire attribuer "0" lorsqu'il n'y a pas de donnée, afin de pouvoir ensuite masquer ces mailles vides. :-/
Hors ligne
#5 Thu 18 November 2021 15:28
- Sylvain M.
- Participant assidu
- Lieu: Saint-Pierre-des-Nids (53)
- Date d'inscription: 8 Sep 2005
- Messages: 995
Re: QGIS/Atlas: compter des donnees par maille
Moi j'écrirais quelque chose comme ça :
Code:
SELECT d.nom_latin, m.FID, count(d.n_bd_dep) as nombre_donnees, m.geometry FROM "données 2021" d JOIN "maillles 5k Loire" m ON ST_Intersects(d.geometry, m.geometry) GROUP BY d.nom_latin, m.FID, m.geometry
N'hésite pas à mettre des alias aux tables, c'est tout de suite plus lisible
Dernière modification par Sylvain M. (Thu 18 November 2021 15:30)
Sylvain M.
Hors ligne
#6 Thu 18 November 2021 16:55
- Loup
- Juste Inscrit !
- Date d'inscription: 16 Nov 2021
- Messages: 8
Re: QGIS/Atlas: compter des donnees par maille
Merci Sylvain. Malheureusement toujours pareil : toutes les mailles ont un nombre de données pour chaque espèce alors que beaucoup de ligne devraient avoir "0" en nombre... :-/
Pour mieux illustrer, Aeshna affinis a 466 lignes (soit le nombre de maille de ma grilles) sans jamais un seul zéro alors qu'elle n'est présente que dans 56 mailles. Les mailles où elle est réellement présente ont un nombre fiable (14,30,28,11,etc) mais les mailles où elle est censée être absente ont toutes "8" comme indication de nombre de données. Ce chiffre "par défaut" change pour chaque espèce. Je suppose que c'est le minimum de données de l'espèce dans les mailles mais sans certitude....
Hors ligne
#7 Thu 18 November 2021 20:36
- carteq
- Participant assidu
- Date d'inscription: 8 Mar 2008
- Messages: 829
Re: QGIS/Atlas: compter des donnees par maille
Loup, tu n'aurais pas des entités multiparties dans ton jeu de données ? Ça fausserait les résultats.
J'ai vais tester ma solution dans QGIS dès que possible.
Hors ligne
#8 Thu 18 November 2021 21:33
- Loup
- Juste Inscrit !
- Date d'inscription: 16 Nov 2021
- Messages: 8
Re: QGIS/Atlas: compter des donnees par maille
A priori non :-/ Si tu veux tester directement avec mes couches tu peux les télécharger ici : <lien supprimé>
Est-ce bien le code que je dois saisir ? :
SELECT "D"."nom_latin",
Count("D"."n_bd_dep") AS Nombre,
"M"."geometry",
"M"."FID"
FROM "D"
JOIN "M" ON ST_Intersects("D"."geometry","M"."geometry")
GROUP BY "D"."nom_latin", "M"."FID", "M"."geometry"
Dernière modification par SANTANNA (Fri 19 November 2021 13:29)
Hors ligne
#9 Fri 19 November 2021 09:25
- Sylvain M.
- Participant assidu
- Lieu: Saint-Pierre-des-Nids (53)
- Date d'inscription: 8 Sep 2005
- Messages: 995
Re: QGIS/Atlas: compter des donnees par maille
Je vais regarder le fichier, mais comme je viens de le télécharger, je te donne un petit conseil que normalement donne tout formateur SIG à ses élèves : jamais d'espaces, d'accents ou de caractères spéciaux dans le nom (et le chemin) de ses fichiers SIG, shapefile en particulier !
C'est la raison pour laquelle tu dois mettre des guillemets partout dans tes requêtes, alors qu'ils seraient inutiles si tu avais respecté cette consigne de base en SIG
Le code de ta requête serait alors beaucoup plus lisible
Sylvain M.
Hors ligne
#10 Fri 19 November 2021 09:52
- Sylvain M.
- Participant assidu
- Lieu: Saint-Pierre-des-Nids (53)
- Date d'inscription: 8 Sep 2005
- Messages: 995
Re: QGIS/Atlas: compter des donnees par maille
Pour moi, cette requête donne bien le résultat souhaité :
Code:
SELECT d.nom_latin, m.FID, count(d.n_bd_dep) as nombre_donnees, m.geometry FROM "données actualisées 2021" d JOIN "maillles 5k Loire" m ON ST_Intersects(d.geometry, m.geometry) GROUP BY d.nom_latin, m.FID, m.geometry
(pour plus de rapidité dans son exécution, penser à créer un index spatial sur la couche avant : "propriété de la couche > onglet source > Créer un index spatial")
Dernière modification par Sylvain M. (Fri 19 November 2021 09:55)
Sylvain M.
Hors ligne
#11 Fri 19 November 2021 11:35
- Loup
- Juste Inscrit !
- Date d'inscription: 16 Nov 2021
- Messages: 8
Re: QGIS/Atlas: compter des donnees par maille
Merci Sylvain de passer du temps pour tenter de m'aider ! :-)
J'ai testé ça (après avoir renommé mes couches "D" et "M") :
SELECT D.nom_latin,
M.FID,
count(d.n_bd_dep) as nombre_donnees,
M.geometry
FROM D
JOIN M ON ST_Intersects(D.geometry, M.geometry)
GROUP BY D.nom_latin,
M.FID,
M.geometry
Le résultat est presque bon, le nombre de données par espèce et par maille est bien affiché mais toujours le même problème avec les mailles vides :
Le minimum de chaque espèce est attribué au mailles vides au lieu de zéro. Par exemple : toutes les mailles sans donnée de A. affinis ont "8" en "nombre_donnees".
Hors ligne
#12 Fri 19 November 2021 11:56
- Loup
- Juste Inscrit !
- Date d'inscription: 16 Nov 2021
- Messages: 8
Re: QGIS/Atlas: compter des donnees par maille
Je crois que j'ai trouvé le problème !! :-D
Je n'avais pas retirer les données non localisées de la table attributaire !
Hors ligne
#13 Fri 19 November 2021 12:01
- Sylvain M.
- Participant assidu
- Lieu: Saint-Pierre-des-Nids (53)
- Date d'inscription: 8 Sep 2005
- Messages: 995
Re: QGIS/Atlas: compter des donnees par maille
En effet : bizarre un SHP avec des géométries nulles : ce n'est pas très propre...
Cette requête corrige le problème :
Code:
SELECT d.nom_latin, m.FID, count(d.n_bd_dep) as nombre_donnees, m.geometry FROM "données actualisées 2021" d JOIN "maillles 5k Loire" m ON ST_Intersects(d.geometry, m.geometry) WHERE d.geometry is not null GROUP BY d.nom_latin, m.FID, m.geometry;
WHERE d.geometry is not null
Sylvain M.
Hors ligne
#14 Fri 19 November 2021 12:53
- Loup
- Juste Inscrit !
- Date d'inscription: 16 Nov 2021
- Messages: 8
Re: QGIS/Atlas: compter des donnees par maille
Tout fonctionne, merci !
Hors ligne
#15 Fri 19 November 2021 13:07
- Sylvain M.
- Participant assidu
- Lieu: Saint-Pierre-des-Nids (53)
- Date d'inscription: 8 Sep 2005
- Messages: 995
Re: QGIS/Atlas: compter des donnees par maille
Par contre, vous devriez retirer le lien vers le fichier de données : ce sont des données nominatives des observateurs, et aussi avec potentiellement des espèces sensibles : ce fichier ne devrait pas être partagé tel quel.
Sylvain M.
Hors ligne