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 08 November 2022 17:04

yaks48
Participant occasionnel
Date d'inscription: 3 Nov 2022
Messages: 17

QGIS/SQL: Probl avec la fonction GROUP BY

Bonjour,
je dois faire des jointures spatiales entre mes parcelles à analyser d'une part et une base de données de différents zonages d'autre part.
le but est de renvoyer une couche des parcelles analysées avec des champs créés pour chacune des couches de la base de données. voici un extrait de code

Code:

select
parcelles.geom,
CASE WHEN sum(st_area(st_intersection(parcelles.geom, apb.geom)))>0.05*st_area(parcelles.geom) THEN 1 ELSE 0 END as r_apb,
CASE WHEN sum(st_area(st_intersection(parcelles.geom, apg.geom)))>0.05*st_area(parcelles.geom) THEN 1 ELSE 0 END as r_apg,
rpg_ilots.libelle_gr as cult,
row_number() OVER () as champ_uni

from parcelles

left join apb on st_intersects(parcelles.geom, apb.geom)
left join apg on st_intersects(parcelles.geom, apg.geom)
left join rpg_ilots on st_intersects(parcelles.geom, rpg_ilots.geom)

group by parcelles.geom

j'ai le message d'erreur : "la colonne « rpg_ilots.libelle_gr » doit apparaître dans la clause GROUP BY ou doit être utilisé dans une fonction d'agrégat"

dans ce code je souhaite faire la jointure entre mes parcelles et par exemple la table "apb" : il faut que la somme des surfaces d'intersection entre les polygones apb et chacune des parcelles soit inférieure à 5 % de la surface de la parcelle.

il faut que le libellé de culture du rpg se retrouve pour chaque parcelle analysée.

chaque entité de la couche "parcelles" à analyser doit donc au final avoir 3 champs supplémentaires : r_apb (qui vaut 0 ou 1), r_apg (qui vaut 0 ou 1), et (cult qui est du texte).

Auriez-vous une solution ?

Merci infiniment pour le temps passé sur cette question smile

Hors ligne

 

#2 Wed 09 November 2022 10:18

yaks48
Participant occasionnel
Date d'inscription: 3 Nov 2022
Messages: 17

Re: QGIS/SQL: Probl avec la fonction GROUP BY

[EDIT]
J'ai trouvé une partie de la solution qui a amené une autre question.
L'ensemble des champs créés doivent être dans le "group by" - je ne comprends pas pourquoi car je voulais grouper seulement selon la géométrie de mes parcelles à analyser.

en regroupant, les différentes bases de données étant pas hyper bien calées, je me retrouve avec des parcelles qui interceptent des ilots différents de ma table rpg_ilots

j'ai donc introduit une expression

Code:

CASE WHEN st_area(st_intersection(parcelles.geom,rpg_ilots.geom)) > 0.05*st_area(parcelles.geom)
    THEN rpg_ilots.libelle_gr ELSE NULL END as cult

dans l'idéal, je voudrais qu'il ne crée pas une nouvelle ligne avec un attribut "null"
je voudrais que si l'intersection est > à 5 % de la surface de la parcelle, qu'il ne l'affiche pas.

Hors ligne

 

#3 Wed 09 November 2022 11:38

ppluvinet
Participant assidu
Lieu: VALENCE
Date d'inscription: 6 Aug 2007
Messages: 617

Re: QGIS/SQL: Probl avec la fonction GROUP BY

Bonjour,
est-ce qu'un HAVING ne premettrait pas de ne pas renvoyer les NULL ?

Code:

GROUP BY parcelles.geom, rpg_ilots.libelle_gr
HAVING sum(st_area(st_intersection(parcelles.geom, apb.geom)))>0.05*st_area(parcelles.geom)

Bonne continuation


Pascal PLUVINET

Hors ligne

 

#4 Wed 09 November 2022 13:28

yaks48
Participant occasionnel
Date d'inscription: 3 Nov 2022
Messages: 17

Re: QGIS/SQL: Probl avec la fonction GROUP BY

Bonjour,

Merci beaucoup pour votre aide.

ayant plusieurs jeux de données j'ai mis un "OR" entre les deux pour la clause HAVING.

Code:

HAVING sum(st_area(st_intersection(parcelles.geom, rpg_ilots_2008.geom)))>0.05*st_area(parcelles.geom) or sum(st_area(st_intersection(parcelles.geom, rpg_ilots_2021.geom)))>0.05*st_area(parcelles.geom)

Avec cette clause HAVING est-ce que j'élimine aussi des entités qui n'intersecteraient pas le RPG mais qui intersecteraient autre chose ?
J'entends : si j'ai une intersection entre  parcelles et apb mais pas entre parcelles et rpg_ilots, alors cette ligne sera éliminée? 
Car je cherche à ne retourner qu'une seule entité avec un champ "apb" = 0 ou 1 ; "apg" = 0 ou 1 ; "cult" = le libellé du groupe culture ou NULL si pas intercepté.

Hors ligne

 

Pied de page des forums

Powered by FluxBB