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

Printemps des cartes 2024

#1 Wed 12 August 2009 19:57

MathieuB
Membre du bureau
Lieu: Montpellier
Date d'inscription: 18 Jan 2006
Messages: 1220
Site web

intersection entre 3 tables : comportement incomprensible

Bonsoir,

peut-être est-ce dû à la fatigue mais je cale sur une requête d'intersection dont je ne m'explique pas le résultat :

je souhaite compter le nombre de ZNIEFF qui sont en Lozère mais qui ne sont pas sur le territoire du Parc National des Cévennes.
J'utilise pour cela 3 tables : version_perimetre_znieff_gen_2, perimetre et departement
et une requête d'intersection :

Code:

select count(distinct znieff_gen_2_id_znieff)
from version_perimetre_znieff_gen_2
JOIN departement ON st_intersects(departement.geometrie, version_perimetre_znieff_gen_2.geometrie)
JOIN perimetre ON st_intersects(perimetre.geometrie, version_perimetre_znieff_gen_2.geometrie) is false
WHERE departement.num_insee='48' AND type_perimetre like '%pnc%'

Le résultat de cette requête est 126 et est faux

En effet, j'ai 151 ZNIEFF en LOZERE :

Code:

select count(distinct znieff_gen_2_id_znieff)
from version_perimetre_znieff_gen_2
JOIN departement ON st_intersects(departement.geometrie, version_perimetre_znieff_gen_2.geometrie)
where departement.num_insee='48'

Et 80 ZNIEFF en Lozère qui sont sur le territoire du parc :

Code:

select count(distinct znieff_gen_2_id_znieff)
from version_perimetre_znieff_gen_2
JOIN departement ON st_intersects(departement.geometrie, version_perimetre_znieff_gen_2.geometrie)
JOIN perimetre ON st_intersects(perimetre.geometrie, version_perimetre_znieff_gen_2.geometrie)
where departement.num_insee='48' AND type_perimetre like '%pnc%'

Le résultat que j'attends de ma première requête est 71 (80+71=151).

Or la seule syntaxe qui me permette d'avoir ce bon résultat utilise une sous requete  :

Code:

select count(distinct znieff_gen_2_id_znieff)
from version_perimetre_znieff_gen_2
JOIN departement ON st_intersects(departement.geometrie, version_perimetre_znieff_gen_2.geometrie)
where departement.num_insee='48'
AND znieff_gen_2_id_znieff 
NOT IN (
select znieff_gen_2_id_znieff
from version_perimetre_znieff_gen_2
JOIN perimetre ON st_intersects(perimetre.geometrie, version_perimetre_znieff_gen_2.geometrie)
where type_perimetre like '%pnc%')

Comprenez vous ce comportement ? je décortique le problème depuis 2 bonnes heures mais je ne vois pas le début d'une explication.

Merci d'avance,

Mathieu Bossaert

Dernière modification par Mathieu BOSSAERT (Fri 14 August 2009 11:46)


Mathieu BOSSAERT
Association GeoRezo

Hors ligne

 

#2 Fri 14 August 2009 10:56

MathieuB
Membre du bureau
Lieu: Montpellier
Date d'inscription: 18 Jan 2006
Messages: 1220
Site web

Re: intersection entre 3 tables : comportement incomprensible

Bonjour,

j'ai compris l'origine du problème :

j'ai deux objets de type 'pnc' : la zone centrale et la zone périphérique.

Considérons une znieff complétement incluse dans la zone centrale, lors de la requête, l'intersection avec la zone périphérique sera fausse et la znieff sera comptée.

Mon résultat (126) contenait donc toutes les ZNIEFF de Lozère (151) sauf celles qui sont à la fois sur la zone centrale et sur la zone périphérique du Parc (25).

La solution est de travailler avec l'union des objets de même type dans ma table perimetre :

Code:

select count( znieff_gen_2_id_znieff)
from version_perimetre_znieff_gen_2
JOIN departement ON st_intersects(departement.geometrie, version_perimetre_znieff_gen_2.geometrie)
JOIN (select st_union(geometrie) as geometrie FROM perimetre where type_perimetre like '%pnc%' ) perimetre ON st_intersects(perimetre.geometrie, version_perimetre_znieff_gen_2.geometrie) is false
WHERE departement.num_insee='48'

Le "count( distinct )" n'aidait pas à y voir claire et mes neurones manquent un peu de peps en ce moment...
L'affichage des znieff résultant de la requête m'a bien aidait à comprendre le soucis!

Dernière modification par Mathieu BOSSAERT (Fri 14 August 2009 12:06)


Fichier(s) joint(s) :
Pour accéder aux fichiers vous devez vous inscrire.

Mathieu BOSSAERT
Association GeoRezo

Hors ligne

 

Pied de page des forums

Powered by FluxBB