Jointures spatiales: utilisation de la fonction st_intersects

Résolu/Fermé
ampira - Modifié le 11 nov. 2020 à 11:51
 ampira - 13 nov. 2020 à 19:10
Bonjour,
je veux faire ressortir toutes les couches intersectent un polygone, mon code tourne à l'infini,

select d.nom_dep, d.geom, pp.geom, pf.geom, pm.geom
from departments d, champs_petroliers_surfaciques pp, permis_forestiers2020 pf,
permis_miniers_surfaciques pm
where st_intersects(d.geom,pp.geom)=true
OR st_intersects(d.geom,pf.geom)=true
or st_intersects(d.geom,pm.geom)=true

and d.nom_dep='LEKOKO'


j'utilise le module spatial de postgis


Configuration: Windows / Chrome 86.0.4240.193

4 réponses

Chris 94
Messages postés
50788
Date d'inscription
mardi 8 janvier 2008
Statut
Modérateur
Dernière intervention
30 janvier 2021
7 612
11 nov. 2020 à 11:51
0
Bonjour,
je veux savoir
Si j'utilise correctement la fonction st_intersects
et pourquoi la requête tourne sans s'arrêter ni renvoyer de résultats.

Merci d'avance
0
Reivax962
Messages postés
3671
Date d'inscription
jeudi 16 juin 2005
Statut
Membre
Dernière intervention
11 février 2021
1 006
Modifié le 13 nov. 2020 à 11:14
Bonjour,

Je ne connais pas ces fonctions géométriques, mais déjà la construction de ta requête n'est pas bonne, car tu joins ensemble pp, pf et pm, ce qui les combine alors que tu voudrais plutôt en additionner les résultats. Ça peut expliquer ton problème : cela fait exploser le nombre de résultats et le nombre de calculs, d'autant plus que j'imagine ces fonctions assez gourmandes.

Utilise plutôt des UNION pour ajouter les résultats :
SELECT d.nom_dep, d.geom, pp.geom, 'pp' as type_surface
FROM departments d, champs_petroliers_surfaciques pp
WHERE st_intersects(d.geom, pp.geom)=true AND d.nom_dep='LEKOKO'
UNION ALL
SELECT d.nom_dep, d.geom, pf.geom, 'pf'
FROM departments d, permis_forestiers2020 pf
WHERE st_intersects(d.geom, pf.geom)=true AND d.nom_dep='LEKOKO'
UNION ALL
SELECT d.nom_dep, d.geom, pm.geom, 'pm'
FROM departments d, permis_miniers_surfaciques pm
WHERE st_intersects(d.geom, pm.geom)=true AND d.nom_dep='LEKOKO'


Et pour faire tes tests, tu peux isoler une seule de ces requêtes.

Xavier
0
Bonjour Xavier,
merci pour ton aide, le code me renvoie le résultat attendu.
0