Message posté par : yaks48
----------------------------------------
Bonjour Mathieu,
Merci beaucoup pour votre réponse.
Je vais essayer votre solution et voir ce que ça donne.
pour l'instant j'ai construit ce code (t1 correspond en fait au rpg) :
-----------------
Code :
create table mes_resultats_temporaires as
select mes_parcelles.geom, mes_parcelles.numero,
CASE WHEN st_area(st_intersection(mes_parcelles.geom, rpg.geom)) >
0.05*st_area(mes_parcelles.geom)
THEN rpg.libelle
WHEN st_area(st_intersection(mes_parcelles.geom,rpg.geom)) between 0 and
0.05*st_area(mes_parcelles.geom)
THEN 'ns'
ELSE NULL
END as r_rpg,
row_number() OVER () as champ_uni
from mes_parcelles
left join rpg on st_intersects(mes_parcelles.geom, rpg.geom)
group by mes_parcelles.geom, mes_parcelles.numero, r_rpg
;
create table resultat_final as
select mes_resultats_temporaires.geom, mes_resultats_temporaires.numero,
mes_resultats_temporaires.r_rpg
CASE WHEN sum(st_area(st_intersection(mes_resultats_temporaires.geom, znieff.geom))) >
0.05*st_area(mes_resultats_temporaires.geom)
THEN 1 ELSE 0 END as r_znieff,
CASE WHEN sum(st_area(st_intersection(mes_resultats_temporaires.geom, n2000.geom))) >
0.05*st_area(mes_resultats_temporaires.geom)
THEN 1 ELSE 0 END as r_n2000,
row_number() OVER () as champ_uni
from mes_resultats_temporaires
left join znieff on st_intersects(mes_resultats_temporaires.geom, znieff.geom)
left join n2000 on st_intersects(mes_resultats_temporaires.geom, n2000.geom)
group by mes_resultats_temporaires.geom, mes_resultats_temporaires.numero, r_znieff,
r_n2000
-----------------
je l'ai fait en deux fois car si je fais tout en une fois, il m'est arrivé
d'avoir une parcelle qui avait 0 en znieff par exemple et la même parcelle qui avait 1
en znieff : une autre ligne a été créée car j'intersecte 2 entités de la table rpg. et
du coup j'ai l'impression que postgre a sommé les surfaces deux fois, ce qui
m'a fait dépasser les 5 % de la surface de ma parcelle analysée.
Et derrière, je cherche à éliminer les doublons sur tous les champs, sauf mon champ rpg :
je veux éliminer les lignes contenant 'ns' au rpg, que si elles existent et que le
reste est identique par ailleurs.
j'ai essayé cela mais je ne suis pas sûr ...
-----------------
Code :
delete from resultat_final
where champ_uni in(
select champ_uni
from (
select *, row_number() over (partition by numero, r_znieff as rn
from resultat_final ) x
where (x.rn > 1 and rpg='ns') )
-----------------
est-ce plus clair ?
merci beaucoup pour votre aide, je vais essayer votre méthode.
bien à vous
----------------------------------------
Le message est situé
https://georezo.net/forum/viewtopic.php?pid=356931#p356931
Pour y répondre : qgis_fr(a)ml.georezo.net ou reply de votre messagerie
Pour vous désabonner connectez-vous sur le forum puis Profil / Abonnement
--
Association GeoRezo - le portail géomatique
https://georezo.net